В 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
Есть ли какой-либо способ (расширения компилятора или другой способ) эмулировать оптимизацию именованного возвращаемого ⇐ C++
Программы на C++. Форум разработчиков
1729387141
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());
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79100318/is-there-any-way-compiler-extensions-or-otherwise-to-emulate-named-return-valu[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия