Теоретически те, на которые нет ссылки, могут быть скопированы в память, поскольку существует вероятность того, что ваша встроенная функция может их изменить (даже если на самом деле это не так).
Во многих случаях компилятор достаточно умен, чтобы определить такие вещи, но это будет зависеть от компилятора и настроек оптимизации. Кроме того, если ваша функция вызывает какие-либо неконстантные функции-члены в переменных класса, тогда ваш компилятор должен быть достаточно умным, чтобы проверить, изменяют ли они что-либо.
Используя ссылку const, вы можете дать ей довольно четкое указание.
РЕДАКТИРОВАТЬ: я просто хочу взглянуть на машинный код простой тестовой программы, скомпилированной с помощью GCC 4.6 в ddd. Сгенерированный код казался идентичным, поэтому он кажется оптимизированным. Это по-прежнему хорошая практика для других компиляторов, и, по крайней мере, дает четкое указание на намерение кода. Также возможно, что существуют более сложные ситуации, которые компилятор не может оптимизировать.
Кроме того, демонстрация онлайн-диссемблера llvm показывает, что там тоже генерируется идентичный битовый код. Если вы отключите оптимизацию, она будет немного длиннее без ссылки на константу.
* 1964 байта — без ссылки на константу (и никаких других констант в функциях/параметрах)
* 1960 байт — просто без ссылки на константу, но другие константы .
* 1856 байт — с константами и ссылкой на константу.
person
David C. Bishop
schedule
02.10.2011
v.push_back(v[0])
допустимо, потому что стандартная библиотека должна включать эту дополнительную логику). - person Ben Voigt   schedule 02.10.2011push_back
, стандартная библиотека обязана правильно с ней поступить. - person Ben Voigt   schedule 02.10.2011v.push_back(v[0])
безопасен: an-element-of-a-conta/6212163#6212163" title="как правильно избежать псевдонимов, например, при добавлении элемента conta"> stackoverflow.com/questions/6210688/ - person Ben Voigt   schedule 03.10.2011v[0]
не будет жить достаточно долго в случае перераспределения, и поэтому реализация может делать все, что захочет. - person 6502   schedule 03.10.2011push_back
ссылку на объект, который уничтожается при вызове::operator new
... все равно будет ошибкой библиотеки? - person 6502   schedule 03.10.2011push_back
, и объектом, уничтоженным кодом, который контролирует только вызывающая сторона. - person Ben Voigt   schedule 03.10.2011