將空函式優化掉是一項很有意義的工作。比如,在程式中,常常要定義乙個列印函式。如果在 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 讀 檔案幀頭資...