sizeof
演算子を用いて
char
int
short
long
long long
float
double
long double
size_t
のそれぞれの型の大きさを得るためのプログラムをx86_64版のGNU/Linux上で作成してx86_32版とx86_64版をそれぞれコンパイルし、結果を比較してみることにする。
ここでは更にその後x86_64に導入されたx32 ABIとも比較してみる。
sizeoftest.c
ライセンス:CC0
#include <stdlib.h>
#include <stdio.h>
/*
* Print sizes of types (char, int, short,
* long, long long, float, double, long double, and size_t)
*
* (x86_32 = x86)
* gcc -m32 -Wall -Wextra sizeoftest.c -o sizeoftest32
*
* (x86_64 = x64)
* gcc -m64 -Wall -Wextra sizeoftest.c -o sizeoftest64
*
* (x32)
* gcc -mx32 -Wall -Wextra sizeoftest.c -o sizeoftestx32
*
* +-------------+-----+-----+-----+
* | type | x86 | x64 | x32 |
* +-------------+-----+-----+-----+
* | char | 1 | 1 | 1 |
* | int | 4 | 4 | 4 |
* | short | 2 | 2 | 2 |
* | long | 4 | 8 | 4 | <- x86 = x32 != x64
* | long long | 8 | 8 | 8 |
* | float | 4 | 4 | 4 |
* | double | 8 | 8 | 8 |
* | long double | 12 | 16 | 16 | <- x64 = x32 != x86
* | size_t | 4 | 8 | 4 | <- x86 = x32 != x64
* | void * | 4 | 8 | 4 | <- x86 = x32 != x64
* +-------------+-----+-----+-----+
*/
int
main ()
{
printf ("\
char : %2zu\n\
int : %2zu\n\
short : %2zu\n\
long : %2zu\n\
long long : %2zu\n\
float : %2zu\n\
double : %2zu\n\
long double : %2zu\n\
size_t : %2zu\n\
void * : %2zu\n",
sizeof (char),
sizeof (int),
sizeof (short),
sizeof (long),
sizeof (long long),
sizeof (float),
sizeof (double),
sizeof (long double),
sizeof (size_t),
sizeof (void *));
return EXIT_SUCCESS;
}
(x86_32版を実行)
$ /path/to/sizeoftest32
char : 1
int : 4
short : 2
long : 4
long long : 8
float : 4
double : 8
long double : 12
size_t : 4
void * : 4
(x86_64版を実行)
$ /path/to/sizeoftest64
char : 1
int : 4
short : 2
long : 8
long long : 8
float : 4
double : 8
long double : 16
size_t : 8
void * : 8
(x32版を実行)
$ /path/to/sizeoftestx32
char : 1
int : 4
short : 2
long : 4
long long : 8
float : 4
double : 8
long double : 16
size_t : 4
void * : 4
サイズの異なる部分があるのは以下の4つの型であることが確認できた。
型 | x86_32 | x86_64 | x32 |
---|---|---|---|
long |
4 | 8 | 4 |
long double |
12 | 16 | 16 |
size_t |
4 | 8 | 4 |
void * |
4 | 8 | 4 |