C++;:结构尺寸? 我的C++代码 < /p> #include <iostream> using namespace std ; struct Node { int data ; struct Node *next; }; int main(){ struct Node *head = NULL; struct Node *second = NULL; cout << sizeof(struct Node); }

C++;:结构尺寸? 我的C++代码 < /p> #include <iostream> using namespace std ; struct Node { int data ; struct Node *next; }; int main(){ struct Node *head = NULL; struct Node *second = NULL; cout << sizeof(struct Node); },c++,C++,16号的怎么样? int的大小是4字节。 怎么会乘以4呢? 有人能详细计算一下吗? 谢谢 一个int实际上是4个字节(至少在x86 64位机器中是这样)。指针(至少在x86 64位机器中)是8个字节,因此理论上结构可能是12个字节。然而,它被填充为本机单词大小(8字节)的乘法,12字节的密室取整将是16字节。结构被压缩为使用的“最大单词”的大小。例如,如果你有这样的结构: struct ThreeBytes { char one; short two; }; 它的大小

16号的怎么样? int的大小是4字节。 怎么会乘以4呢? 有人能详细计算一下吗?
谢谢

一个
int
实际上是4个字节(至少在x86 64位机器中是这样)。指针(至少在x86 64位机器中)是8个字节,因此理论上结构可能是12个字节。然而,它被填充为本机单词大小(8字节)的乘法,12字节的密室取整将是16字节。

结构被压缩为使用的“最大单词”的大小。例如,如果你有这样的结构:

struct   ThreeBytes {
     char  one;
     short two;
};
它的大小将是4个字节,因为字段
one
将填充为short的大小,即该字段后面有未使用的字节。如果
two
int
,则结构的大小将为two
int
s。如果将结构与以下内容对齐,则会发生这种情况:

// this structure got size of 4 bytes.
struct   ThreeBytes {
     char  one;
     char  two;
     short three;
};
这是未对齐的一个:

// This structure will have size 6 
struct   ThreeBytes {
     char  one;
     short two;
     char  three;
};

这是默认行为,存在允许更改打包的编译器指令(例如,请参见
#pragma pack
,编译器的方法可能不同)。基本上,您可以将字段填充的单位设置为1,或者通过将其设置为1来禁用填充。但有些平台根本不允许这样做。

您的结构包含不止一个int,再加上填充/对齐。您能解释一下它是如何达到16字节的吗?“int的大小是4字节。”-不要指望它总是正确的。也不要指望指针大小为0。但我想知道它如何等于16字节?如果更改两个成员的顺序,结构的大小是多少?这个结果更直观吗?一个类似且易于测试的替代方案,OP可能使用使用64位指针的平台,并要求它们(指针)驻留在8字节边界上。假设平台上的
int
确实是四个字节,那么四个字节后面会有4个字节的填充,然后是8字节的指针。使用结构实例的成员的一些创造性地址将有助于检验这些假设中的任何一个。您的描述具有误导性,结构的末尾很可能没有填充(但有些在中间)。x86 64上不要求“填充到本机单词大小”。实际上什么是填充?名称ThreeBytes对于最后两个结构来说有点不幸,但也有一些很好的例子。@Jonas这是故意的双关语,在第一种情况下也是误导性的,因为该结构有四个字节,呃,字符长。一些平台有灵活的字节定义(目前是最小的可寻址单元),这促使了这种行为。
// This structure will have size 6 
struct   ThreeBytes {
     char  one;
     short two;
     char  three;
};