【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

関数のサイズ

第6回 コンパイラ実装会で出た話題です。

関数のサイズを取ろうとしたら1になりました。なぜ?

test.c
#include <stdio.h>

int main(void) {
    printf("%d\n", sizeof(putchar));
    return 0;
}
実行結果
$ gcc test.c
$ ./a.exe
1

int aへのポインタが&aであるように、putcharへのポインタは&putcharです。ANSI Cでは関数ポインタの代入や呼び出しで&や*が省略できますが、sizeof()では省略できません。本来sizeof(関数)は関数の中にあるバイナリのサイズになるはずですが、取得することに意味がないため1になるようです。

C++ではエラーになります。

$ g++ test.c
test.c: In function 'int main()':
test.c:4:34: error: ISO C++ forbids applying 'sizeof' to an expression of function type [-fpermissive]

関数ポインタのサイズを取得するには、前述のように&putcharとしてポインタを取ります。

test.c
#include <stdio.h>

int main(void) {
    printf("%d\n", sizeof(&putchar));
    return 0;
}
実行結果
$ gcc test.c
$ ./a.exe
4
$ g++ test.c
$ ./a.exe
4