Keil的c語(yǔ)言編譯器
我曾經(jīng)通過(guò)查看反匯編代碼對(duì)KEILC編譯器進(jìn)行了測(cè)試,大概有這么一下內(nèi)容,也得出一些結(jié)論。
(1)全局變量:如果程序中定義了全局變量,而且初始值不是0。此時(shí),在程序調(diào)到main()函數(shù)執(zhí)行前,除了要進(jìn)行內(nèi)存清零、初始化堆棧外,還需要將全局變量的初始值加載到內(nèi)存的指定區(qū)域(編譯過(guò)程中為全局變量分配的空間)。
(2)局部變量:局部變量通常使用那些緩沖內(nèi)存(用作保存運(yùn)算過(guò)程的中間數(shù)據(jù))。初始化的局部變量,通常程序中都會(huì)對(duì)用到的緩沖內(nèi)存重新賦值。
但是,對(duì)于沒(méi)有初始化的局部變量需要注意“無(wú)知情的情況下被賦了值”。下邊的子函數(shù)中定義了變量,但是并未初始化。按照標(biāo)準(zhǔn)C語(yǔ)言的準(zhǔn)則,未初始化的變量的初值默認(rèn)是0,但是KEIL對(duì)未初始化的局部變量的處理不是這樣的。
voidfunction()
{
unsignedchark,j;
if(k
}
}
實(shí)際的編譯后的反匯編程序看不到對(duì)這些局部變量的初始化。這些局部變量可能會(huì)占據(jù)那些還未被使用的內(nèi)存或者其他子函數(shù)中局部變量已經(jīng)釋放的空間(但是這些空間可能并沒(méi)有清零)。倘若是后者,其他函數(shù)局部變量釋放的空間由于并沒(méi)有清零,所以這些局部變量就一開(kāi)始被賦了不能預(yù)先知道的值,這是不希望看到的。所以如果使用一個(gè)局部變量,就給這個(gè)變量賦個(gè)初值。
(3)謹(jǐn)防程序在“無(wú)知情的情況下被優(yōu)化”。如下函數(shù)的內(nèi)容經(jīng)過(guò)keil的編譯后,就變成了“REI”。也就是說(shuō)function的內(nèi)容全被忽略掉。解釋:keil對(duì)程序進(jìn)行了優(yōu)化,由于function的內(nèi)容并沒(méi)有任何作用,所以優(yōu)化時(shí)就把這些內(nèi)容忽略掉。倘若在變量前邊加上volatile”,這部分內(nèi)容就不會(huì)被忽略。
voidfunction()
{
unsignedchari,j,k;
i=j+k;
}
總結(jié)如收功 練功不收功 到老一場(chǎng)空