стекового фрейма?
Например выбрасывается исключение. Как он генерирует код так, чтобы вызвались деструкторы созданных объектов?
Пишете код, засовываете в godbolt.org, смотрите что именно сделал компилятор
Попробуйте почитать тут https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html#cxx-abi
у всех объектов есть деструкторы, они и вызываются
Дефолтные не вызываются.
а чем они так отличаются
Вполне себе вызываються
с чего это вдруг?) что-либо же создается, значит удаляется тоже
Умеет сравнивать RSP/RIP и точки вызова конструкторов
Нет там кода unwind, он в CRT/libunwind
В дефолтном вызываются деструкторы членов класса?
Ну он генерируеться на основе деструкторов подобьектов. Так что формально - вызывается. Будь то имплицитно или ехплицитно написанным
Речь о том, что компилятор не генерирует "пустой деструктор", а умеет определить, какие нужно вызвать
не вызываются тривиальные, а не дефолтные
Да, скорее всего речь об этом
Компилятор генерирует код функции и знает, какие объекты ему надо создать из кода программы. Поэтому при выходе из функции он также знает, какие объекты ему надо "удалить" - чьи деструкторы вызвать. Ну и конечно запоминает, какие конструкторы уже сработали, а какие ещё нет.
Но кстати, а у тебя есть вопросы, как компилятор разбирается с вызовом деструкторов в таком коде? void Foo() { Kek x; Lol y; if (...) { Kek x2; if (!Bar()) { return; // у кого позвать деструкторы вот тут? } } }
Время жизни заканчивается в }
Ну в этом примере у всех, но в общем случае не у всех же.
Обсуждают сегодня