初探C C 0 式 初始化

2021-05-24 23:43:02 字數 1698 閱讀 9730

就用乙個很簡單的程式試試

int  main()

;return  0;

}在int a[10] = ;這行設定斷點,

f5 開始除錯

alt+8 調出彙編標籤

關鍵彙編如下:

4:     int  a[10] = ;

012b8238  mov

dword

ptr  [ebp -30h],0  

012b823f  xor

eax ,eax

012b8241  mov

dword

ptr  [ebp -2ch],eax

012b8244  mov

dword

ptr  [ebp -28h],eax

012b8247  mov

dword

ptr  [ebp -24h],eax

012b824a  mov

dword

ptr  [ebp -20h],eax

012b824d  mov

dword

ptr  [ebp -1ch],eax

012b8250  mov

dword

ptr  [ebp -18h],eax

012b8253  mov

dword

ptr  [ebp -14h],eax

012b8256  mov

dword

ptr  [ebp -10h],eax

012b8259  mov

dword

ptr  [ebp -0ch],eax

額,一看之下是不是傻了眼?

難道的作用只是簡單的乙個個將元素賦值?

而且sb式的乙個個mov?

不是吧……

將陣列大小改大一點看看,比如30

再看一下彙編**:

4:     int  a[30] = ;

011d8238  mov

dword

ptr  [ebp -80h],0  

011d823f  push         74h  

011d8241  push         0  

011d8243  lea

eax ,[ebp -7ch]  

011d8246  push

eax011d8247  call         @ilt+1180(_memset) (11d64a1h)  

011d824c  add

esp ,0ch  

這次沒那麼sb了,通過呼叫_memset(跟進去,其實還是呼叫memset)

而且是從第二個元素的位址開始的,第乙個已經賦0了

74h(16) => 116(10) = 29 * 4 (乙個int 4位元組,即32位)

大概也就這樣了,編譯器先判斷陣列長度有沒有大於預設的,

大於就使用memset,不然乙個個mov……

這就好辦了,以後知道呼叫的函式絕對的會先清零那陣列的話,

就不要寫了,免得又浪費那麼多cpu週期

不過就現在cpu來說,寫上去或者又是一種保證,反正cpu速度那麼牛了

不在意那麼點東東

再試了下char型別,差不多的了

測試環境:vc++ 2010 (debug) + windows 7 ultimate sp1

(release貌似又不是這樣,下回有空再玩玩)

關於C C 初始化

1 使用函式進行初始化 void memset void s,int ch,size t n 將s中前n個位元組 typedef unsigned int size t 用 ch 替換並返回 s 在使用之前,c中引入string.h,而c 中引入cstring 1 初始化整數陣列 const int...

關於C C 初始化

1 使用函式進行初始化 void memset void s,int ch,size t n 將s中前n個位元組 typedef unsigned int size t 用 ch 替換並返回 s 在使用之前,c中引入string.h,而c 中引入cstring 1 初始化整數陣列 const int...

初始化0號程序

arch x86 kernel head 32.s 的336 行,進入分頁後的核心 段,執行 lss stack start,esp 指令,立即為程序 0建立核心態堆疊。stack start 定義在657 行 657 entry stack start 658 long init thread u...