// 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));
| 元素數 | 迴圈 (ms) | memset (ms) | {0} 初始化 (ms) |
|---|---|---|---|
| 1,000 | 0.016 | 0.017 | 0.015 |
| 10,000 | 0.055 | 0.013 | 0.012 |
| 100,000 | 0.443 | 0.029 | 0.028 |
| 1,000,000 | 4.337 | 0.291 | 0.285 |
new int[N]{0} 與 memset 效能幾乎相同,現代編譯器會將值初始化優化為 memset/rep stos 指令。-O2/-O3 後編譯器可能自動向量化,但仍不如內建 memset 穩定。{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) 。std::vector、std::unique_ptr,減少記憶體洩漏風險。動態陣列歸零請直接寫 new int[N]{0} 或用 std::vector,編譯器會產生最優機器碼(等同 memset),無需手寫迴圈,程式碼更安全、可讀、現代化。