Добрый день.
Как известно, компилятор не может за-inline-ить функцию в некоторых случаях.
В частности, MSVC выдает warning C4714 в случае, если функция возвращает объект класса с деструктором, и выполняется сборка с /EHa,/EHs.
// EHa
struct A
{
A() { }
~A() { MessageBox(0, "Hello, World!", 0, 0); }
};
__forceinline A GetA()
{ return A(); } // warning C4714
int main(int /*argc*/, char* /*argv*/[])
{
{
auto a = GetA();
}
return 0;
}
Компилятор вставит в main вызов функции для "построения объекта a", которая ничего, кроме инициализации и деинициализации кода для раскрутки пустого стека, не делает.
Из-за этого, всякие конструкции типа
ScopeGuard и SCOPE_EXIT Александреску не инлайнятся.
Мне кажется странным, что для построения guard-объекта вызывается функция, часто пустая, которая сама может бросить исключение.
Т.е., указывая компилятору некую функциональность, которую надо вызвать на выходе из scope, мы получаем в нагрузку определенный и не маленький оверхед.