我在64位机器上制作这种结构的最小尺寸是多少?

jck*_*jck 5 c gcc

typedef struct node{
    char one;
    char two;
    struct node *next;
} nodea;
Run Code Online (Sandbox Code Playgroud)

我在考虑编译器填充方面,有什么方法可以使sizeof(nodea)小于16?

Cyc*_*ode 5

您可以使用#pragma pack编译器指令http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

 #pragma pack(push)
 #pragma pack(1)
 typedef struct node {
    char one;
    char two;
    struct node* next;
 } nodea;
 #pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

  • 请记住,对链表使用此结构会降低列表的整体性能,因为下一个节点的地址未对齐.尝试将`struct node*next`作为结构的第一项.因此,地址将始终对齐,并且可以在一个指令/租用周期中获取. (3认同)

Ale*_*nze 5

除非它是非常规的东西,否则可以打包成1 + 1 + 8 = 10个字节.如果指针必须对齐,则为16个字节.如果你把指针放在第一个并且接下来是字符,那么就是10个字节,但是当你创建这些结构的数组时,对齐要求仍然可以使它成为16.