如何实现结构体字节对齐的最佳方式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2470个文字,预计阅读时间需要10分钟。
结构体偏移量+在定义结构体类型后,结构体成员的内存布局就确定了。
结构体偏移量
在定义结构体类型后,则结构体中的成员内存布局就定下了。
#include <stdio.h>typedef struct Test
{
int a;
int b;
int c;
}Test;
int main()
{
Test t;
Test*p = NULL;
p = &t;
//b相对于结构体Test的偏移量,n1=4
int n1 = (int)&(p->b) - (int)p;
//绝对0地址b的偏移量, n2=4
int n2 = (int)&( ( (Test *)0 )->b);
printf("n1:%d \n", n1);
printf("n2:%d \n", n2);
return 0;
}
内存字节对齐
在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。
本文共计2470个文字,预计阅读时间需要10分钟。
结构体偏移量+在定义结构体类型后,结构体成员的内存布局就确定了。
结构体偏移量
在定义结构体类型后,则结构体中的成员内存布局就定下了。
#include <stdio.h>typedef struct Test
{
int a;
int b;
int c;
}Test;
int main()
{
Test t;
Test*p = NULL;
p = &t;
//b相对于结构体Test的偏移量,n1=4
int n1 = (int)&(p->b) - (int)p;
//绝对0地址b的偏移量, n2=4
int n2 = (int)&( ( (Test *)0 )->b);
printf("n1:%d \n", n1);
printf("n2:%d \n", n2);
return 0;
}
内存字节对齐
在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。

