Оптимизация компилятора возвращаемого значения в VS 2010

Используя VS 2010 с полной оптимизацией /Ox рассмотрим следующие два вызова функций:

static string test1(const string& input)
{
    return input;
}

static void test2(const string& input, string& output)
{
    output = input;
}

Если я использую последний test2, то функция всегда оптимизируется, а код встроен. Однако test1 не встроен, если я не отключаю исключения. Кто-нибудь знает почему это?

Кроме того, я ожидаю, что компилятор сможет выполнять такую ​​же эффективную работу в test1, как и test2, если он использует оптимизацию возвращаемого значения, но, похоже, этого не делает. Это также озадачивает меня.

Причина, по которой я хочу использовать первую сигнатуру функции, заключается в том, что у меня есть две компилируемые версии функции. Я хочу, чтобы вызывающий код всегда вызывал test1, и когда установлен определенный флаг компиляции, я хочу, чтобы он добавлял входные данные в копию и возвращал его, когда флаг компиляции не установлен, я хочу, чтобы он был как можно ближе к значению no -оп как можно.

2 ответа

Решение

Visual Studio не может встроить функции, которые возвращают объекты с нетривиальными деструкторами:

В некоторых случаях компилятор не встроит определенную функцию по механическим причинам. Например, компилятор не будет встроенным:
  • Функция, если она приведет к смешению как SEH, так и C++ EH.
  • Некоторые функции с копируемыми объектами передаются по значению, когда -GX/EHs/EHa включен.
  • Функции, возвращающие раскручиваемый объект по значению, когда -GX/EHs/EHa включен.
  • Функции со встроенной сборкой при компиляции без -Og/Ox/O1/O2.
  • Функции с переменным списком аргументов.
  • Функция с оператором try (обработка исключений C++).

http://msdn.microsoft.com/en-us/library/a98sb923.aspx

Стандарт явно запрещает компилятору использовать оптимизацию возвращаемого значения, когда возвращаемое значение является параметром функции (12.8/31):

Такое исключение операций копирования / перемещения, называемое разрешением копирования, допускается при следующих обстоятельствах (которые могут быть объединены для устранения нескольких копий):

- в операторе возврата в функции с типом возврата класса, когда выражение является именем энергонезависимого автоматического объекта (кроме параметра функции или предложения catch) с тем же типом cv-unqualified, что и тип возврата функции операция копирования / перемещения может быть опущена путем создания автоматического объекта непосредственно в возвращаемое значение функции

-...

Другие вопросы по тегам