2014-12-23 64 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位編譯器),生成的代碼中的一些差異相當令人驚訝。 –