gpt4 book ai didi

c++通过函数进行简单分配

转载 作者:太空狗 更新时间:2023-10-29 19:53:52 27 4
gpt4 key购买 nike

我试图理解这种分配在 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 复制到 hidden 指向的空间指针。优化(称为命名返回值优化,或NRVO) 在这里导致编译器使用指向的空间t 的隐藏指针,而不是在本地创建单独的 t。(显然,当它这样做时,它不会破坏t,因为它会否则在复制之后。)

在声明中:

Test t = toto();

,形式语义会让编译器为 a 分配空间Test类型的temporary,将这个空间的地址作为hidden传递指向 toto 的指针,然后将此临时文件复制到 t 中并销毁它。这里的优化在于编译器传递地址t直接到toto,省去了中间的临时。

关于c++通过函数进行简单分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10551365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com