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のコード上からも裏付けとろうと思ったのですが、時間がないのでやめました。