为什么结构填充没有正确发生?

Gee*_*kyJ 6 c padding

#include<stdio.h>

struct A
{
    char        c;
    double      e;
    int         s;
}A;

int main()
{
    printf("%u\n", sizeof(A));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给出了输出16.如果我们考虑结构内部填充和结构填充作为一个整体,它不应该是24

我正在使用GCC 4.8.2Ubuntu 14.04 32位上编译代码.

Mat*_*Mat 12

您的计算假设double需要8字节对齐.并非所有架构都是如此.

在带有GCC的32位x86 Linux上,double默认情况下将是4字节对齐.您可以使用该-malign-double标志更改它,使其与8字节对齐.

因此布局假设在32位x86 Linux上默认:

char       // 1 byte
           // 3 byte padding
double     // 8 bytes
int        // 4 bytes
Run Code Online (Sandbox Code Playgroud)

所以总共16个字节,中间有3个字节的填充.

维基百科文章数据结构对齐在一些编译器/环境中具有32位x86和64位x86_64上的各种类型的大小/对齐数.