2024-07-28

GCCでは文字列リテラルをstrlenへ渡すと定数に展開される

最近の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 が呼び出されるので処理時間が無駄になるなどと考える必要はない。

0 件のコメント:

コメントを投稿