gpt4 book ai didi

C++ 构造 : "MyClass c" is bad, "MyClass c = MyClass()"很慢,我要 "MyClass c()"

转载 作者:IT老高 更新时间:2023-10-28 23:09:17 26 4
gpt4 key购买 nike

这里有一些代码:

class MyClass
{
public:
int y;
};

int main()
{
MyClass item1;
MyClass item2 = MyClass();
}

当我运行它时,我收到以下值:

item1.y == [garbage]
item2.y == 0

这让我很惊讶。

我希望 item1 是默认构造的,而 item2 是从 MyClass 的匿名默认构造实例复制构造的,导致两者都等于 0(因为默认构造函数将成员初始化为默认值)。检查程序集:

//MyClass item1;
//MyClass item2 = MyClass();
xor eax,eax
mov dword ptr [ebp-128h],eax
mov ecx,dword ptr [ebp-128h]
mov dword ptr [item2],ecx

显示 item2 是通过在某个临时位置写入“0”值然后将其复制到 item2 中来构造的,正如预期的那样。但是,item1 没有组装。

因此,程序在堆栈中拥有 item1 的内存,但它从不构造 item1。

出于速度目的,我很欣赏这种行为,但我想要两全其美!我想知道 item1.y == 0 (它被构造),但我不想像 item2 那样在 default-construct-anonymous-instance-then-copy-construct 上浪费时间。

令人沮丧的是,我不能通过说 MyClass item1(); 来强制默认构造,因为它被解释为函数原型(prototype)。

所以...如果我想在 item1 上使用默认构造函数而不使用复制构造,我该怎么做呢?

旁注:看起来如果我为 MyClass 声明一个构造函数,item1 会像往常一样构造。所以这种行为只适用于编译器生成的构造函数。

最佳答案

让你的类(class)看起来像这样:

class MyClass 
{
public:
MyClass() : y(0)
{
}

public:
int y;
};

这两个例子都可以正常工作。您的问题是,如果没有提供构造函数,则基本类型成员将 不会 被初始化。所以 y 代表了 item1 所在位置的堆栈上碰巧出现的任何随机数据。

显式实现一个构造函数来解决这个问题。

这种行为的存在是因为 C++ 的“你只需为你使用的东西付费”的心态。基本类型没有“默认值”,因为这会不必要地(稍微)增加分配某些东西的成本,然后再填充它,因为这些值实际上被设置了两次。一次用于“默认值”,一次用于您实际想要的值。

关于C++ 构造 : "MyClass c" is bad, "MyClass c = MyClass()"很慢,我要 "MyClass c()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19626460/

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