c/c++初始化陣列需要注意的(1)
C語言中,陣列初始化的方式主要有三種:
1、宣告時,使用 {0} 初始化;
2、使用memset;
3、用for迴圈賦值。
那麼,這三種方法的原理以及效率如何呢? 請看下面的測試程式碼:
#define ARRAY_SIZE_MAX (1*1024*1024)
void function1()
{
char array[ARRAY_SIZE_MAX] = {0}; //宣告時使用{0}初始化為全0
}
void function2()
{
char array[ARRAY_SIZE_MAX];
memset(array, 0, ARRAY_SIZE_MAX); //使用memset方法
}
void function3()
{
int i = 0;
char array[ARRAY_SIZE_MAX];
for (i = 0; i < ARRAY_SIZE_MAX; i++) //for迴圈賦值
{
array[i] = 0;
}
}
效率:
分別執行上面三種方法,統計下平均時間可以得出: for迴圈浪費的時間最多,{0} 與memset 耗時差不多。
原理:
1、for迴圈,就是迴圈賦值,不解釋了
2、memset,很容易找到memset內部實現程式碼,這裡也不解釋了
3、{0} 內部是怎麼實現的呢?
將上述程式碼編譯成彙編格式如下:
function1如下:
pushl %ebp
movl %esp, %ebp
subl $1048600, %esp
leal -1048584(%ebp), %eax
movl $1048576, %edx
movl %edx, 8(%esp)
movl $0, 4(%esp)
movl %eax, (%esp)
call memset
leave
ret
function2如下:
pushl %ebp
movl %esp, %ebp
subl $1048600, %esp
movl $1048576, 8(%esp)
movl $0, 4(%esp)
leal -1048584(%ebp), %eax
movl %eax, (%esp)
call memset
leave
ret
通過彙編程式碼可以看出,{0}初始化方式,呼叫了memset函式!
對三種方法的選取:
1、for 最浪費時間,不建議(其實memset內部也是用迴圈實現的,只不過memset經過了嚴格優化,所以效能更高);
2、{0} 可能有移植性問題,雖然絕大多數編譯器看到{0} 都是將陣列全部初始化為0, 但是不保證所有編譯器都是這樣實現的;
3、綜合1、2, 推薦使用memset方法。
https://blog.csdn.net/slx_391987/article/details/39558227