1. 程式人生 > >c/c++初始化陣列需要注意的(1)

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