2017-07-30 101 views
-3

我的C++代码C++:结构的大小?

#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); 
} 

输出到终端

16 

是怎样的大小16? int的大小是4字节。 它是如何乘以4? 请任何人都可以给出详细的计算? 谢谢!

+2

你的结构体包含不止一个int,加上填充/对齐。 – VTT

+0

你能解释它是如何制作高达16字节的吗? –

+1

*“int的大小是4字节。”* - 不要指望它总是正确的。也不要指望指针大小为0. – StoryTeller

回答

2

一个int确实是4个字节(至少在x86 64位机器中)。一个指针(至少在x86 64位机器中)是8个字节,所以理论上结构可以是12个字节。然而,它被填充到本地字大小(8字节)的乘法 - 12个字节的最后整数将是16个字节。

+0

一个类似的,易于测试的替代方案,OP可能使用一个使用64位指针的平台,并要求它们(指针)驻留在8字节的边界上。假设'int'确实是平台上的四个字节,那么这四个字节之后是4个字节的填充,然后是8个字节的指针。一些有创意的地址 - 使用结构实例的成员将有助于测试任何这些假设。 – WhozCraig

+2

你的描述是误导性的,在结构的末尾很有可能没有填充(但一些在中间)。 “填充本地字大小”不是x86 64上的要求。 – Mat

+0

实际上填充是什么? –

1

结构被打包成所用“最大单词”的大小。例如,如果有这样的结构:

struct ThreeBytes { 
    char one; 
    short two; 
}; 

其大小将是4个字节,因为场one将被填充到短,即,尺寸有后提交的未使用的字节。如果two将是int,则该结构将具有两个尺寸ints。出现这种情况,如果你调整您的结构是:

// 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

ThreeBytes这个名字对于最后两个结构来说有些不幸,但是其他的一些很好的例子。 – Jonas

+0

@Jonas这是故意双关语,它也误导了第一种情况,因为该结构是四个字节,呃,字符长。一些平台具有灵活的字节定义(这是最小的可寻址单元_当前_),这促成了这种行为。 – Swift