0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么樣的代碼會(huì)被編譯器優(yōu)化

學(xué)益得智能硬件 ? 來(lái)源:學(xué)益得智能硬件 ? 2025-01-16 16:38 ? 次閱讀

現(xiàn)在的編譯器有多智能,可能你辛辛苦苦寫的代碼,在編譯器看來(lái)就是幾句廢話,直接被刪除掉。

以 gcc 編譯器為例,編譯的時(shí)候可以加上 -O 選項(xiàng)來(lái)優(yōu)化代碼,優(yōu)化等級(jí)從 0 到 3。

寫一些簡(jiǎn)單的代碼給大家演示下。

#include 


void delay()
{
    for (int i = 0; i < 40000; i++)
        for (int j = 0; j < 10000; j++);
}


int main()
{
    printf("helloworld
");


    delay();


    printf("helloworld
");
    
    return 0;
}

比如在兩條輸出語(yǔ)句之間加上延時(shí),正常的現(xiàn)象是這樣的,很明顯,延時(shí)函數(shù)起了作用。

如果編譯的時(shí)候加上 O1 優(yōu)化選項(xiàng),在編譯器看來(lái),delay 函數(shù)什么事都沒干,可以直接刪掉。

比較兩者的匯編代碼,就能看出開啟 O1 優(yōu)化后,主函數(shù)中沒有調(diào)用 delay,運(yùn)行的現(xiàn)象也確實(shí)沒有延時(shí)。

再比如這樣的代碼,test 函數(shù)直接返回了 1234。

如果不開啟優(yōu)化,主函數(shù)會(huì)調(diào)用 test 函數(shù),如果開啟了優(yōu)化,編譯器會(huì)跳過調(diào)用 test 函數(shù),直接取他的返回值來(lái)使用。

再來(lái)看下 O2 優(yōu)化級(jí)別,比如這個(gè)代碼:

#include 


void test()
{
    printf("helloworld
");
}


int main()
{
    for (int i = 0; i < 3; i++)
    {   
        test();
    }   


    return 0;
}

循環(huán)調(diào)用 test 函數(shù),test 函數(shù)也只是簡(jiǎn)單的使用 printf 輸出字符串。

三份匯編代碼分別對(duì)應(yīng)三個(gè)不同的優(yōu)化級(jí)別,沒開優(yōu)化,O1 優(yōu)化,O2 優(yōu)化。

沒開優(yōu)化的時(shí)候,匯編代碼就是對(duì)應(yīng) C 代碼,有循環(huán),循環(huán)中調(diào)用 test 函數(shù)。

開啟 O1 優(yōu)化,循環(huán)沒了,直接調(diào)用三次 test 函數(shù),因?yàn)檠h(huán)確實(shí)浪費(fèi)時(shí)間。

開啟 O2 優(yōu)化,這次直接把 test 函數(shù)跳過,主函數(shù)中直接調(diào)用 puts 函數(shù),這里的 puts ,就是 printf 優(yōu)化而來(lái),前面講過,使用 printf 直接輸出字符串,編譯器會(huì)默認(rèn)優(yōu)化成 puts。

最后還有一個(gè)級(jí)別是 O3,O3 在 O2 的基礎(chǔ)上優(yōu)化更深。不過關(guān)于 O3 的優(yōu)化并沒有找到簡(jiǎn)短的代碼,這里就不給大家做演示。

在平時(shí)的學(xué)習(xí)中并不建議使用編譯器的優(yōu)化策略,尤其是更高級(jí)別的優(yōu)化,為了提升代碼的運(yùn)行效率,很多時(shí)候編譯器會(huì)調(diào)整代碼結(jié)構(gòu),導(dǎo)致運(yùn)行的結(jié)果跟我們預(yù)期不一樣。作為初學(xué)者,知道有這么回事就行。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4344

    瀏覽量

    62809
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4809

    瀏覽量

    68817
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1640

    瀏覽量

    49198

原文標(biāo)題:什么樣的代碼會(huì)被編譯器優(yōu)化

文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何編寫有利于編譯器優(yōu)化代碼

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

    請(qǐng)問是否有關(guān)于類似編譯器或者堆棧的文檔,或者編譯器自動(dòng)壓棧個(gè)數(shù)所依據(jù)的規(guī)則是什么樣的?

    入棧大小與入?yún)⒌膫€(gè)數(shù)、入?yún)⒌念愋蜕踔?b class='flag-5'>編譯器優(yōu)化開的優(yōu)化級(jí)別都有關(guān)系。因此想問一下是否有關(guān)于類似編譯器或者堆棧的文檔,或者編譯器自動(dòng)壓棧個(gè)數(shù)所
    發(fā)表于 06-25 02:26

    SIMD計(jì)算機(jī)的優(yōu)化編譯器設(shè)計(jì)

    利用處理的相關(guān)資源,提高編譯器優(yōu)化性能和增強(qiáng)代碼可適應(yīng)性是SIMD處理優(yōu)化
    發(fā)表于 04-03 08:47 ?30次下載

    Keil C編譯器編程規(guī)則和代碼優(yōu)化

    本內(nèi)容介紹了Keil C編譯器編程規(guī)則和代碼優(yōu)化,要實(shí)用好單片機(jī)就必須清楚它的內(nèi)部結(jié)構(gòu)組織結(jié)構(gòu),無(wú)論是在芯片的選擇還是代碼的編寫
    發(fā)表于 04-20 17:37 ?315次下載
    Keil C<b class='flag-5'>編譯器</b>編程規(guī)則和<b class='flag-5'>代碼</b><b class='flag-5'>優(yōu)化</b>

    編譯器_keil的優(yōu)化選項(xiàng)問題

    keil編譯器優(yōu)化選項(xiàng)針對(duì)ARM,對(duì)STM32編譯的一些優(yōu)化的問題
    發(fā)表于 02-25 14:18 ?3次下載

    C編譯器及其優(yōu)化

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

    編譯器優(yōu)化對(duì)函數(shù)的影響

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

    如何編寫有利于編譯器優(yōu)化代碼

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

    編譯器如何對(duì)代碼進(jìn)行優(yōu)化(上)

    在學(xué)習(xí) Andorid 逆向的過程中,發(fā)現(xiàn)無(wú)論是哪種編譯器,生成哪個(gè)平臺(tái)的代碼,其優(yōu)化思路在本質(zhì)上如出一轍,在 Windwos 平臺(tái)所使用的技巧,在安卓平臺(tái)仍然適用,不外乎乘法除法計(jì)算的優(yōu)化
    的頭像 發(fā)表于 02-01 16:25 ?933次閱讀

    編譯器如何對(duì)代碼進(jìn)行優(yōu)化(下)

    在學(xué)習(xí) Andorid 逆向的過程中,發(fā)現(xiàn)無(wú)論是哪種編譯器,生成哪個(gè)平臺(tái)的代碼,其優(yōu)化思路在本質(zhì)上如出一轍,在 Windwos 平臺(tái)所使用的技巧,在安卓平臺(tái)仍然適用,不外乎乘法除法計(jì)算的優(yōu)化
    的頭像 發(fā)表于 02-01 16:25 ?873次閱讀
    <b class='flag-5'>編譯器</b>如何對(duì)<b class='flag-5'>代碼</b>進(jìn)行<b class='flag-5'>優(yōu)化</b>(下)

    編譯器優(yōu)化選項(xiàng)

    一個(gè)程序首先要保證正確性,在保證正確性的基礎(chǔ)上,性能也是一個(gè)重要的考量。要編寫高性能的程序,第一,必須選擇合適的算法和數(shù)據(jù)結(jié)構(gòu);第二,應(yīng)該編寫編譯器能夠有效優(yōu)化以轉(zhuǎn)換成高效可執(zhí)行代碼的源代碼
    的頭像 發(fā)表于 11-24 15:37 ?938次閱讀
    <b class='flag-5'>編譯器</b>的<b class='flag-5'>優(yōu)化</b>選項(xiàng)

    Keil編譯器優(yōu)化方法

    我們都知道,代碼是可以通過編譯器優(yōu)化的,有的時(shí)候,為了提高運(yùn)行速度或者減少代碼尺寸,會(huì)開啟優(yōu)化選項(xiàng)。
    的頭像 發(fā)表于 10-23 16:35 ?713次閱讀
    Keil<b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>方法

    Triton編譯器與其他編譯器的比較

    的GPU編程框架,使開發(fā)者能夠編寫出接近手工優(yōu)化的高性能GPU內(nèi)核。 其他編譯器 (如GCC、Clang、MSVC等): 定位:通用編譯器,支持多種編程語(yǔ)言,廣泛應(yīng)用于各種軟件開發(fā)場(chǎng)景。 目標(biāo):提供穩(wěn)定、高效的
    的頭像 發(fā)表于 12-24 17:25 ?416次閱讀

    Triton編譯器優(yōu)化技巧

    在現(xiàn)代計(jì)算環(huán)境中,編譯器的性能對(duì)于軟件的運(yùn)行效率至關(guān)重要。Triton 編譯器作為一個(gè)先進(jìn)的編譯器框架,提供了一系列的優(yōu)化技術(shù),以確保生成的代碼
    的頭像 發(fā)表于 12-25 09:09 ?267次閱讀

    Triton編譯器如何提升編程效率

    在現(xiàn)代軟件開發(fā)中,編譯器扮演著至關(guān)重要的角色。它們不僅將高級(jí)語(yǔ)言代碼轉(zhuǎn)換為機(jī)器可執(zhí)行的代碼,還通過各種優(yōu)化技術(shù)提升程序的性能。Triton 編譯器
    的頭像 發(fā)表于 12-25 09:12 ?275次閱讀