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

时间:2014-12-23 17:59:15

标签: visual-c++

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

PWCHAR pszErrorMessage = new WCHAR[100];

此代码初始化一个指向数组的char指针。但是数组中的值是垃圾。我想要一种方法将值设置为零。 将上面的内容更改为下面的值会将数组中的所有值设置为零。这也适用于自定义结构数组。

PWCHAR pszErrorMessage = new WCHAR[100]();
  1. 这是对的吗?
  2. 这是否有任何性能影响?
  3. 这种类型的数组初始化是VC ++ 2005的一部分吗?
  4. 内部调用哪个方法将数组中struct的值设置为零?

1 个答案:

答案 0 :(得分:1)

如上所述elsewhere,是的,括号强制值初始化,这意味着算术类型将初始化为零(以及指向空指针的指针等)。对于明确定义的类型初始化成员的默认构造函数,这不会有任何区别 - 对于它们,无论是否包含括号,都将调用默认构造函数。

是的,这可能会产生一些(次要)性能影响:初始化内存可能需要一些时间,尤其是在分配大量内存时。它不会总是:如果你正在分配一个带有默认ctor的对象类型来初始化它的成员,那么ctor将以任何一种方式使用。

此功能已添加到C ++ 03标准中。另外,我不记得它是否在VC ++ 2005中实现。我试图通过VC ++开发人员博客进行快速扫描,但是后来发布了VC ++ 2005.它确实包含了一些关于VC ++ 2005 SP1的信息,似乎没有提到它。

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

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