函数回来对象,标准语义是怎样的
函数返回对象,标准语义是怎样的?std::string fun(){std::string str 123456789123456789123456789pri
函数返回对象,标准语义是怎样的?
std::string fun()
{
std::string str = "123456789123456789123456789";
printf("%p %p\n", &str, str.data());
return str;
}
int main(int argc, const char* argv[]) {
std::string ss = fun();
printf("%p %p\n", &ss, ss.data());
return 0;
}
linux输出:
0xbfd64ac0 0x8883084
0xbfd64ac0 0x8883084
我比较赞同这是标准,即ss相当于是str的一个引用,不需要构造ss。
vc2008输出:
000000000021E5D8 000000000030A380
000000000021E678 000000000030A3E0
对象构造一次,数据拷贝一次,最坏情况
vc2012输出:
00000000001DE4C8 000000000021A5C0
00000000001DE598 000000000021A5C0
对象构造一次(通过移动构造函数),数据未拷贝,情况好一点。
[解决办法]返回对象的语义就是返回拷贝(拷贝构造或move constructor),至于你的类如何实现copy constructor/move constructor就是看代码如何实现的。 另外编译器可以提供返回值优化(RVO)
[解决办法]属于。如果真好学,本论坛有C++标准下载,自己搞了认真看一下。
[解决办法]gcc 用的是写时复制。C++ 标准是值语义。
[解决办法]gcc最新版本 似乎最接近C++0x标准。
[解决办法]标准特别允许编译器进行(N)RVO优化