먼저 두 개의 번역 단위로 구성된 다음 코드를 살펴보십시오.g ++ : 여러 번역 단위가 관련된 경우 RVO 작동 방법
--- foo.h ---
class Foo
{
public:
Foo();
Foo(const Foo& rhs);
void print() const;
private:
std::string str_;
};
Foo getFoo();
--- foo.cpp ---
#include <iostream>
Foo::Foo() : str_("hello")
{
std::cout << "Default Ctor" << std::endl;
}
Foo::Foo(const Foo& rhs) : str_(rhs.str_)
{
std::cout << "Copy Ctor" << std::endl;
}
void Foo:print() const
{
std::cout << "print [" << str_ << "]" << std:endl;
}
Foo getFoo()
{
return Foo(); // Expecting RVO
}
--- main.cpp ---
#include "foo.h"
int main()
{
Foo foo = getFoo();
foo.print();
}
foo.cpp와 main.cpp가 다른 번역 단위인지 확인하십시오. 그래서 내 이해에 따라 번역 단위 main.o (main.cpp)에서 사용할 수있는 getFoo()에 대한 구현 세부 사항이 없다고 말할 수 있습니다.
그러나 위에서 컴파일하고 실행하면 RVO가 작동한다는 것을 나타내는 "Copy Ctor"문자열을 볼 수 없습니다.
'getFoo()'의 구현 세부 사항이 번역 단위 main.o에 노출되지 않아도 달성 할 수있는 방법에 대해 알려 주시면 감사하겠습니다.
GCC (g ++) 4.4.6을 사용하여 상기 실험을 수행했다.
-O0 플래그는 예를 컴파일한다. – ForEveR
그리고 컴파일러에서 C++ 11 기능을 사용할 수 있습니까? – ForEveR
-O0 플래그를 넣어도 상황이 변경되지 않습니다. 이 경우 RVO가 작동하는 것 같습니다. 내가 사용하는 컴파일러는 내 이해에 따라 C++ 11 기능을 허용하지 않습니다. – Smg