Re: 关键字static应用的疑问
|
||||
---|---|---|---|---|
資深會員
|
參照:
你都自問自答的講完了 還需要分析甚麼呢?? 看不懂你的問題在哪裡?
發表於: 2009/4/3 17:36
|
|||
|
Re: 關鍵字static應用的疑問
|
||||
---|---|---|---|---|
資深會員
|
加static 的變數和外部變數是一樣的意思
只差在可視範圍不同而已 請參考以下 http://www.microchip.com.tw/modules/n ... t_id=23082#forumpost23082
發表於: 2009/4/3 17:25
|
|||
|
Re: 關鍵字static應用的疑問
|
||||
---|---|---|---|---|
資深會員
|
1)前輟是給compiler看的,跟程式沒有直接關係。
2)程式最佳化是魚與熊掌的問題,相對於speed、size、可攜性、可閱性,首重演算,其次技巧。
發表於: 2009/4/3 16:18
|
|||
The Answer to Life, the Universe, and Everything.
|
||||
|
关键字static应用的疑问
|
||||
---|---|---|---|---|
新會員
|
Temp()是主函数调用的一个子函数 通过调试结果发现 添加与不添加关键字变量 i 在运行过程中结果是一样的 。且i的值都一直为递增。
问题一:添加关键字static跟代码长度有关系,且对代码是否有影响。 分析 :代码加了static关键字的代码明显少许多,然而当添加其他关键字时与不添加关键字的代码都一样。 所以添加static那不是就能起到优化代码的目的了吗 结论 :既然这样,每次在子函数中使用到的变量都用static关键字申明。请求帮忙分析! 问题二:申明与不申明关键字static时被调用时对变量初始化问题 分析: C语言中添加关键字static在被调用的时候只初始化一次待下次调用的时候以前次结果为依据,所以上面结果是正确的。 但是不添加关键字static时应该是每次调用应都该初始化一次变量把。数值应该不会一直递增的。 结论:是编译器自动优化还是与标准C 有区别或是个人理解有问题。 附加:而通过对比 51中keil的汇编代码加不加static代码都一样 /***************************什么关键 簡體轉繁體方便閱讀 : Temp()是主函數調用的一個子函數 通過調試結果發現 添加與不添加關鍵字變數 i 在運行過程中結果是一樣的 。且i的值都一直為遞增。 問題一:添加關鍵字static跟代碼長度有關係,且對代碼是否有影響。 分析 :代碼加了static關鍵字的代碼明顯少許多,然而當添加其他關鍵字時與不添加關鍵字的代碼都一樣。 所以添加static那不是就能起到優化代碼的目的了嗎 結論 :既然這樣,每次在子函數中使用到的變數都用static關鍵字申明。請求幫忙分析! 問題二:申明與不申明關鍵字static時被調用時對變數初始化問題 分析: C語言中添加關鍵字static在被調用的時候只初始化一次待下次調用的時候以前次結果為依據,所以上面結果是正確的。 但是不添加關鍵字static時應該是每次調用應都該初始化一次變數把。數值應該不會一直遞增的。 結論:是編譯器自動優化還是與標準C 有區別或是個人理解有問題。 附加:而通過對比 51中keil的彙編代碼加不加static代碼都一樣 /***************************什麼關鍵字也沒 字也没加************************************************************/ void temp(void) 00CA CFD9 MOVFF 0xfd9, 0xfe6 00CC FFE6 NOP 00CE CFE1 MOVFF 0xfe1, 0xfd9 00D0 FFD9 NOP 00D2 52E6 MOVF 0xfe6, F, ACCESS 5: { 6: //register 7: //static 8: //volatile 9: unsigned char i ; 00D4 2ADF INCF 0xfdf, F, ACCESS 10: i++; 00D6 52E5 MOVF 0xfe5, F, ACCESS 00D8 52E5 MOVF 0xfe5, F, ACCESS 00DA CFE7 MOVFF 0xfe7, 0xfd9 00DC FFD9 NOP 00DE 0012 RETURN 0 /***************************添加volatile关键字**************************************************************/ void temp(void) 00CA CFD9 MOVFF 0xfd9, 0xfe6 00CC FFE6 NOP 00CE CFE1 MOVFF 0xfe1, 0xfd9 00D0 FFD9 NOP 00D2 52E6 MOVF 0xfe6, F, ACCESS 5: { 6: //register 7: //static 8: volatile 9: unsigned char i ; 10: i++; 00D4 2ADF INCF 0xfdf, F, ACCESS 11: } 00D6 52E5 MOVF 0xfe5, F, ACCESS 00D8 52E5 MOVF 0xfe5, F, ACCESS 00DA CFE7 MOVFF 0xfe7, 0xfd9 00DC FFD9 NOP 00DE 0012 RETURN 0 /*********************************添加register关键字*******************************************************************************/ void temp(void) 00CA CFD9 MOVFF 0xfd9, 0xfe6 00CC FFE6 NOP 00CE CFE1 MOVFF 0xfe1, 0xfd9 00D0 FFD9 NOP 00D2 52E6 MOVF 0xfe6, F, ACCESS 5: { 6: register 7: //static 8: //volatile 9: unsigned char i ; 10: i++; 00D4 2ADF INCF 0xfdf, F, ACCESS 11: } 00D6 52E5 MOVF 0xfe5, F, ACCESS 00D8 52E5 MOVF 0xfe5, F, ACCESS 00DA CFE7 MOVFF 0xfe7, 0xfd9 00DC FFD9 NOP 00DE 0012 RETURN 0 /*****************************添加static关键字************************************************************************/ void temp(void) 5: { 6: //register 7: static 8: //volatile 9: unsigned char i ; 10: i++; 00E2 0100 MOVLB 0 00E4 2B8A INCF 0x8a, F, BANKED 11: } 00E6 0012 RETURN 0 Attach file: Link only for registered users
發表於: 2009/4/3 11:02
Edited by Ryang on 2009年04月03日 13:41:54
|
|||
|