Передача вектора по постоянному значению или по постоянной ссылке

Я понимаю, что в целом существует значительная разница в передаче по значению и ссылке, особенно для нетривиальных типов, и что в основном это зависит от того, копируется ли объект или нет, с некоторыми оговорками, когда у нас есть rvalue.

Однако мне интересно, действительно ли компилятор распознает, что эти две вещи в некоторой степени идентичны, когда переданный аргумент является постоянным, и автоматически оптимизирует передачу по значению для передачи по ссылке? Если нет, я полагаю, что это стандарт - делать аргументы, передаваемые по ссылке почти всегда, верно?


person Alex Botev    schedule 26.10.2016    source источник


Ответы (1)


Нет, в общем случае компилятор не может заменить передачу по значению на передачу по ссылке, потому что в общем случае это может вызвать проблему сглаживания.

Тогда значение аргумента может измениться под const, так сказать:

void foo( string const a, string& backarai )
{
    backarai = "Hm! ";
    backarai += a;
}

void bar( string const& a, string& backarai )
{
    backarai = "Hm! ";
    backarai += a;
}

auto main() -> int
{
    string s = "Well well well!";
    foo( s, s );    // Sets s to "Hm! Well well well!"

    string t = "Well well well!";
    bar( t, t );    // Sets t to "Hm! Hm!"
}

Однако, если в конкретном случае компилятор может доказать, что такой псевдоним не будет проблемой, и что копирование строки не имеет побочных эффектов и т. Д., Т.е. если оно может доказать что наблюдаемое поведение программы в обоих случаях будет одинаковым, тогда ее можно оптимизировать таким образом. Это просто как будто-правило в действии. Он допускает любую оптимизацию, в которой единственное наблюдаемое изменение - это время выполнения кода.

person Cheers and hth. - Alf    schedule 26.10.2016
comment
Я предполагаю, что когда все аргументы постоянны, это будет так. - person Alex Botev; 26.10.2016
comment
да. Но все равно придется доказать, что, например, копирование строки не имеет побочных эффектов. Поскольку std::string предоставляется поставщиком компилятора, это вполне возможно, но я не знаю, сделано это или нет. - person Cheers and hth. - Alf; 26.10.2016
comment
Да, ты можешь быть здесь. В моем случае я имею дело с векторами, но в любом случае было полезно знать. - person Alex Botev; 26.10.2016