【发布时间】:2012-07-23 15:05:44
【问题描述】:
首先请看下面的代码,它由2个翻译单元组成。
--- 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 标志编译示例。
-
你允许编译器使用 C++11 特性吗?
-
放置 -O0 标志不会改变这种情况。 RVO 似乎在这种情况下有效。根据我的理解,我使用的编译器不允许使用 C++11 功能。