Я сделаю дикое предположение:
Конструктор и деструктор C ++ вовсе не являются функциями: они являются макросами. Они встраиваются в область, в которой создается объект, и область, в которой объект уничтожается. В свою очередь, нет ни конструктора, ни деструктора, объект просто есть.
На самом деле, я думаю, что другие функции в классе также не являются функциями, а являются встроенными функциями, которые НЕ ДОЛЖНЫ быть встроенными, потому что вы берете их адрес (компилятор понимает, что вы на нем, и не вставляет или не вставляет код в функцию и оптимизирует эту функцию), и, в свою очередь, функция, кажется, «все еще там», хотя этого не произойдет, если вы не укажете ее адрес.
Виртуальная таблица «объекта» 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, которые динамически сохраняют информацию о типе за счет накладных расходов времени выполнения, управления памятью, вызовов конструкций, поскольку компилятор не может выбросить эту информацию: это необходимо для динамической отправки. Это, в свою очередь, дает нам возможность «разговаривать» с нашей программой во время выполнения и разрабатывать ее во время работы, используя отражаемые компоненты.