จะทราบได้อย่างไรว่าคอมไพเลอร์ตัวใดที่สร้างขึ้น?


11

ฉันรู้เกี่ยวกับฟังก์ชันที่คอมไพเลอร์สร้างขึ้น, กฎของสามและกฎห้า ในสถานการณ์โลกแห่งความจริงมันอาจไม่สำคัญที่จะเข้าใจว่าฟังก์ชั่นที่สร้างขึ้นโดยคอมไพเลอร์ (ผู้สร้างผู้ประกอบการที่ได้รับมอบหมายผู้ทำลายล้าง) ถูกสร้างขึ้นจริงโดยคอมไพเลอร์

มีวิธีใดบ้างในการแสดงรายการฟังก์ชันที่คอมไพเลอร์สร้างขึ้นสำหรับคลาสที่ระบุ?

ฉันสนใจ Visual Studio 2019 และ Xcode เป็นหลัก แต่โซลูชันทั่วไปน่ายินดียิ่งกว่าเดิม

คำตอบ:


11

กฎมีความซับซ้อน ผมจะขโมยจากคำตอบอื่นซึ่งคำพูดของตารางจากการนำเสนอของฮาวเวิร์ด Hinnant

ป้อนคำอธิบายรูปภาพที่นี่

คุณธรรมในที่นี้คือวิธีปฏิบัติที่ดีคือไม่ต้องพึ่งพาคอมไพเลอร์โดยปริยายประกาศและประกาศสมาชิกพิเศษทุกคนอย่างชัดเจน (เป็นค่าเริ่มต้นหรือถูกลบทั้งนี้ขึ้นอยู่กับความต้องการของคุณ)


ถ้าคุณประกาศสมาชิกพิเศษทุกคนอย่างชัดเจนคุณจะสูญเสียสถานะสมาชิก "ไม่ประกาศ" สำหรับผู้รับย้ายคอนสตรัคเตอร์และผู้ดำเนินการมอบหมาย
Maxim Egorushkin

@ MaximEgorushkin จุดของฉันคือการประกาศพวกเขาเป็นค่าเริ่มต้นหากคุณต้องการพวกเขา (แม้ว่าค่าเริ่มต้นยังสามารถหมายถึงไม่ได้ประกาศ) หรือถูกลบหากคุณไม่ต้องการพวกเขา
bolov

2
@bolov แผนภูมิมีประโยชน์ แต่นี่ไม่ตอบคำถามของฉัน ฉันต้องการค้นหาว่าฟังก์ชันใดที่คอมไพเลอร์สร้างขึ้นจริง ในคำอื่น ๆ : ฉันไม่ได้ถามเกี่ยวกับสิ่งที่ควรเกิดขึ้นในทางทฤษฎี แต่สิ่งที่เกิดขึ้นในทางปฏิบัติ
Helge Klein

1
@ tjwrona1992: โดยการโต้แย้งนั้นเราไม่จำเป็นต้องทดสอบโค้ดของเราเพราะเรารู้ว่าถ้าคอมไพเลอร์ทำอะไรที่แตกต่างไปจากที่เราตั้งใจจะต้องมีบั๊กอยู่
ruakh

1
@ tjwrona1992: ใช่แน่นอน ในทำนองเดียวกันจุดที่เห็นสิ่งที่คอมไพเลอร์ของคุณสร้างขึ้นนั้นไม่ใช่การตรวจสอบว่าคอมไพเลอร์นั้นถูกต้อง แต่เพื่อตรวจสอบว่าคุณได้ให้คอมไพเลอร์ด้วยอินพุตที่ถูกต้อง
ruakh

7

"มีวิธีใดบ้างในการแสดงรายการฟังก์ชันที่คอมไพเลอร์สร้างขึ้นสำหรับคลาสที่ระบุ"

แน่นอนว่ามี บนลินุกซ์ (และระบบ Unix อื่น ๆ ) คุณสามารถใช้nm, readelfและobjdumpบนวัตถุที่สร้างไฟล์ / ห้องสมุด / ปฏิบัติการเพื่อถอดพวกเขาและตรวจสอบการส่งออกสัญลักษณ์ใด ๆ (และอื่น ๆ อีกมากมาย)

ฉันรู้ว่ามีเครื่องมือที่คล้ายกันในWindowsแต่นั่นไม่ใช่แพลตฟอร์มที่ฉันทำงานด้วยดังนั้นฉันจึงไม่สามารถตั้งชื่อเครื่องมือที่แน่นอนได้


1
แม้ว่าเครื่องมือเหล่านี้อาจไม่แสดงให้คุณเห็นว่าฟังก์ชั่นใดบ้างที่อาจถูกสร้างขึ้น (เช่นคอมไพเลอร์ได้รับอนุญาตให้สร้าง แต่คุณไม่เคยใช้ฟังก์ชั่นเหล่านั้นดังนั้นจึงตัดสินใจไม่รบกวนหรือกำจัดรหัสเวลาลิงก์
JMAA

@JMAA ในกรณีส่วนใหญ่ "อนุญาตให้สร้าง แต่ไม่เคยใช้" ในข้อกำหนดมาตรฐานหมายความว่าฟังก์ชั่น "ประกาศโดยปริยาย" แต่ไม่ได้ "กำหนดโดยปริยาย" ใช่นี่หมายความว่าคุณจะไม่เห็นสัญลักษณ์แม้ว่าการปิดอินไลน์จะถูกปิดใช้งาน
aschepler

1
คำตอบนี้ตอบคำถามที่ถามอย่างแม่นยำมากขึ้นว่า: "วิธีใดที่คอมไพเลอร์สร้างขึ้น" นั่นไม่เหมือนกับคำถามที่แม่นยำน้อยกว่า "วิธีการใดที่อาจถูกสร้างโดยคอมไพเลอร์ในบริบทที่แตกต่างกัน?"
RICI

@rici True แต่คำถามที่แม่นยำกว่านั้นไม่สามารถตอบได้อย่างง่ายดายดังนั้นฉันจึงไปเพื่อสิ่งที่สามารถตอบได้ อย่าลังเลที่จะลงคะแนนถ้าคุณคิดว่าคำตอบของฉันไม่มีค่า
Jesper Juhl

1
@jesper: ไม่ฉันอัปเดตแล้ว ฉันคิดว่าคำถามที่คุณตอบมีความแม่นยำมากกว่าที่ฉันพูด คำถามอื่นซึ่งอาจเป็นความตั้งใจต้องการการทำด้วยมือบางอย่างเนื่องจากเป็นการคุมกำเนิด: เราไม่ทราบว่ามีบริบทสมมุติฐานที่อาจรวมอยู่ด้วย แต่นี่เป็นคำถามที่ถามตัวอักษรโดยเจตนาหรือไม่ดังนั้นความรุ่งโรจน์สำหรับการตอบมัน
rici

1

นี่เป็นเพียงคำตอบบางส่วนเท่านั้น

Visual Studio 2019

ก่อสร้าง

เมื่อกำหนดคลาสวัตถุฟังก์ชัน IntelliSense ของ Visual Studio จะแสดงตัวสร้างที่มีอยู่ทั้งคอมไพเลอร์ที่สร้างขึ้นและของคุณเอง:

ป้อนคำอธิบายรูปภาพที่นี่

ข้อมูลนี้ไม่ได้เกิดขึ้นเสมอไป เพื่อให้มันใช้งานได้สำหรับสกรีนช็อตข้างต้นฉันต้องพิมพ์บางอย่างในวงเล็บดังนั้นคอมม่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.