Оптимизация компилятора возвращаемого значения в 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++).
Стандарт явно запрещает компилятору использовать оптимизацию возвращаемого значения, когда возвращаемое значение является параметром функции (12.8/31):
Такое исключение операций копирования / перемещения, называемое разрешением копирования, допускается при следующих обстоятельствах (которые могут быть объединены для устранения нескольких копий):
- в операторе возврата в функции с типом возврата класса, когда выражение является именем энергонезависимого автоматического объекта (кроме параметра функции или предложения catch) с тем же типом cv-unqualified, что и тип возврата функции операция копирования / перемещения может быть опущена путем создания автоматического объекта непосредственно в возвращаемое значение функции
-...