首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Visual C++似乎是零初始化类的POD成员,但它不应该这样做。

Visual C++似乎是零初始化类的POD成员,但它不应该这样做。
EN

Stack Overflow用户
提问于 2019-04-19 10:51:24
回答 1查看 144关注 0票数 2

我有这样一门课:

代码语言:javascript
运行
复制
class TestClass
{
public:
    TestClass() {};
    //Note: I wish not to initialize rawMemory (for whatever reason)
    int rawMemory[32];
};

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

在我使用TestClass创建了一个TestClass obj;对象之后,我得到了我想要的行为: rawMemory没有被初始化(在调试模式中填充了0xcc,在发布模式中使用了随机的未定值)。

当我向类添加指针成员时,情况如何:

代码语言:javascript
运行
复制
class TestClass
{
public:
    TestClass() {};
    int rawMemory[32];
    int* ptr;
};

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

代码语言:javascript
运行
复制
class TestClass
{
public:
    TestClass() {};
    std::aligned_storage<sizeof(int), alignof(int)>::type rawMemory[32];
    int* ptr;
};

注意:我试过g++,它如我所期望的那样起作用了。

TestClass更新:如果我将TestClass转换为一个结构,问题就解决了;如果我给一个默认的隐式构造函数,问题就解决了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-19 13:06:15

我终于找到了这个问题的根源。

当类中存在指针成员时,VisualC++在调用我定义的构造函数之前插入一个autoclassinit方法调用。这个方法调用有点混淆了成员初始化,而rawMemory 对my 进行了零初始化。

可以通过禁用Visual/sdl编译器选项中的/sdl来删除此行为。然而,如果它不是非常关键的性能(或瓶颈),我的建议是保留它的现状。

感谢所有想帮忙的人!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55760694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档