2014-12-23 34 views
1

我在VC++ 2010以下代码:如何正确初始化数组的值为零?

PWCHAR pszErrorMessage = new WCHAR[100]; 

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

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

您的主要问题几乎是[this one](http://stackoverflow.com/q/620137/179910)的一个骗局,但是这并不包括您提出的一些实现细节关于。 –

+0

@JerryCoffin我想你链接的答案似乎回答了我的主要问题。是否添加()零初始化值。我认为VC++ 2010是符合C++ 2003的编译器? –

+0

VC++ 2010在这方面符合C++ 2003(但在其他方面不符合)。 –

回答

1

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

是的,这可能会有一些(次要的)性能影响:初始化内存可能需要一些时间,尤其是在分配大量数据时。尽管如此,它并不总是:如果您使用初始化其成员的默认ctor分配对象类型,那么该ctor将以任一方式使用。

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

至少当我查看生成的代码时,将分配的缓冲区清零的代码似乎被分配在内,至少对于简单类型如char等等。例如:

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

你确定调零时内存没有被编译器优化掉吗?对于我以这种方式分配一个数组并访问其所有元素在反汇编窗口(VS 2013)中显示[调用memset](http://pastebin.com/ea2F3UYH)。 – dewaffled

+0

@frymode:是,否。它没有优化掉内存的调零。鉴于编译器的不同(我使用VC++ 2010中的64位编译器,而且显然使用了VC++ 2013中的32位编译器),生成的代码中的一些差异相当令人惊讶。 –