您的位置:首页 > 其它

新发现 -- -struct 的内存管理 -- 4字节对齐问题

2013-09-02 17:39 761 查看
我们都知道,在 C 语言的 struct 结构体中,会存在 4 字节对齐的问题,就是为了能够快速地读取该结构的内存,提高访问速度。

但是,在 VS2008 和 Fedora14系统自带的 gcc 编译器中,编译如下的代码:

struct A

{

 char i;

 char j;

 char x;

 char y;

 char z;

};

int main(void)

{

 struct A a;

 printf("sizeof(struct A) = %d \n", sizeof(struct A));

 printf("sizeof(struct a) = %d \n", sizeof(a));

 printf("hehe ......\n");

 return 0;

}

运行的结果是:

[weikaifeng@weikaifeng test]$ gcc test.c -o test

[weikaifeng@weikaifeng test]$ ./test

sizeof(struct A) = 5

sizeof(struct a) = 5

hehe ......

此时,没有出现了所谓的 struct 需要“4字节内存对齐”的问题。根据该结构的定义是:

struct A

{

 char i;

 char j;

 char x;

 char y;

 char z;

};

其实,与如下的定义一样:

char A[5];

所以,编译器在碰到这样的结构体时,就当作一个数组来使用,因为,该结构体中的所有 成员 都是同样的类型,与数组一样。

所以,编译器就把它当作 数组 来操作。

那么,根据这个推理,我们为了让 struct A 不能够作为 数组 来处理,就是要求其成员有不同的类型,所以,修改如下:

struct A

{

 char i;

 int y;

};

int main(void)

{

 struct A a;

 printf("sizeof(struct A) = %d \n", sizeof(struct A));

 printf("sizeof(struct a) = %d \n", sizeof(a));

 printf("hehe ......\n");

 return 0;

}

运行结果如下:

[weikaifeng@weikaifeng test]$ gcc test.c -o test

[weikaifeng@weikaifeng test]$ ./test

sizeof(struct A) = 8

sizeof(struct a) = 8

hehe ......

可以看到,此时,就产生了“4字节内存对齐”的问题。

那么,自己得出总结:

1 当 struct 中的成员都是同样的类型是,编译器会把它内存管理当作一个数组来操作。

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: