C++ 为什么offsetof(成员)等于sizeof(结构)?
我将结构定义为:C++ 为什么offsetof(成员)等于sizeof(结构)?,c++,arrays,sizeof,offsetof,C++,Arrays,Sizeof,Offsetof,我将结构定义为: struct smth { char a; int b[]; }; 当我在此结构上调用sizeof和offsetof时: cout << sizeof(struct smth) << endl; cout << offsetof(struct smth, b) << endl; 为什么当stuct的大小是4,char使用1字节时,int数组的偏移量是4? 为什么会有填充物? 另外,为什么int数组根本不占用任何
struct smth
{
char a;
int b[];
};
当我在此结构上调用sizeof
和offsetof
时:
cout << sizeof(struct smth) << endl;
cout << offsetof(struct smth, b) << endl;
为什么当stuct的大小是4,char使用1字节时,int数组的偏移量是4?
为什么会有填充物?
另外,为什么int数组根本不占用任何空间
为什么当stuct的大小是4,char使用1字节时,int数组的偏移量是4?为什么会有填充物
有填充,因为C标准允许它;编译器经常对齐变量以提高性能
另外,为什么第二个变量根本不占用任何空间(看起来是这样的)
它是一个C99灵活阵列成员-这就是它的全部要点。这样做的目的是分配您的结构,例如:
struct smth *s = malloc(sizeof *s + 10 * sizeof s->b[0]);
然后你会有一个结构,就像
b
是一个10元素数组一样运行。因为成员b
的大小为零,编译器在a
和b
成员之间添加填充,使得b
位于“字”边界上
但是,如果我记得正确的,在这样的结构中有一个灵活的数组,除了C编译器之外,只有C++,而不是C++。
struct smth
{
char a;
int b[];
};
数组> <代码> b[] /Cord>在C++中无效。数组必须具有固定大小。可变长度数组仅在C99中有效
假设编译器支持它作为扩展,那么数组
b[]
的大小为零,这使得结构只包含char
成员。在struct
中填充的规则是有效的,将struct
填充到一个字中,这个字在您的机器中有4个字节。您的意思是偏移(struct smth,b)
,对吗?@CarlNorum是的,我知道。是C还是C++?它们是不同的。@宇浩我特别要求C++,但是添加了C标签,所以人们也可以用它来找到它。这个问题的答案是什么?@biox6你应该用相对的标签来标记这个问题。C和C++在很多领域可能是相似的,它们在不同的方面是不同的。在这个问题上,例如,可变长度数组只在C中有效,而不是C++。这允许什么样的性能改进?只是好奇。@biox6,一些处理器加载指令只能从字对齐的地址加载字。如果你在一个不对齐的地址有一个词,你需要单独加载每个字节并重新组合。你的分配语句不考虑对齐约束。通常,它将无法分配正确的内存量。您可以使用struct smth*s=malloc(offsetof(struct smth,b[10])分配一个大小合适的结构代码>@IInspectable,怎么会这样<代码>malloc
需要返回安全对齐的指针,并且结构布局正确。有什么区别?可能是10*sizeof s->b[0]
这是intb[]
相当于int*b?不,不是int*b
将使sizeof(smth)
更大,额外的空间将用于存储某些int变量的地址。相反,int b[]
表示该结构应作为单个内存块动态分配一些整数(编译时未知)。@mity如何为变量b
赋值,您能给我赋值吗statement@Light参见卡尔·诺伦的答案。@Light:Givenstruct smth*s=malloc(sizeof(*s)+10*sizeof(*s->b));
,您可以编写s->a='c';s->b[0]=0;s->b[9]=9;
,等等。
struct smth
{
char a;
int b[];
};