gcc 中 O選項對空函式的優化

2021-09-05 19:57:24 字數 1570 閱讀 6956

將空函式優化掉是一項很有意義的工作。比如,在程式中,常常要定義乙個列印函式。如果在 release時,把這個函式使用條件編譯定義為空函式。

且此空函式被優化掉,那就可以極大地提高程式的效能。

測試表明: 在gcc中,使用 -o可以優化掉內聯的空函式。預設情況下,空函式不會被優化掉。即使使用 -o,也不會優化掉非內聯的空函式。

內聯的空函式會被優化掉是很容易理解的。函式被內聯後,沒有了引數入棧出棧操作,自然也就無**可生成了。

但沒有優化選項是,內聯函式不會被優化,我卻想不通。既然 宣告為 inlinne,為什麼函式沒有被優化掉。那還要 inline何用?

下面分別是c原始檔, 未優化的彙編**,優化後的彙編**。

// source code empty.c

/* assembler code generated by gcc 3.2.3 on redhat platform

env: gcc: (gnu) 3.2.3 20030502 (red hat linux 3.2.3-47.3)

cmd: $ gcc -s -masm=intel -o emptyfun.c -o noopt.asm

*/

/*assembler code generated by gcc 3.2.3 with -o opition on redhat platform

env: gcc: (gnu) 3.2.3 20030502 (red hat linux 3.2.3-47.3)

cmd: $ gcc -s -masm=intel -o emptyfun.c -o opt.asm */

以下**完成了 列印錯誤訊息的功能:
#include 

<

stdio.h

>

#include 

<

stdlib.h

>

#include 

<

unistd.h

>

#include 

<

limits.h

>

#include 

<

errno.h

>

#include 

<

stdarg.h

>

#define

maxline 2048

#define

debug

/*err_doit 將使用者指定的字串和系統錯誤資訊列印到指定的檔案

fileno 檔案號

error  使用者定義字串

*/static

void

err_doit(

intfileno, 

interror, 

const

char

*fmt, va_list ap)

inline 

void

dbg_err(

const

char

*fmt,

intmain()

gcc中的 D選項

有時候我們想在 c 原始檔中使用 makefile 中定義的某些變數,根據變數的取值做出不同的處理,比如 debug 開關 版本資訊等,這時候我們可以通過 gcc 的 d 選項來滿足這一需求,它等同於在 c 檔案中通過 define 語句定義乙個巨集。比如,我們可以在 makefile 中定義以下變...

GCC中 I L l 選項的作用

在makefile中經常會看到這些選項,gcc缺省會在程式當前目錄 path路徑中查詢所需要的材料 如何給gcc新增我們自己的原材料 標頭檔案,庫等 imyinclude lb la整體舉例 cc g cflags g bin main objs main.o libs i usr include ...

關於編譯優化選項o3的問題

今天我在優化 的時候。出現了問題。如下 periph.c 讀暫存器,引數 位址 返回內容 unsigned int readcmd unsigned char addr main.c define readhdat0 readcmd spi hdat0 hdat0 readhdat0 讀 檔案幀頭資...