[英]c++ simple allocation by a function
我试图了解这种分配如何在c ++中工作:
Test other = toto();
这是完整的代码源:
#include <iostream>
class Test
{
public:
Test()
{
j = i++;
std::cout<<"default constructor "<<j<<std::endl;
}
Test(const Test&)
{
std::cout<<"constuctor by copy "<<j<<std::endl;
}
Test & operator=(const Test&)
{
std::cout<<"operator = "<<j<<std::endl;
return *this;
}
int j;
static int i;
};
int Test::i = 0;
Test toto()
{
Test t;
return t;
}
int main()
{
Test other = toto();
std::cout<<other.j<<std::endl;
Test another;
return 0;
}
该代码未通过copy或operator =来使用构造函数,所以我不太了解它的工作原理……我使用了gcc 4.7.0
谢谢您的帮助:)
杰罗姆
格式语义:
Test other = toto();
涉及多个副本(但不分配)。 允许编译器取消所有不同的实例,但是,消除了副本。 几乎所有的编译器都执行此优化。
更具体地说,该标准没有指定返回类类型的值的位置,但是通常的解决方案是调用方分配空间,并将隐藏的指针传递给函数。 如果没有上述优化:
Test
toto()
{
Test t;
return t;
}
将导致构造局部变量t
,然后return语句将t
复制到隐藏指针指向的空间中。 这里的优化(称为命名返回值优化或NRVO)导致编译器使用隐藏指针指向t
的空间,而不是在本地创建单独的t
。 (显然,它这样做的时候,它不会破坏t
,因为它会复制后除外。)
在声明中:
Test t = toto();
,形式语义将使编译器为Test类型的临时对象分配空间,将该空间的地址作为toto
的隐藏指针传递,然后将该临时对象复制到t
并对其进行销毁。 这里的优化在于编译器将t
的地址直接传递给toto
,从而消除了中间临时对象。
看一下返回值优化 ,这是避免构造函数调用的常见优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.