马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//定义在 <cstddef> 头文件中 #include <cstddef>
struct MyStruct
{
int a;
char b;
double c;
};
void CoffsetofDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
size_t offsetA = offsetof(MyStruct, a);
/*
offsetof 是一个宏,用于获取结构体中特定成员的偏移量(offset)
第一个参数是结构体的名字,第二个参数是结构体成员的名字
返回结构体中成员的偏移量。偏移量是size_t类型的
offsetA=0
*/
size_t offsetB = offsetof(MyStruct, b);
//offsetB=4
size_t offsetC = offsetof(MyStruct, c);
//offsetC=8
}
我的问题:int是4个字节,char是1个字节,我认为c的偏移量是5,不应该是8 ?
根据您提供的代码,结构体 MyStruct的成员按照声明顺序存放在内存中,对齐方式可能会影响成员的偏移量计算。
默认情况下,对于大多数编译器,结构体成员的对齐方式是按照成员的自身大小对齐。在您的示例中, int占用4个字节, char占用1个字节, double占用8个字节。
根据默认的对齐方式,成员 a和 b的对齐需满足其自身大小。所以, int占用4个字节,对齐后的偏移量为0; char占用1个字节,对齐后的偏移量为4。
而对于 double,由于其大小为8个字节,某些编译器默认要求 double的对齐方式为8个字节。因此,在结构体中,成员 a之后会插入一些填充字节以满足对齐要求。
这就解释了为什么成员 c的偏移量是8而不是5。在这种情况下,由于 a和 b的对齐要求,编译器在 a之后添加了3个填充字节,然后才将成员 c放置在偏移量为8的位置。
因此,根据默认对齐方式计算得出的 a的偏移量是0, b的偏移量是4, c的偏移量是8。请注意,在不同的编译器和编译选项下,对齐方式可能会有所不同。
如果您希望更精细地控制结构体成员的对齐方式,可以使用特定的对齐指令(如 #pragma pack)来设置对齐规则。
球一个最佳答案谢谢啦!这对我非常重要! 
|