32bitプロセスと64bitプロセスで、glibcのtime_t変数のビット数がどう違うのか確認してみました。
サンプルプログラム
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #define sizeof_bits(x) (int)sizeof(x)*8 int main() { printf("char size:= bits\n",sizeof_bits(char)); printf("int size:= bits\n",sizeof_bits(int)); printf("long size:= bits\n",sizeof_bits(long)); printf("long long size:= bits\n",sizeof_bits(long long)); printf("struct timeval { ->size:= bits\n",sizeof_bits(struct timeval)); printf(" time_t tv_sec; ->size:= bits\n",sizeof_bits(time_t)); printf(" suseconds_t tv_usec; ->size:= bits\n",sizeof_bits(suseconds_t)); printf("}\n"); return(EXIT_SUCCESS); }
実機確認
(1)コンパイル、(2)fileコマンドで32bitのバイナリ形式であることを確認、(3)実行してビット数を確認の流れです。
time_tが32bitプロセスの場合は32bit、64bitプロセスの場合は64bitであることが解ります。
ちなみに、32/64bitプロセスで、char、int、long long型は差異が無く、long型が32/64bitでそれぞれ差異がある事も確認できます。
32bitプロセスの場合
- long変数が、32bitである。
- time_tも、32bitである。
$ gcc -m32 -o time-32 time.c
$
$ file time-32
time-32: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=e4d3d5ef99b4f5178372ff254729b284fc429946, not stripped
$ ./time-32
char size: 8 bits
int size: 32 bits
long size: 32 bits
long long size: 64 bits
struct timeval { ->size: 64 bits
time_t tv_sec; ->size: 32 bits
suseconds_t tv_usec; ->size: 32 bits
}
64bitプロセスの場合
- long変数が、64bitである。
- time_tも、64bitである。
$ gcc -m64 -o time-64 time.c
$
$ file time-64
time-64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=dc935a4fb6c31c98544e90fc740d59cd4b9db081, not stripped
$ ./time-64
char size: 8 bits
int size: 32 bits
long size: 64 bits
long long size: 64 bits
struct timeval { ->size:128 bits
time_t tv_sec; ->size: 64 bits
suseconds_t tv_usec; ->size: 64 bits
}
蛇足
glibcのコード上からも裏付けとろうと思ったのですが、時間がないのでやめました。