精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

編譯器如何對代碼進行優化(上)

jf_78858299 ? 來源:看雪論壇 彼岸風 ? 作者:看雪論壇 彼岸風 ? 2023-02-01 16:25 ? 次閱讀

在學習 Andorid 逆向的過程中,發現無論是哪種編譯器,生成哪個平臺的代碼,其優化思路在本質上如出一轍,在 Windwos 平臺所使用的技巧,在安卓平臺仍然適用,不外乎乘法除法計算的優化,swtich 判定樹的優化,對 if 條件句的優化,while 循環的優化等等,編寫本文的目的也就是為了對已學的知識進行總結。

這里強烈推薦老錢和老張寫的《C++匯編與逆向分析技術揭秘》,本文大部分知識點都將以此書作為參考,我個人是不太喜歡看直播和視屏教程的,因為有些關鍵知識點可能老師一句話就帶過去了,要想回來看還得來回拉進度條,但是書不一樣,遇到讀不懂的地方可以停下來仔細思考,想回頭看也就是翻幾頁的事情,遇到那種寫的特別細的作者,那讀起來更是一種享受。

本文列舉的代碼和匯編只是為了更好的說明思路,并不代表實際代碼,好了話不多說,進入正題。

優化方向

  • 編譯速度優化
  • 執行速度優化
  • 程序體積優化

對于 Debug 版程序,編譯器為了滿足單步調試需求,不會對無意義的代碼進行優化。無意義的意思是沒有發生傳遞,沒有賦值到內存空間。



常見的優化類型

常量折疊

更像是預處理,編譯器會將所有可預見的值直接寫成立即數。

int n = 2 + 3 * 6;
// 編譯器在處理這段代碼時會直接將變量賦予立即數+
// mov n, 20

常量傳播

是常量折疊的“進階版”,編譯器會掃描整個代碼段,對所有非變量運算直接計算出結果。

int n = 2 + 3 * 6;
int m = n * 10;
// mov m, 200

減少變量

未使用即是無意義,無意義的代碼都會被優化,上述的兩個示例,在實際編譯中是會直接被優化掉的,因為并未被用于函數傳參和其他操作。

編譯雖然能通過,但不會產生任何代碼,因為沒有傳遞結果,對后續的代碼執行不會造成任何影響。

int funtion1() {
    int n = 2 + 3 * 6;
    int m = n * 10;
    return 0;
}
// 無意義的變量,這個函數被編譯為匯編也將只有一句代碼
// mov eax, 0

int funtion2() {
    int n = 2 + 3 * 6;
    int m = n * 10;
    return m;
}
// 有意義的變量,但因為常量傳播,也只有一句代碼
// mov eax, 200

## 分支優化

對于所有不可達的分支也會直接被裁剪。

if(false) {
    printf("you can't find me");
}

在書中還有更多優化示例,這里不做過多列舉,其根本就是以上幾種優化方式,無意義的代碼將被刪除,冗余的代碼將會被精簡,照著這種思路想就對了。得益于編譯器的強大,使得再爛的代碼也能保持高效。



數學計算上對算法的優化

我將會穿插使用 x86 和 arm 匯編,主要指令都大差不差,理解意義即可。

加法

加法沒有任何優化空間,一個 add 指令所需的 cpu 周期本就很短,除了上述的常量折疊外,一般不會對其進行改動。

減法

理論上加法和減法的指令周期是一致的,也不排除有些編譯器會將減數轉成補碼進行相加,遇到補碼也能一眼看出來,直接就可以認定這條指令為減法。

乘法

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4751

    瀏覽量

    68359
  • 編譯器
    +關注

    關注

    1

    文章

    1618

    瀏覽量

    49052
  • Andorid
    +關注

    關注

    0

    文章

    7

    瀏覽量

    6979
收藏 人收藏

    評論

    相關推薦

    如何編寫有利于編譯器優化代碼

    對于嵌入式系統,最終代碼的體積和效率取決于由編譯器生成的可執行代碼,而非開發人員編寫的源代碼;但是源代碼
    發表于 11-09 10:31 ?1401次閱讀
    如何編寫有利于<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>的<b class='flag-5'>代碼</b>

    如何編寫有利于編譯器優化代碼

    本篇文章將以國際知名編譯器廠商IAR Systems的編譯器為例,來解答開發人員在實際工作中常常遇到的問題,工程師朋友們可以在IAR編譯器進行實踐驗證。
    發表于 08-01 09:43 ?474次閱讀
    如何編寫有利于<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>的<b class='flag-5'>代碼</b>

    如何編寫有利于編譯器優化代碼

    多種方式訪問一個變量,這種情況就會被稱為別名,而別名使代碼更難優化。 盡管程序員知道向 buf 所指向的緩存區進行寫操作不會改變這個buf變量本身,但編譯器還是不得不做最壞的打算,在循
    發表于 04-11 10:17

    SIMD計算機的優化編譯器設計

    利用處理的相關資源,提高編譯器優化性能和增強代碼可適應性是SIMD處理優化
    發表于 04-03 08:47 ?30次下載

    Keil C編譯器編程規則和代碼優化

    本內容介紹了Keil C編譯器編程規則和代碼優化,要實用好單片機就必須清楚它的內部結構組織結構,無論是在芯片的選擇還是代碼的編寫
    發表于 04-20 17:37 ?315次下載
    Keil C<b class='flag-5'>編譯器</b>編程規則和<b class='flag-5'>代碼</b><b class='flag-5'>優化</b>

    編譯器_keil的優化選項問題

    keil編譯器優化選項針對ARM,對STM32編譯的一些優化的問題
    發表于 02-25 14:18 ?3次下載

    C編譯器及其優化

    本章將幫助讀者在ARM處理編寫高效的C代碼。本章涉及的一些技術不僅適用于ARM處理,也適用于其他RISC處理。本章首先從ARM
    發表于 10-17 17:22 ?2次下載

    如何使用編譯器進行定位優化信息

    在本次網絡研討會中,我們將向您展示如何使用編譯器選項來定位您正在尋找的確切優化信息以及如何使用此信息來加速你的申請。
    的頭像 發表于 11-01 06:50 ?2594次閱讀

    編譯器優化對函數的影響

    編譯器如gcc,可以指定不同的優化參數,在某些條件下,有些函數可能會被優化掉。
    的頭像 發表于 06-22 14:58 ?2804次閱讀
    <b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>對函數的影響

    CompCert編譯器目標代碼生成機制研究綜述

    對 Compcert編譯器目標代碼生成機制進行剖析,主要介紹其設計邏輯、翻譯過程、語義保持性以及代碼結構,并給出了 Compcert編譯器
    發表于 05-07 10:17 ?7次下載

    如何編寫有利于編譯器優化代碼

    對于嵌入式系統,最終代碼的體積和效率取決于由編譯器生成的可執行代碼,而非開發人員編寫的源代碼;但是源代碼
    的頭像 發表于 03-29 15:58 ?1466次閱讀
    如何編寫有利于<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>的<b class='flag-5'>代碼</b>

    交叉編譯器安裝教程

    交叉編譯器中“交叉”的意思就是在一個架構編譯另外一個架構的代碼,相當于兩種架構“交叉”起來了。Ubuntu 自帶的 gcc 編譯器是針對
    的頭像 發表于 09-29 09:12 ?3449次閱讀

    編譯器如何對代碼進行優化(下)

    在學習 Andorid 逆向的過程中,發現無論是哪種編譯器,生成哪個平臺的代碼,其優化思路在本質如出一轍,在 Windwos 平臺所使用的技巧,在安卓平臺仍然適用,不外乎乘法除法計算
    的頭像 發表于 02-01 16:25 ?826次閱讀
    <b class='flag-5'>編譯器</b>如何對<b class='flag-5'>代碼</b><b class='flag-5'>進行</b><b class='flag-5'>優化</b>(下)

    編譯器優化選項

    一個程序首先要保證正確性,在保證正確性的基礎,性能也是一個重要的考量。要編寫高性能的程序,第一,必須選擇合適的算法和數據結構;第二,應該編寫編譯器能夠有效優化以轉換成高效可執行代碼
    的頭像 發表于 11-24 15:37 ?859次閱讀
    <b class='flag-5'>編譯器</b>的<b class='flag-5'>優化</b>選項

    Keil編譯器優化方法

    我們都知道,代碼是可以通過編譯器優化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優化選項。
    的頭像 發表于 10-23 16:35 ?338次閱讀
    Keil<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>方法