Я делаю несколько экспериментов с подделкой ООП на C, и я наткнулся на головоломку. В C++ я предполагаю, что компилятор вставляет деструкторы в функцию epilogue после выполнения инструкции return
.«Fake» OOP in C - как бороться с деструкторами и поддельными функциональными эпилогами при возвращении
Заблуждение, что на C потребует, чтобы деструкторы были вызваны вручную в соответствующем порядке, но проблема в том, что возвращаемое значение может зависеть от некоторых из этих объектов, поэтому с одной стороны уничтожение не может произойти до оператора возврата, с другой стороны после операторов возврата никогда не достигаются. И проблема усложняется тем фактом, что могут быть несколько операторов возврата из разных блоков, которые требуют собственных поддельных эпилогов.
Итак, вопрос в том, как я могу с этим справиться? Это не должно быть приятно, так как это не похоже на то, что это может быть ...
Пока лучшее, что я мог придумать, было «кешировать» возвращаемое значение в момент его возвращения, do всю очистку и после всего, что просто возвращает кешированное значение, но мне интересно, может ли быть более эффективное решение, и на стороне примечания о том, насколько хорошо компилятор справится с этим, чтобы минимизировать возможные накладные расходы. Сорт:
T foo() {
T _retValue;
...
if (something) {
...
_retValue = someValue;
goto blockID_cleanup;
blockID_cleanup:
...
goto foo_cleanup; // goto parent block until function block
}
_retValue = somethingElse;
goto foo_cleanup;
foo_cleanup:
...
return _retValue;
}
Половина меня хочет знать * почему * вы пойдете на все эти неприятности, когда Бьярне уже сделал это за вас три десятилетия назад. –
Его невозможно выполнить перед возвратом, и это не то, что делает C++, сгенерированный код просто вызывает dtors перед возвратом, как любая нормальная функция. – paulm
@JohnZwinck - почему вы когда-нибудь научились испытывать трудности с поставкой штанов после того, как ваши родители сделали это за вас десять лет назад? ;) Что касается меня - мой интересующийся орган хочет знать. Это плохо? – 2014-09-28 10:32:27