2016-10-26 2 views
0

특히 일반적이지 않은 유형의 경우에는 값 및 참조로 전달할 때 상당한 차이가 있다는 것과 그 중 일부는 객체가 복사되었는지 아닌지에 대한 것입니다. 우리가 rvalue가있을 때주의해야한다.상수 값 대 상수 참조에 의한 벡터 전달

그러나 컴파일러가 실제로 전달 된 인수가 상수 일 때이 두 가지가 동일하다는 것을 실제로 인식하는지 궁금해하고 참조로 전달할 값으로 전달을 자동으로 최적화합니까? 그렇지 않다면 인수를 거의 항상 참조로 전달하는 것이 표준이라고 가정합니다.

답변

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!" 
} 

그러나, 특정 경우에 경우 컴파일러는 같은 별칭이 문제가되지 않을 것을 증명할 수있는, 문자열을 복사하는 것이 부작용을 가지지 않는다는 것, 즉 두 경우 모두에서 관찰 가능한 프로그램 동작이 동일하다는 것을 증명할 수 있다면 즉,이 방법을 최적화 할 수 있습니다. 이는 ” -rule이 작동중인 것처럼 “ 일뿐입니다. 이는 관찰 가능한 유일한 변화가 코드의 실행 시간 인 모든 최적화를 허용합니다.

+0

나는 모든 인수가 이것보다 일정한 경우를 가정합니다. –

+0

예. 그러나 그것은 여전히 ​​입증해야합니다. 문자열 복사는 부작용이 없습니다. 'std :: string'은 컴파일러 벤더에 의해 제공 되었기 때문에 가능한 일이지만, 그것이 완료되었는지 아닌지는 알 수 없습니다. –

+0

네가 거기에 있을지도 모른다. 제 경우에는 벡터를 다루지 만, 어떤 식 으로든 그것을 알면 좋았습니다. –