就用乙個很簡單的程式試試
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...