Поліпшення повернення значення

Поліпшення повернення значення (англ. return value optimization, RVO) чи просто ППЗ — це техніка оптимізації, яку застосовує компілятор, що серед іншого виключає створення тимчасового об'єкта для збереження значення, що вертається з функції.[1] В C++, вона особливо примітна тим, що дозволяє змінити поведінку отриманої програми.[2]

Підсумок

Загалом, стандарт С++ дозволяє компіляторам застосовувати будь-які оптимізації, допоки отриманий виконуваний файл поводиться так, наче всі вимоги стандарту було виконано. Цей підхід зазвичай згадується як правило "так наче" (англ. as-if rule).[3] Термін поліпшення повернення значення звертається до пункту в ISO/IEC 14882, який дозволяє реалізації опустити копіювання, що відбувається через інструкцію повернення, навіть якщо конструктор копіювання має побічні ефекти,[4], хоча це й не дозволяється самим правилом так наче.[3]

Наступний приклад показує хід дій, за якого реалізація може позбутись одного чи двох копіювань, навіть якщо конструктор копіювання має видимі побічні ефекти, приміром, роздрук тексту.[4] Перше копіювання якого можна уникнути - копіювання створеного екземпляру класу C() у значення, що поверне функція f. Друге - копіювання тимчасового об'єкта повернутого функцією f у obj.

#include <iostream>

struct C {
  C() {}
  C(const C&) { std::cout << "Відбулось копіювання.\n"; }
};

C f() {
  return C();
}

int main() {
  std::cout << "Здоровенькі були!\n";
  C obj = f();
}

Залежно від компілятора та його налаштувань, програма може вивести такий текст:

Здоровенькі були!
Відбулось копіювання.
Відбулось копіювання.
Здоровенькі були!
Відбулось копіювання.
Здоровенькі були!

Пояснення

При повернені вбудованого типу з функції додаткових операцій зазвичай не виконується, оскільки об'єкт передається через регістр. Вертання більших об'єктів (екземпляру деякого класу) може вимагати копіювання з однієї місцини в пам'яті до іншої. Для цього у стековому кадрі створюється прихований об'єкт, адреса якого передається у функцію. Значення що повертається з функції копіюється в цей об'єкт за наданою адресою.[5] Отже, для коду на кшталт:

struct Data { 
  char bytes[16]; 
};

Data f() {
  Data result = {};
  // утворення результату
  return result;
}

int main() {
  Data d = f();
}

компілятор згенерує таке:

struct Data { 
  char bytes[16]; 
};

Data * f(Data * _hiddenAddress) {
  Data result = {};
  // копіювання результату в прихований об'єкт
  *_hiddenAddress = result;
  return _hiddenAddress;
}

int main() {
  Data _hidden; // створити прихований об'єкт
  Data d = *f(&_hidden); // копіювати результат в d
}

Як бачимо, двічі виконується копіювання об'єкта Data.

На ранніх стадіях розвитку C++, нездатність мови ефективно повернути об'єкт класу з функції вважалась одним з її недоліків.[6] Близько 1991, Волтер Брайт винайшов спосіб зменшення кількості копіювань, використовуючи замість двох об'єктів (прихованого та локальної змінної функції f) один - у який зберігається результат:[7]

struct Data { 
  char bytes[16]; 
};

void f(Data *p) {
  // записуємо результат одразу в *p
}

int main() {
  Data d;
  f(&d);
}

Брайт реалізував своє поліпшення в компіляторі Zortech C++.[6] Цей особливий спосіб був з часом названий «Поліпшення повернення іменованого значення» (англ. named return value optimization), вказуючи на той факт, що копіювання іменованого об'єкта скасоване.[7]

Підтримка компіляторами

Поліпшення повернення значення підтримується більшістю компіляторів[1][8][9]. Однак можливі умови, коли компілятор не може виконати поліпшення. Найпоширенішим є приклад, коли функція повертає різні значення в залежності від шляху виконання програми: [8][10][5]

#include <string>
std::string f(bool cond = false) {
  std::string first("first");
  std::string second("second");
  // функція може повернути один із двох іменованих об'єктів
  // залежно від параметра. ППЗ не може бути застосоване
  return cond ? first : second;
}

int main() {
  std::string result = f();
}

Примітки

  1. а б Meyers, Scott (1996). More Effective C++. Addison Wesley.
  2. Alexandrescu, Andrei (1 лютого 2003). Move Constructors. Dr. Dobbs Journal. Архів оригіналу за 14 липня 2013. Процитовано 25 березня 2009.
  3. а б ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §1.9 Program execution [intro.execution] para. 1
  4. а б ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §12.8 Copying class objects [class.copy] para. 15
  5. а б Bulka, Dov; David Mayhew (2000). Efficient C++. Addison-Wesley. ISBN 0-201-37950-3.
  6. а б Lippman, Stan. The Name Return Value Optimization. Stan Lippman. Архів оригіналу за 14 липня 2013. Процитовано 23 березня 2009.
  7. а б Glossary D Programming Language 2.0. Digital Mars. Архів оригіналу за 14 липня 2013. Процитовано 23 березня 2009.
  8. а б Shoukry, Ayman B. Named Return Value Optimization in Visual C++ 2005. Microsoft. Архів оригіналу за 14 липня 2013. Процитовано 20 березня 2009.
  9. Options Controlling C++ Dialect. GCC. 17 березня 2001. Архів оригіналу за 14 липня 2013. Процитовано 20 березня 2009.
  10. Hinnant, Howard; et al. (10 вересня 2002). N1377: A Proposal to Add Move Semantics Support to the C++ Language. WG21. Архів оригіналу за 8 лютого 2007. Процитовано 25 березня 2009.

Read other articles:

Eric Benét Jordan (lahir 15 Oktober 1966) adalah seorang penyanyi R&B dari Amerika Serikat. Singel Spend My Life With You dari album keduanya A Day in the Life pernah menduduki peringkat pertama tangga lagu R&B Amerika dan dinominasikan untuk Penghargaan Grammy kategori Best R&B Performance by a Duo or Group pada tahun 2000. Pada Januari 2001, ia menikah dengan aktris Halle Berry (walaupun akhirnya bercerai pada tahun 2003) dan pada tahun yang sama memerankan debut film pertamany...

 

تشيزاري لوفاتي   معلومات شخصية الميلاد 25 ديسمبر 1891(1891-12-25)بوينس آيرس  الوفاة 22 يوليو 1961 (عن عمر ناهز 69 عاماً)فَرِيزة  الطول 1.71 م (5 قدم 7 1⁄2 بوصة) مركز اللعب وسط الجنسية الأرجنتين إيطاليا (18 يونيو 1946–22 يوليو 1961) مملكة إيطاليا (25 ديسمبر 1891–18 يونيو 1946)  ا�...

 

Запрос «Москворецкий мост» перенаправляется сюда; см. также другие значения. Большой Москворецкий мост Большой Москворецкий мост в 2011 году 55°44′57″ с. ш. 37°37′28″ в. д.HGЯO Область применения автомобильный, пешеходный Пересекает Москва (река) Место располо...

منطقة التبت ذاتية الحكم   الاسم الرسمي (بالصينية: 西藏自治区)‏(بالتبتية: བོད་རང་སྐྱོང་ལྗོངས།)‏    الإحداثيات 31°42′20″N 86°56′25″E / 31.705556°N 86.940278°E / 31.705556; 86.940278  [1] تاريخ التأسيس 1965  تقسيم إداري  البلد الصين[2][3]  التقسيم الأعلى ...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Denmark–Sweden football rivalry – news · newspapers · books · scholar · JSTOR (January 2020) (Learn how and when to remove this template message) Football rivalry between the national football teams Denmark and Sweden Denmark–Sweden football rivalrySweden f...

 

Dakota UtaraNegara bagian BenderaPeta Amerika Serikat dengan ditandaiNegaraAmerika SerikatSebelum menjadi negara bagianDakota TerritoryBergabung ke SerikatNovember 2, 1889 (39th)Kota terbesarFargoPemerintahan • GubernurDoug Burgum (R) • Wakil GubernurDrew Wrigley (R)LegislatifLegislative Assembly • Majelis tinggiSenate • Majelis rendahDPRSenator ASJohn Hoeven (R)Kevin Cramer (R)Delegasi DPR ASRick Berg (R) (daftar)Populasi • Total(2....

Груз-кормушка Кормушка (англ. feeder) — рыболовное приспособление, для приманивания рыбы к крючкам с наживкой или привлечения к месту ловли. Кормушки крепятся к леске при помощи различных видов оснастки (монтажа), на которых имеются один или несколько крючков для ловли...

 

High school in Norfolk, Virginia, United StatesLake Taylor High SchoolAddress1384 Kempsville RoadNorfolk, Virginia 23502United StatesInformationSchool typePublic, high schoolFounded1967School districtNorfolk City Public SchoolsSuperintendentSharon ByrdsongPrincipalLatesha N. Wade-JenkinsTeaching staff79.52 (FTE) (2021–22)[1]Grades9–12Enrollment1,012 (2021–22)[1]Student to teacher ratio12.73 (2021–22)[1]LanguageEnglishCampusSuburbanColor(s)Red and Black   &...

 

Anti-diabetic drug AlogliptinClinical dataTrade namesNesina, VipidiaKazano, Vipidomet (with metformin)Oseni, Incresync (with pioglitazone)Other namesSYR-322AHFS/Drugs.comMonographMedlinePlusa613026License data EU EMA: by INN US DailyMed: Alogliptin Pregnancycategory AU: B3 Routes ofadministrationBy mouthATC codeA10BH04 (WHO) Legal statusLegal status AU: S4 (Prescription only) US: ℞-only EU: Rx-only In general: ℞ (Prescription onl...

2020年夏季奥林匹克运动会奥地利代表團奥地利国旗IOC編碼AUTNOC奧地利奧林匹克委員會網站www.olympia.at(德文)2020年夏季奥林匹克运动会(東京)2021年7月23日至8月8日(受2019冠状病毒病疫情影响推迟,但仍保留原定名称)運動員75參賽項目21个大项旗手开幕式:托马斯·扎亚克(英语:Thomas Zajac)和塔尼娅·弗兰克(帆船)[1]闭幕式:安德烈亚斯·米勒(自行车)[2]...

 

Istana Budaya Istana Budaya didirikan pada bulan September 1999, adalah tempat utama di Malaysia untuk semua jenis teater, termasuk teater musikal, operet, konser klasik dan opera dari pertunjukan lokal dan internasional. Gedung ini terletak di sebelah Galeri Seni Nasional di Jalan Tun Razak di jantung Kuala Lumpur. Pranala luar Wikimedia Commons memiliki media mengenai Istana Budaya. Istana Budaya Official website The history of Istana Budaya Diarsipkan 2007-09-28 di Wayback Machine. Malaysi...

 

坐标:43°11′38″N 71°34′21″W / 43.1938516°N 71.5723953°W / 43.1938516; -71.5723953 此條目需要补充更多来源。 (2017年5月21日)请协助補充多方面可靠来源以改善这篇条目,无法查证的内容可能會因為异议提出而被移除。致使用者:请搜索一下条目的标题(来源搜索:新罕布什尔州 — 网页、新闻、书籍、学术、图像),以检查网络上是否存在该主题的更多可靠来源...

Северный морской котик Самец Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:Синапси...

 

English serial killer (1837–1896) Amelia HobleyDyer upon entry to Wells Asylum in Horrington, 1893BornAmelia Elizabeth Hobley1837Pyle Marsh, Bristol, England, UKDied10 June 1896 (aged 58/59)Newgate Prison, London, England, UKCause of deathExecution by hangingOther namesThe Ogress of Reading, The Reading Baby Farmer, Mrs. ThomasSpouses George Thomas William Dyer ChildrenEllen Thomas, Mary Ann Polly Dyer, William Samuel DyerMotiveFinancial gainCriminal penaltyDeathDetailsVictims6 co...

 

يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (نوفمبر 2019) كأس الكؤوس الإفريقية 1979 تفاصيل الموسم كأس الكؤوس الإفريقية  النسخة 5  المنظم الاتحاد الإفريقي لكرة �...

Uprising against Roman rule of Britain (367-368) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Great Conspiracy – news · newspapers · books · scholar · JSTOR (September 2009) (Learn how and when to remove this message) The Great ConspiracyPart of the Roman occupation of BritainNorthern Roman Britain, c. 35...

 

ICJ Court Case Case Concerning Avena and Other Mexican Nationals (Mexico v. United States of America)CourtInternational Court of JusticeDecided31 March 2004 (2004-03-31)CitationsJudgment, I.C.J. Reports 2004, 12 General List No. 128Court membershipJudges sittingShi Jiuyong (President)Raymond Ranjeva (Vice-President)Gilbert GuillaumeAbdul KoromaVladlen VereschetinRosalyn HigginsGonzalo Parra ArangurenPieter KooijmansFrancisco RezekAwn Al-KhasawnehThomas BuergenthalNabil ElarabyH...

 

The earth pyramids of Ritten The earth pyramids of Ritten (German: Erdpyramiden am Ritten; Italian: Piramidi di terra del Renon [piˈraːmidi di ˈtɛrra del reˈnon]) are a natural monument that is located on the Ritten, a plateau not far from Bolzano in northern Italy. Earth pyramids are a fairly widespread phenomenon that exist in various locations, such as South Tyrol and Platten. The original name in this area for these earth pyramids is Lahntürme, i.e., landslide towers.[1&...

В Википедии есть статьи о других людях с такой фамилией, см. Мякотин. Венедикт Александрович Мякотин Дата рождения 12 (24) марта 1867(1867-03-24) Место рождения Гатчина, Царскосельский уезд, Санкт-Петербургская губерния, Российская империя Дата смерти 5 октября 1937(1937-10-05)[1]...

 

Mihika VarmaLahir3 Januari 1985 (umur 39)Mumbai, IndiaKebangsaanIndianPekerjaanaktrismodelTahun aktif2004–2016Karya terkenalYeh Hai MohabbateinSuami/istriAnand KapaiAnak1KerabatMishkat Varma (saudara laki-laki) Mihika Varma (lahir 3 Januari 1985) adalah seorang aktris televisi India dan mantan model yang dikenal karena perannya sebagai Mihika Khanna di Yeh Hai Mohabbatein. Dia memenangkan gelar Miss India International pada tahun 2004 dan mewakili India dalam kompetisi Miss Inter...