#include
//gcc ubuntu 32位机
#pragma pack(8)
typedef struct m
{
char a ;
long b ;
} M;
typedef struct n
{
char a ;
char b ;
long c ;
} N;
typedef struct x
{
char a ;
struct m b ;
long long c ;
} X;
typedef struct y
{
char a ;
struct n b ;
long long c ;
} Y;
#pragma pack()
#define ADDR(addr) ((unsigned int)(addr))
void main(void)
{
printf("sizeof(char):%d sizeof(short):%d sizeof(int):%d sizeof(long):%d sizeof(long long):%d\n",\
sizeof(char),sizeof(short),sizeof(int),sizeof(long),sizeof(long long));
printf("sizeof(M):%d sizeof(N):%d sizeof(X):%d sizeof(Y):%d\n",sizeof(M),sizeof(N),sizeof(X),sizeof(Y)) ;
M m ;
N n ;
X x ;
Y y ;
printf("m.a:%d m.b:%d \n",ADDR(&m.a)-ADDR(&m),ADDR(&m.b)-ADDR(&m));
printf("n.a:%d n.b:%d n.c:%d \n",ADDR(&n.a)-ADDR(&n),ADDR(&n.b)-ADDR(&n),ADDR(&n.c)-ADDR(&n));
printf("x.a:%d x.b.a:%d x.b.b:%d x.c:%d\n",ADDR(&x.a)-ADDR(&x),ADDR(&x.b.a)-ADDR(&x),ADDR(&x.b.b)-ADDR(&x),ADDR(&x.c)-ADDR(&x));
printf("y.a:%d y.b.a:%d y.b.b:%d y.b.c:%d y.c:%d\n",ADDR(&y.a)-ADDR(&y),ADDR(&y.b.a)-ADDR(&y),ADDR(&y.b.b)-ADDR(&y),ADDR(&y.b.c)-ADDR(&y),ADDR(&y.c)-ADDR(&y));
return ;
}
/*
程序运行结果:
sizeof(char):1 sizeof(short):2 sizeof(int):4 sizeof(long):4
sizeof(long long):8
sizeof(M):8 sizeof(N):8 sizeof(X):20 sizeof(Y):20
m.a:0 m.b:4
n.a:0 n.b:1 n.c:4
x.a:0 x.b.a:4 x.b.b:8 x.c:12//这里的x.c没有对其到可被8整除的地址上
//系统是按4字节对其的吗?32位的系统8字节对齐没有意义?
//32位的系统,8字节的数据采用8字节的对齐方式,内存的读取
//也要读取多次,对其到8字节浪费空间,且不能加快读取速度
//因为32为的系统,数据总线是32位,一次最多也就只能取4个
//字节的数据,8字节的数据,对齐到4字节和对齐到8字节是一样的
//内存的硬件电路决定了,最大也就4字节对齐,大于4字节的对齐是没有意义的
y.a:0 y.b.a:4 y.b.b:5 y.b.c:8 y.c:12//这里的y.c没有对其到可被8整除的地址上
*/
/*
把#pragma pack(8) 改为 #pragma pack(1)
程序运行结果:
sizeof(char):1 sizeof(short):2 sizeof(int):4 sizeof(long):4
sizeof(long long):8
sizeof(M):5 sizeof(N):6 sizeof(X):14 sizeof(Y):15
m.a:0 m.b:1
n.a:0 n.b:1 n.c:2
x.a:0 x.b.a:1 x.b.b:2 x.c:6
y.a:0 y.b.a:1 y.b.b:2 y.b.c:3 y.c:7
*/
/*
把#pragma pack(8) 改为 #pragma pack(4)
程序运行结果:
sizeof(char):1 sizeof(short):2 sizeof(int):4 sizeof(long):4
sizeof(long long):8
sizeof(M):8 sizeof(N):8 sizeof(X):20 sizeof(Y):20
m.a:0 m.b:4
n.a:0 n.b:1 n.c:4
x.a:0 x.b.a:4 x.b.b:8 x.c:12
y.a:0 y.b.a:4 y.b.b:5 y.b.c:8 y.c:12
*/
本文标题:c语言结构体对齐
URL标题:
http://cxhlcq.com/article/jeejcj.html