導航:首頁 > 源碼編譯 > 內嵌函數編譯優化

內嵌函數編譯優化

發布時間:2023-08-23 19:36:41

㈠ atmel studio怎麼開啟編譯優化

AVRStudio 的編譯優化級別
2017-01-10 10:30
-00 無優化。
-01 減少代碼尺寸和執行時間,不進行需要大量時間的優化。
-02 幾乎執行所有優化,而不考慮代碼尺寸和執行時間。
-03 執行 -02 所有的優化,以及內聯函數,重命名寄存器的優化。
-0S 針對尺寸的優化。執行所有 -02 優化而不增加代碼尺寸。
設置方法:
1.不使用外部的makefile
2.使用外部的makefile

㈡ 嵌入式中函數不會被調用會編譯到固件嗎

  1. 嵌入式系統

  2. 函數如果僅是定義了,而沒有被其它函數調用,這種情況下,優化系統不會將此函數編譯進最終可執行結果。所以更不會佔用內存。

  3. 2.PC系統

  4. 通常情況下函數如果僅是定義了,但未被調用,系統會進行編譯,能夠檢查並發現函數中的問題,但是否編譯進最終的可執行文件受編譯系統的控制,如果未被編譯到系統中則不會佔用內存。即便編譯到了系統中,由於PC系統在運行時,並不會將所有的程序都載入至內存,因此,還會受到操作系統本身的限制。

  5. 3.BS系統

  6. 伺服器端的程序通常情況下會佔用內存,因為系統不清楚是否會被調用,尤其是在WebService這樣的系統上。

  7. 客戶端的程序,無論是否被調用,在傳輸、載入等情況下,肯定會被代碼管理系統預編譯,因此,也是需要佔用內存的。

㈢ 內聯函數的函數內聯問題

除了 相關的問題, 內聯擴展一般,語言功能作為一個內聯函數可能不被視為有價值的,因為它們出現的原因,對於一個數字:
通常,一個編譯器是在一個比人類更有利的地位來決定某一特定功能是否應該被內聯。 有時,編譯器可能無法盡可能多的功能內嵌作為程序員表示。
一個重要的一點需要注意的是代碼(內聯函數)得到暴露其客戶端(調用函數)。
隨著功能的演變,它們有可能成為合適的內聯,他們不前,或不再在他們面前的內聯合適。 而內聯或取消內聯函數比從宏轉換為更容易,但仍需要額外的維修,一般產量相對較少的利益。
用於本機C型編譯系統的擴散可以增加編譯時間,因為他們的身體的中間表示是到每個調用點,他們都是內聯復制內聯函數。在代碼大小可能增加是由在編譯時間可能增加鏡像。
C++中內嵌的規范要求只有一個額外在另一個編譯單元,功能的外部定義時,相應的內聯定義,可以發生在不同的編譯單元多次,如果該函數用於地方。這很容易導致連接器,因為這樣的定義不是由程序員提供的錯誤。 出於這個原因,往往是在C99內聯一起使用靜態的,也給出了函數的內部聯系。
在C + +,有必要定義一個在每一個模塊(編譯單元)內聯函數使用一個普通的功能,而必須在只有一個模塊中定義它。否則,就不可能編制的所有其他模塊一個模塊獨立。
對於功能問題與優化本身,而不是語言,請參閱使用內聯擴展問題 。
內聯函數是使用inline關鍵字聲明的函數,也成內嵌函數,它主要的作用是解決程序的運行效率。
使用內聯函數的時候要注意:
1.遞歸函數不能定義為內聯函數
2.內聯函數一般適合於不存在while和switch等復雜的結構且只有1~5條語句的小函數上,否則編譯系統將該函數視為普通函數。
3.內聯函數只能先定義後使用,否則編譯系統也會把它認為是普通函數。
4.對內聯函數不能進行異常的介面聲明。

㈣ C++編譯器(Dev-C)是否會自動內聯函數 對於什麼樣的函數即使標記inline也會拒絕內聯

G++編譯器是否會自動進行內聯函數?

G++編譯器是很先進的,編譯的時候如果開啟優化,G++會代碼進行各種優化,如:對合適的函數進行內聯(即便是沒有添加inline關鍵字),對某些函數直接對其進行求值,除此之外G++編譯器還可以對代碼進行重排序 等等。編譯器比你更了解硬體,所以只要允許它優化,他會盡量進行優化。你使用的Dev C++集成開發環境使用的c++編譯器就是G++。


什麼樣的函數即使標記inline也無法內聯?

比如函數體太大、太復雜的話(比如包含多重循環、包含遞歸調用),對其進行內聯得不償失,這時編譯器就會忽略inline關鍵字,VC++編譯器提供了強制內聯函數的關鍵字,除非你非常了解硬體,不然最好讓編譯器來處。編譯不對那些函數進行內聯要看具體的編譯器實現了。


inline關鍵字的有哪些作用?

inline關鍵字可以提示編譯器對某個函數進行內聯,並且強制函數使用內部鏈接。比如說你在頭文件定義了某個函數,為了防止多重定義,你可以添加inline關鍵字來防止多重定義錯誤。


如果對硬體不是很了解,底層的代碼優化還是留給編譯器來處理。


看看下面的幾個編譯器優化函數的例子:


1.編譯器直接對函數求值:

解釋一下:

第一條和第二天指令分別將b和a的地址載入到寄存器rdx和rcx中

第三條指令將b的值載入到eax寄存器中

第四條指令將34存入b中

第五條指令將eax的值加1(eax保存了之前b的值)

第六條指令將eax的值存入a中

可以看出編譯器將函數的兩條語句換了位置,這種優化主要是優化代碼的執行速度,有的CPU內存讀寫操作的的開銷不一樣,所以重新排序一下某些代碼能夠提高程序執行速度。

閱讀全文

與內嵌函數編譯優化相關的資料

熱點內容
自動關機dos命令 瀏覽:323
我的app為什麼打不開 瀏覽:155
華為手機更新app放在哪裡 瀏覽:779
阿里雲伺服器包含數據嗎 瀏覽:298
伺服器的密封是什麼 瀏覽:148
php面向對象繼承 瀏覽:72
smtplibpython安裝 瀏覽:475
python模擬登錄網頁 瀏覽:816
在哪查看自己的python位置 瀏覽:34
南京java公司 瀏覽:585
合唱app哪個好用 瀏覽:470
英文版伺服器日誌怎麼看 瀏覽:69
笑臉買小人賣主圖指標公式源碼 瀏覽:948
javasocket時間設置 瀏覽:692
使役形命令形 瀏覽:233
尚矽谷程序員哪個好 瀏覽:254
政治論pdf 瀏覽:565
mvc在android中的應用 瀏覽:450
劇場解壓視頻搞笑 瀏覽:139
壓縮式製冷機原理圖 瀏覽:868