Возможно, вы захотите изучить выходные данные этой программы - скомпилированные как для 32-разрядных, так и для 64-разрядных на Intel Mac с MacOS X 10.6.2.
/*
@(#)File: $RCSfile: typesize.c,v $
@(#)Version: $Revision: 1.7 $
@(#)Last changed: $Date: 2008/12/21 18:25:17 $
@(#)Purpose: Structure sizes/alignments
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 1990,1997,2004,2007-08
@(#)Product: :PRODUCT:
*/
#include <stdio.h>
#include <time.h>
#include <stddef.h>
#if __STDC_VERSION__ >= 199901L
#include <inttypes.h>
#endif /* __STDC_VERSION__ */
#define SPRINT(x) printf("%2u = sizeof(" #x ")\n", (unsigned int)sizeof(x))
int main(void)
{
/* Basic Types */
SPRINT(char);
SPRINT(unsigned char);
SPRINT(short);
SPRINT(unsigned short);
SPRINT(int);
SPRINT(unsigned int);
SPRINT(long);
SPRINT(unsigned long);
#if __STDC_VERSION__ >= 199901L
SPRINT(long long);
SPRINT(unsigned long long);
SPRINT(uintmax_t);
#endif /* __STDC_VERSION__ */
SPRINT(float);
SPRINT(double);
SPRINT(long double);
SPRINT(size_t);
SPRINT(ptrdiff_t);
SPRINT(time_t);
/* Pointers */
SPRINT(void *);
SPRINT(char *);
SPRINT(short *);
SPRINT(int *);
SPRINT(long *);
SPRINT(float *);
SPRINT(double *);
/* Pointers to functions */
SPRINT(int (*)(void));
SPRINT(double (*)(void));
SPRINT(char *(*)(void));
/* Structures */
SPRINT(struct { char a; });
SPRINT(struct { short a; });
SPRINT(struct { int a; });
SPRINT(struct { long a; });
SPRINT(struct { float a; });
SPRINT(struct { double a; });
SPRINT(struct { char a; double b; });
SPRINT(struct { short a; double b; });
SPRINT(struct { long a; double b; });
SPRINT(struct { char a; char b; short c; });
SPRINT(struct { char a; char b; long c; });
SPRINT(struct { short a; short b; });
SPRINT(struct { char a[3]; char b[3]; });
SPRINT(struct { char a[3]; char b[3]; short c; });
SPRINT(struct { long double a; });
SPRINT(struct { char a; long double b; });
#if __STDC_VERSION__ >= 199901L
SPRINT(struct { char a; long long b; });
#endif /* __STDC_VERSION__ */
return(0);
}
Вывод из 64-битной компиляции:
1 = sizeof(char)
1 = sizeof(unsigned char)
2 = sizeof(short)
2 = sizeof(unsigned short)
4 = sizeof(int)
4 = sizeof(unsigned int)
8 = sizeof(long)
8 = sizeof(unsigned long)
8 = sizeof(long long)
8 = sizeof(unsigned long long)
8 = sizeof(uintmax_t)
4 = sizeof(float)
8 = sizeof(double)
16 = sizeof(long double)
8 = sizeof(size_t)
8 = sizeof(ptrdiff_t)
8 = sizeof(time_t)
8 = sizeof(void *)
8 = sizeof(char *)
8 = sizeof(short *)
8 = sizeof(int *)
8 = sizeof(long *)
8 = sizeof(float *)
8 = sizeof(double *)
8 = sizeof(int (*)(void))
8 = sizeof(double (*)(void))
8 = sizeof(char *(*)(void))
1 = sizeof(struct { char a; })
2 = sizeof(struct { short a; })
4 = sizeof(struct { int a; })
8 = sizeof(struct { long a; })
4 = sizeof(struct { float a; })
8 = sizeof(struct { double a; })
16 = sizeof(struct { char a; double b; })
16 = sizeof(struct { short a; double b; })
16 = sizeof(struct { long a; double b; })
4 = sizeof(struct { char a; char b; short c; })
16 = sizeof(struct { char a; char b; long c; })
4 = sizeof(struct { short a; short b; })
6 = sizeof(struct { char a[3]; char b[3]; })
8 = sizeof(struct { char a[3]; char b[3]; short c; })
16 = sizeof(struct { long double a; })
32 = sizeof(struct { char a; long double b; })
16 = sizeof(struct { char a; long long b; })
Вывод из 32-битной компиляции:
1 = sizeof(char)
1 = sizeof(unsigned char)
2 = sizeof(short)
2 = sizeof(unsigned short)
4 = sizeof(int)
4 = sizeof(unsigned int)
4 = sizeof(long)
4 = sizeof(unsigned long)
8 = sizeof(long long)
8 = sizeof(unsigned long long)
8 = sizeof(uintmax_t)
4 = sizeof(float)
8 = sizeof(double)
16 = sizeof(long double)
4 = sizeof(size_t)
4 = sizeof(ptrdiff_t)
4 = sizeof(time_t)
4 = sizeof(void *)
4 = sizeof(char *)
4 = sizeof(short *)
4 = sizeof(int *)
4 = sizeof(long *)
4 = sizeof(float *)
4 = sizeof(double *)
4 = sizeof(int (*)(void))
4 = sizeof(double (*)(void))
4 = sizeof(char *(*)(void))
1 = sizeof(struct { char a; })
2 = sizeof(struct { short a; })
4 = sizeof(struct { int a; })
4 = sizeof(struct { long a; })
4 = sizeof(struct { float a; })
8 = sizeof(struct { double a; })
12 = sizeof(struct { char a; double b; })
12 = sizeof(struct { short a; double b; })
12 = sizeof(struct { long a; double b; })
4 = sizeof(struct { char a; char b; short c; })
8 = sizeof(struct { char a; char b; long c; })
4 = sizeof(struct { short a; short b; })
6 = sizeof(struct { char a[3]; char b[3]; })
8 = sizeof(struct { char a[3]; char b[3]; short c; })
16 = sizeof(struct { long double a; })
32 = sizeof(struct { char a; long double b; })
12 = sizeof(struct { char a; long long b; })
Вы можете играть во все виды игр со структурами. Ключевым моментом является то, что требования к выравниванию для разных типов различаются. В зависимости от платформы у вас могут быть более или менее строгие требования. SPARC суетливый; Intel, как правило, выполняет больше работы, если вы делаете неправильный доступ (поэтому он медленный, но работает); старые микросхемы DEC Alpha (и я думаю, что микросхемы MIPS RISC) можно переключать на другое поведение, либо более эффективно, всегда требуя согласованного доступа, либо менее эффективно имитируя то, что делают чипы Intel.