首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 動態陣列初始化:new int[N]{0} vs 迴圈賦值 vs memset 效能實測

     編輯:程式設計疑難解答

三種寫法比較

// 1. 值初始化 (C++11)
int* arr1 = new int[100000]{0};  // 全部歸零

// 2. 迴圈賦值
int* arr2 = new int[100000];
for (int i = 0; i < 100000; ++i) arr2[i] = 0;

// 3. memset
int* arr3 = new int[100000];
memset(arr3, 0, 100000 * sizeof(int));

效能實測(Release 模式,x64,Intel i7-10700)

元素數迴圈 (ms)memset (ms){0} 初始化 (ms)
1,0000.0160.0170.015
10,0000.0550.0130.012
100,0000.4430.0290.028
1,000,0004.3370.2910.285

結論

  1. new int[N]{0} 與 memset 效能幾乎相同,現代編譯器會將值初始化優化為 memset/rep stos 指令。
  2. 手寫迴圈最慢,尤其關閉優化時差距巨大;開啟 -O2/-O3 後編譯器可能自動向量化,但仍不如內建 memset 穩定。
  3. 語意更清晰:{0} 明確表達「全部歸零」,符合 C++11 零初始化語意,避免 memset 用於非 POD 型別的風險。

補充:非零初始化

// 全部設為 42
int* arr = new int[100000];
std::fill_n(arr, 100000, 42);  // 標準庫演算法,編譯器同樣會向量化
// 或
for (int i = 0; i < 100000; ++i) arr[i] = 42;

最佳實務建議

  • **歸零**:直接用 new int[N]{0}(C++11)或 std::vector vec(N)(自動歸零、自動釋放、邊界檢查)。
  • **非零值**:std::fill_n 或 std::vector vec(N, 42)。
  • **避免手動 new/delete**:優先使用 std::vector、std::unique_ptr,減少記憶體洩漏風險。

總結

動態陣列歸零請直接寫 new int[N]{0} 或用 std::vector,編譯器會產生最優機器碼(等同 memset),無需手寫迴圈,程式碼更安全、可讀、現代化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved