В C++ именованная оптимизация возвращаемого значения (NRVO) означает, что следующий код может не вызывать конструктор перемещения MyContainer:
MyContainer f() {
MyContainer tmp = g();
tmp.push_back(h());
return tmp;
}
Компилятор может добиться этого, создав tmp в пространстве, указанном вызывающей стороной для возвращаемого значения. (ABI такой функции фактически эквивалентен тому, что f принимает указатель на буфер, в который она будет создавать MyContainer.)
Однако это — это необязательная оптимизация компилятора, что означает, что компилятор может не выполнять эту оптимизацию.
Есть ли способ заставить NRVO использовать какое-либо расширение компилятора или нестандартный код? Меня не волнует, как будет выглядеть тело f, и меня устраивают расширения компилятора, поэтому приемлемо любое из двух фрагментов кода ниже:
MyContainer f() {
__attribute__((must_nrvo)) MyContainer tmp = g();
tmp.push_back(h());
return tmp;
}
MyContainer f() {
void* buf = __magic::get_return_address();
MyContainer* tmp = new(buf) MyContainer(g());
tmp->push_back(h());
__return_without_value;
}
Однако я не могу изменить сигнатуру функции, поэтому переписывать функцию следующим образом нельзя:
void f(void* buf) {
MyContainer* tmp = new(buf) MyContainer(g());
tmp->push_back(h());
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... eturn-valu
Есть ли какой-либо способ (расширения компилятора или другой способ) эмулировать оптимизацию именованного возвращаемого ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Вот как работает bts для данного кода, если не учитывать оптимизацию возвращаемого значения?
Anonymous » » в форуме C++ - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-