首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

函数回来对象,标准语义是怎样的

2013-04-21 
函数返回对象,标准语义是怎样的?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标准。
[解决办法]
引用:
请问RVO是否属于c++标准?
标准特别允许编译器进行(N)RVO优化

热点排行