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

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

Сообщение Anonymous »

В 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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