Visual c++ 如何正确地将数组的值初始化为零?

Visual c++ 如何正确地将数组的值初始化为零?,visual-c++,Visual C++,我在VC++2010中有以下代码: PWCHAR pszErrorMessage = new WCHAR[100]; 此代码初始化指向数组的字符指针。但是数组中的值是垃圾。我想要一种将值设置为零的方法。 将上面的值更改为下面的值会将数组中的所有值设置为零。这也适用于自定义结构的数组 PWCHAR pszErrorMessage = new WCHAR[100](); 这是正确的吗 这对性能有影响吗 这种类型的数组初始化是否是VC++2005的一部分 在内部调用哪个方法将数组中结构的值设置为零

我在VC++2010中有以下代码:

PWCHAR pszErrorMessage = new WCHAR[100];
此代码初始化指向数组的字符指针。但是数组中的值是垃圾。我想要一种将值设置为零的方法。 将上面的值更改为下面的值会将数组中的所有值设置为零。这也适用于自定义结构的数组

PWCHAR pszErrorMessage = new WCHAR[100]();
  • 这是正确的吗
  • 这对性能有影响吗
  • 这种类型的数组初始化是否是VC++2005的一部分
  • 在内部调用哪个方法将数组中结构的值设置为零
  • 如前所述,是的,括号强制值初始化,这意味着算术类型将被初始化为零(以及指向空指针的指针等)。对于显式定义初始化成员的默认构造函数的类型,这不会有任何区别——对于它们,无论是否包含括号,都将调用默认构造函数

    是的,这可能会对性能产生一些(次要的)影响:初始化内存可能需要一些时间,特别是在分配大量内存的情况下。但并不总是这样:如果您使用初始化其成员的默认ctor分配对象类型,那么该ctor将以任何方式使用

    此功能是在C++03标准中添加的。顺便说一下,我不记得它是否是在VC++2005中实现的。我试图快速浏览一下VC++开发者的博客,但那篇文章的发布日期是VC++2005。它确实包含了一些关于VC++2005SP1的信息,但似乎没有提到它

    至少当我查看生成的代码时,将分配的缓冲区归零的代码似乎是在线分配的,至少对于像
    char
    这样的简单类型。例如:

    xor eax, eax
    mov rcx, QWORD PTR $T86268[rsp]
    rep stosb
    

    您的主要问题几乎是一个骗局,但这并没有涵盖您询问的一些实现细节。@JerryCoffin我认为您链接的答案似乎回答了我的主要问题。添加()零是否会初始化这些值。假设VC++ 2010是C++ 2003的一致编译器,VC++ 2010在这方面与C++ 2003一致(但在其他方面则不适用)。每一个现代编译器都将其优化为-----你可以在那里选择不同的编译器,比较<代码> Foo和<代码> Bar < /Cult>拆解。快速测试表明VisualStudio2013也可以做到这一点。因此,这确实应该是分配默认初始化数组的首选方法。@frymode:不,这不应该是执行任何操作的首选方法。绝大多数时间,
    std::vector ErrorMessage(100)或只是
    std::string ErrorMessage
    比摆弄原始数组、原始
    等更可取。您确定编译器在测试中没有优化零内存吗?对于我来说,以这种方式分配数组并访问其所有元素显示在反汇编窗口中(VS 2013)。@frymode:是和否。它没有优化内存的归零。考虑到编译器的差异(我使用的是VC++2010的64位编译器,而您显然使用的是VC++2013的32位编译器),生成代码中的一些差异并不令人惊讶。