最近のGCCは標準関数を使ったコードがコンパイル時に計算されてしまうことがあって、良くできている。
例えば、GCCで文字列リテラルを
strlen
へ渡すと、定数に置き換えられる。
入力コード例: リテラル文字を
strlen
で数えて返す関数。
#include <string.h>
int func()
{
return strlen("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
}
私の手元にある gcc 13.3.1 20240522 (Red Hat 13.3.1-1) を使用してコンパイルする。
$ cc -O1 -S a.c
コンパイル結果:
-O1
でコンパイルしたところ、26を返すだけの関数にコンパイルされる。
func:
.LFB0:
.cfi_startproc
movl $26, %eax
ret
.cfi_endproc
具体的な使用例としては、マクロ定義したリテラル文字をその長さと一緒に
strncmp
へ渡すときのような場合があるだろう。
#define PREFIX "com.example."
int check_prefix(const char *text)
{
if (strncmp(text, PREFIX, strlen(PREFIX)) == 0)
return 1;
return 0;
}
このようなコードを書いた時、
strlen
が呼び出されるので処理時間が無駄になるなどと考える必要はない。