MSVC: warning C4714
От: rus blood Россия  
Дата: 09.03.13 16:23
Оценка:
Добрый день.

Как известно, компилятор не может за-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, мы получаем в нагрузку определенный и не маленький оверхед.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.