新发现 -- -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 中的成员都是同样的类型是,编译器会把它内存管理当作一个数组来操作。
但是,在 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 中的成员都是同样的类型是,编译器会把它内存管理当作一个数组来操作。
相关文章推荐
- 关于struct和union存储的内存字节对齐的问题
- 结构体struct的成员变量字节对齐问题详解
- C struct 中字节对齐问题(转)
- struct的字节对齐问题(通过pragma pack(n)改变字节对齐的例子)
- struct 中字节对齐问题
- C struct 中字节对齐问题
- struct的字节对齐问题(通过pragma pack(n)改变字节对齐的例子)
- python struct.pack中的对齐字节问题
- C struct 中字节对齐问题
- struct/class等内存字节对齐问题详解
- struct/class等内存字节对齐问题详解
- C struct 中字节对齐问题
- 关于struct结构中字节对齐问题
- struct中的字节对齐问题
- struct与union字节对齐问题
- C++:struct和union 内存字节对齐问题
- struct字节对齐问题
- struct字节对齐+柔性数组问题
- struct字节对齐问题
- C/C++中的struct字节对齐问题