發現一個有趣的MDK編譯器存儲優化現象,
unsigned int t1 = 0;
unsigned char t2 = 0;unsigned int aaa=1;//volatile unsigned int aaa=1;
unsigned char t3 = 0;
unsigned char t4 = 0;
unsigned char t5 = 0;
unsigned char t6 = 0;
int main(void)
{
t1=t1;
t2=t2;
t3=t3;
t4=t4;
t5=t5;
while(aaa);
return 0;
}
上面的程序在編譯後反彙編查看,發現變量的存儲很有意思:
0x30020460:t2
0x30020461:t3
0x30020462:t4
0x30020463:t5
0x30020464:t6
0x30020468:t1
0x3002046c:aaa
也就是說編譯器優先排列char型變量(單字節),然後再排整形變量(4字節),由此可以看出編譯器的代碼空間的優化算法應該就是這樣的。(PS:我並不懂編譯器原理)
另外,還要講一下重點。
while(aaa);
這條語句的彙編代碼(示意代碼)是:
LDR r0,[&aaa]
label:
CMP r0,#0
BNE label
如果將aaa聲明成volatile型的。那麼彙編的結果是:
label:
LDR r0,[&aaa]
CMP r0,#0
BNE label
這樣來理解volatile的作用應該更容易。