gpt4 book ai didi

c++ - Visual C++ 似乎是零初始化一个类的 POD 成员,它不应该

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:13 24 4
gpt4 key购买 nike

我有这样一个类:

class TestClass
{
public:
TestClass() {};
//Note: I wish not to initialize rawMemory (for whatever reason)
int rawMemory[32];
};

int main()
{
TestClass obj;
return 0;
}

在我使用 TestClass obj; 创建了一个 TestClass 对象之后,我得到了我想要的行为:rawMemory 没有被初始化(在 Debug模式下填充了 0xcc 并且随机填充了 Release模式下的未确定值)。
当我向类中添加指针成员时如何:

class TestClass
{
public:
TestClass() {};
int rawMemory[32];
int* ptr;
};

rawMemory 已初始化为零!我认为按照标准这不应该发生。我什至尝试使用 std::aligned_storage 专门用于保留未初始化的自动内存,而 rawMemory 仍然是零初始化的!

class TestClass
{
public:
TestClass() {};
std::aligned_storage<sizeof(int), alignof(int)>::type rawMemory[32];
int* ptr;
};

注意:我已经尝试过 g++,它按我预期的那样工作。
更新:如果我将 TestClass 更改为结构,问题就消失了;如果我给 TestClass 一个默认的隐式构造函数,问题就消失了。

最佳答案

我终于找到问题的根源了。
当类中存在指针成员时,Visual C++ 会在调用我定义的构造函数之前插入一个 autoclassinit 方法调用。此方法调用在成员初始化方面有些困惑,它确实对我的 rawMemory 成员进行了零初始化
可以通过在 Visual C++ 编译器选项中禁用 /sdl 来删除此行为。但是,如果它不是非常关键的性能(或瓶颈),我的建议是保持原样。
感谢所有试图提供帮助的人!

关于c++ - Visual C++ 似乎是零初始化一个类的 POD 成员,它不应该,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55760694/

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