ฉันจะเดายาก:
C ++ constructor และ destructor ไม่ทำงานเลย: มันเป็นมาโคร พวกมันจะถูกแทรกเข้าไปในขอบเขตที่วัตถุถูกสร้างขึ้นและขอบเขตที่วัตถุถูกทำลาย ในทางกลับกันไม่มีคอนสตรัคเตอร์หรือตัวทำลายระบบวัตถุเพียงแค่เป็น
ที่จริงแล้วฉันคิดว่าฟังก์ชั่นอื่น ๆ ในชั้นเรียนไม่ใช่ฟังก์ชั่นใด ๆ แต่ฟังก์ชั่นอินไลน์ที่ไม่ได้รับการ inline เพราะคุณใช้ที่อยู่ของพวกเขา (คอมไพเลอร์ตระหนักว่าคุณลงบนมันและไม่ inline หรือ inline ปรับฟังก์ชั่นนั้นให้เหมาะสม) และในทางกลับกันฟังก์ชั่นดูเหมือนจะ "ยังอยู่ที่นั่น" แม้ว่ามันจะไม่เกิดขึ้นหากคุณไม่ได้ระบุที่อยู่
ตารางเสมือนของ "C ++" วัตถุ "ไม่เหมือนกับวัตถุ JavaScript ที่คุณสามารถรับ 'constructor และสร้างวัตถุจากมันที่รันไทม์ผ่านnew XMLHttpRequest.constructor
แต่ค่อนข้างชุดของตัวชี้ไปยังฟังก์ชั่นที่ไม่ระบุชื่อที่ทำหน้าที่เป็นวิธีการติดต่อกับวัตถุนี้ ยกเว้นความสามารถในการสร้างวัตถุ และมันก็ไม่สมเหตุสมผลเลยที่จะ "ลบ" วัตถุเพราะมันเหมือนการพยายามลบ struct คุณไม่สามารถ: มันเป็นแค่สแต็กเลเบลเพียงเขียนไปตามที่คุณโปรดใต้ป้ายกำกับอื่น: คุณมีอิสระที่จะ ใช้คลาสเป็นจำนวนเต็ม 4 ตัว:
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
ไม่มีหน่วยความจำรั่วไม่มีปัญหายกเว้นคุณเสียพื้นที่สแต็กจำนวนมากซึ่งสงวนไว้สำหรับการเชื่อมต่อวัตถุและสตริง แต่จะไม่ทำลายโปรแกรมของคุณ (ตราบใดที่คุณไม่พยายามใช้งาน เป็นสตริงอีกครั้ง)
ที่จริงแล้วถ้าสมมุติฐานก่อนหน้าของฉันถูกต้อง: ค่าใช้จ่ายทั้งหมดของสตริงนั้นเป็นเพียงค่าใช้จ่ายในการจัดเก็บ 32 ไบต์และพื้นที่สตริงคงที่: ฟังก์ชั่นจะใช้ในเวลารวบรวมเท่านั้น วัตถุถูกสร้างและใช้งาน (ราวกับว่าคุณกำลังทำงานกับ struct และอ้างถึงโดยตรงโดยไม่มีการเรียกใช้ฟังก์ชันใด ๆ ให้แน่ใจว่ามีการเรียกที่ซ้ำกันแทนการข้ามฟังก์ชัน แต่โดยปกติจะเร็วกว่าและใช้พื้นที่น้อยกว่า) ในสาระสำคัญเมื่อใดก็ตามที่คุณเรียกใช้ฟังก์ชันใด ๆ คอมไพเลอร์ก็แทนที่การเรียกนั้นด้วยคำแนะนำในการทำอย่างแท้จริงโดยมีข้อยกเว้นที่นักออกแบบภาษาได้ตั้งไว้
สรุป: วัตถุ C ++ ไม่รู้ว่ามันคืออะไร เครื่องมือทั้งหมดสำหรับการเชื่อมต่อกับพวกเขาจะ inline แบบคงที่และหายไปตอนรันไทม์ สิ่งนี้ทำให้การทำงานกับคลาสมีประสิทธิภาพเท่ากับการกรอกข้อมูลด้วยโครงสร้างและทำงานโดยตรงกับข้อมูลนั้นโดยไม่ต้องเรียกใช้ฟังก์ชั่นใด ๆ เลย
สิ่งนี้แตกต่างอย่างสิ้นเชิงจากวิธีการของ COM / ObjectiveC เช่นเดียวกับ javascript ซึ่งเก็บข้อมูลประเภทแบบไดนามิกในราคาของค่าใช้จ่ายรันไทม์, การจัดการหน่วยความจำ, การเรียกการก่อสร้างเนื่องจากคอมไพเลอร์ไม่สามารถทิ้งข้อมูลนี้ได้: จำเป็น สำหรับการจัดส่งแบบไดนามิก สิ่งนี้จะช่วยให้เราสามารถ "พูดคุย" กับโปรแกรมของเราที่รันไทม์และพัฒนาในขณะที่มันกำลังทำงานโดยมีองค์ประกอบที่สะท้อนได้