2016-10-26 2 views
0

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

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

ответ

1

Нет, в общем случае компилятор не может заменить значение pass-by-value посредством передачи по ссылке, потому что в общем случае может возникнуть проблема с псевдонимом.

Значение аргумента может затем изменить под 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!" 
} 

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

+0

Я предполагаю, что, когда все аргументы постоянны, это будет так. –

+0

Да. Но это все равно должно доказать, что, например, копирование строки не имеет побочных эффектов. Поскольку 'std :: string' предоставляется поставщиком компилятора, это вполне возможно, но я не знаю, было ли это сделано или нет. –

+0

Да, вы можете быть там. В моем случае я имею дело с векторами, но так или иначе это было хорошо знать. –

Смежные вопросы