LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

std::string lvalue = // ...
pass_by_value(lvalue);      // 1 копия 
pass_by_value("temporary"); // 1 копия

дорогой сиборгиум. откуда вообще взято что в случае 2 - одна копия?

уважающие себя компиляторы(все зависимости от языка), копии структурных(то есть нескалярных) параметров делают так.

псеводкод

MyStructure = class {
  f0:int;
  f1:int;
...
}

и функция вида 
  ff(param: MyStructure){...}

на самом деле компилируется в функцию вида
  ff(param: const ref MyStructure){
    hidden_local_copy MyStructure(param);
    ...
  }

то есть в реальности в фукцию передается ссылка, а не весь обьект неким образом. а в прологе функции есть код создающий локальную копию, с которой и делается вся работа потом.

тогда в случае строковой константы и передачи по значению у вас будет создан в вызывающем коде локальный обьект типа string, затем ваша функция pass_by_value (хихи), будет вызвана с его адресом. потом она в прологе сделает на стеке себе копию… и получается..вах.. две копии(ну или два обьекта), а не один.

то есть циничная замена компилятором вашей «подстановки по значению» подстановкой по ссылке и копированием изнутри вызываемой функции, делает функции - by_ref и by_copy идентичными в случае нескалярных типов

Исправление alysnix, :

std::string lvalue = // ...
pass_by_value(lvalue);      // 1 копия 
pass_by_value("temporary"); // 1 копия

дорогой сиборгиум. откуда вообще взято что в случае 2 - одна копия?

уважающие себя компиляторы(все зависимости от языка), копии структурных(то есть нескалярных) параметров делают так.

псеводкод

MyStructure = class {
  f0:int;
  f1:int;
...
}

и функция вида 
  ff(param: MyStructure){...}

на самом деле компилируется в функцию вида
  ff(param: const ref MyStructure){
    hidden_local_copy MyStructure(param);
    ...
  }

то есть в реальности в фукцию передается ссылка, а не весь обьект неким образом. а в прологе функции есть код создающий локальную копию, с которой и делается вся работа потом.

тогда в случае строковой константы и передачи по значению у вас будет создан в вызывающем коде локальный обьект типа string, затем ваша функция pass_by_value (хихи), будет вызвана с его адресом. потом она в прологе сделает на стеке себе копию… и получается..вах.. две копии(ну или два обьекта), а не один.

то есть циничная замена компилятором вашей «подстановки по значению» подстановкой по ссылке и копированием изнутри вызываемой функции, делает функции - by_ref и by_copy идентичными.

Исходная версия alysnix, :

std::string lvalue = // ...
pass_by_value(lvalue);      // 1 копия 
pass_by_value("temporary"); // 1 копия

дорогой сиборгиум. откуда вообще взято что в случае 2 - одна копия?

уважающие себя компиляторы(все зависимости от языка), копии структурных(то есть нескалярных) параметров делают так.

псеводкод

MyStructure = class {
  f0:int;
  f1:int;
...
}

и функция вида 
  ff(param: MyStructure){...}

на самом деле компилируется в функцию вида
  ff(param: const ref MyStructure){
    hidden_local_copy MyStructure(param);
    ...
  }

то есть в реальности в фукцию передается ссылка, а не весь обьект неким образом. а в прологе функции есть код создающий локальную копию, с которой и делается вся работа потом.

тогда в случае строковой константы и передачи по значению у вас будет создан в вызывающем коде локальный обьект типа string, затем ваша функция pass_by_value (хихи), будет вызвана с его адресом. потом она в прологе сделает на стеке себе копию… и получается..вах.. две копии а не одна.