История изменений
Исправление 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 (хихи), будет вызвана с его адресом. потом она в прологе сделает на стеке себе копию… и получается..вах.. две копии а не одна.