Я зроблю дику здогадку:
C ++ конструктор і деструктор - це зовсім не функції: вони макроси. Вони вкладаються в область, де створюється об'єкт, і в область, де об'єкт знищується. У свою чергу, немає ні конструктора, ні деструктора, об’єкт просто Є.
Насправді, я думаю, що інші функції в класі також не є функціями, а вбудованими функціями, які DONT не вводиться, тому що ви приймаєте їх адресу (компілятор розуміє, що ви на нього, і не вбудовує і не вводить код у функцію, і оптимізує цю функцію), і, в свою чергу, функція, здається, "все ще є", хоча це не було б, якби ви не взяли її до адреси.
Віртуальна таблиця «об’єкта» C ++ не схожа на об’єкт JavaScript, де ви можете отримати його конструктор і створити з нього об’єкти під час виконання через new XMLHttpRequest.constructor, а скоріше набір покажчиків на анонімні функції, які виступають засобом для взаємодії з цим об’єктом , виключаючи можливість створення об'єкта. І навіть не має сенсу "видаляти" об'єкт, тому що це як спроба видалити структуру, ви не можете: це просто мітка стека, просто напишіть їй, як вам подобається під іншою міткою: ви вільні використовувати клас як 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 байтів і постійний простір рядків: функції використовуються лише під час компіляції, а також можуть бути вбудованими та відкинутими після об'єкт створюється і використовується (як би ви працювали з структурою і посилалися на неї безпосередньо безпосередньо без будь-яких викликів функцій, переконайтеся, що замість функції стрибки дублюються, але це зазвичай швидше і витрачається менше місця). По суті, кожен раз, коли ви викликаєте будь-яку функцію, компілятор просто замінює цей виклик інструкціями, щоб буквально це зробити, за винятком, які встановили дизайнери мови.
Короткий зміст: об'єкти C ++ поняття не мають, що вони є; всі інструменти для взаємодії з ними розміщені статично і втрачаються під час виконання. Це робить роботу з класами настільки ж ефективною, як заповнення структур даними та безпосередньо робота з цими даними, без виклику жодних функцій (ці функції впорядковані).
Це абсолютно відрізняється від підходів COM / ObjectiveC, а також javascript, який динамічно зберігає інформацію про тип, за рахунок витрат на накладні витрати, управління пам'яттю, виклики конструкцій, оскільки компілятор не може викинути цю інформацію: це необхідно для динамічної відправки. Це, в свою чергу, дає нам можливість "говорити" з нашою програмою під час виконання програми та розвивати її під час її роботи, маючи відбивні компоненти.