Есть ли какой-либо способ (расширения компилятора или другой способ) эмулировать оптимизацию именованного возвращаемого C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли какой-либо способ (расширения компилятора или другой способ) эмулировать оптимизацию именованного возвращаемого

Сообщение Anonymous »

В C++ именованная оптимизация возвращаемого значения (NRVO) означает, что следующий код может не вызывать конструктор перемещения MyContainer:
MyContainer f() {
MyContainer tmp = g();
tmp.push_back(h());
return tmp;
}

Компилятор может добиться этого, создав tmp в пространстве, указанном вызывающей стороной для возвращаемого значения. (ABI такой функции фактически эквивалентен тому, что f принимает указатель на буфер, в который она будет создавать MyContainer.)
Однако это — это необязательная оптимизация компилятора, что означает, что компилятор может не выполнять эту оптимизацию.
Есть ли способ заставить NRVO использовать какое-либо расширение компилятора или нестандартный код? Другими словами, я ищу код, который компилируется во что-то более или менее эквивалентное коду, оптимизированному для 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»