문제의 최적화가 관찰 가능한 차이점을 가지고 있기 때문에 직접 테스트 할 수 있습니다!
대부분의 C++ 최적화 최적화 방법은 as-if
규칙을 따르므로 검색하기가 어렵습니다. 그러나, 약간의 경우, 차이가 관찰 가능한 동작 변경을 초래하더라도, 복사 및 이동 생성자를 생략 (건너 뛰기) 할 수 있습니다.
struct S {
// ...
S(S const& o):x(o.x), y(o.y), z(o.z) {
std::cout << "copy ctor!\n";
}
S& operator=(S const& o) {
x=o.x;
y=o.y;
z=o.z;
std::cout << "copy assign!\n";
return *this;
}
S(S && o):x(std::move(o.x)), y(std::move(o.y)), z(std::move(o.z)) {
std::cout << "move ctor!\n";
}
S& operator=(S const& o) {
std::tie(x,y,z) = std::tie(std::move(o.x),std::move(o.y),std::move(o.z));
std::cout << "move assign!\n";
return *this;
}
}
를하고 코드를 실행 :이 경우
은 S에 다음을 추가합니다. 최적화가 없으면 사본 및/또는 이동이 가능합니다.
평범하지 않은 최적화 수준에서는 RVO (및 관련 사례 인 NRVO)가 실행되어 복사본이 제거되므로 인쇄물이 사라집니다. (컴파일러가 C++ 11이 아닌 경우 위의 이동 생성자를 제거하십시오. C++ 03의 최적화가 여전히 허용됨)
C++ 11에서는 의존하지 않고 반환 값을 명시 적으로 생성 할 수 있습니다. NRVO/RVO를 return {stuff}
구문을 통해 수신합니다.
RVO (반환 값 최적화)와 NRVO (반환 값 최적화)는 상대적으로 약하다는 점에 유의하십시오. 만약 당신이 그것들에 의존한다면, 어떻게 작동하는지, 왜 깨지게하는지, 컴파일러는 구현되어있다.
시도해 보셨습니까? 그 결과는 무엇입니까? – viraptor
그것은 컴파일러와 최적화 레벨, 플랫폼 및 모든 것에 달려 있습니다. 하지만 나는 적어도 릴리스 빌드에서이 최적화를 수행하는 괜찮은 컴파일러를 기대합니다. –
@viraptor 나는이 최적화가 완료되었는지 확인하는 방법조차 모른다. – pavelkolodin