繁体   English   中英

C ++通过函数简单分配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM