아니요, 일반적으로 컴파일러는 값에 의한 전달을 참조 전달로 대체 할 수 없습니다. 일반적으로 별칭 문제를 일으킬 수 있기 때문입니다. 인수의
값은 다음 말하자면 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!"
}
그러나, 특정 경우에 경우 컴파일러는 같은 별칭이 문제가되지 않을 것을 증명할 수있는, 문자열을 복사하는 것이 부작용을 가지지 않는다는 것, 즉 두 경우 모두에서 관찰 가능한 프로그램 동작이 동일하다는 것을 증명할 수 있다면 즉,이 방법을 최적화 할 수 있습니다. 이는 ” -rule이 작동중인 것처럼 “ 일뿐입니다. 이는 관찰 가능한 유일한 변화가 코드의 실행 시간 인 모든 최적화를 허용합니다.
나는 모든 인수가 이것보다 일정한 경우를 가정합니다. –
예. 그러나 그것은 여전히 입증해야합니다. 문자열 복사는 부작용이 없습니다. 'std :: string'은 컴파일러 벤더에 의해 제공 되었기 때문에 가능한 일이지만, 그것이 완료되었는지 아닌지는 알 수 없습니다. –
네가 거기에 있을지도 모른다. 제 경우에는 벡터를 다루지 만, 어떤 식 으로든 그것을 알면 좋았습니다. –