c++ - c++中的结构对齐和填充

标签 c++

代码的输出如何变化? 我知道

struct-declarator:

declarator

type-specifier declarator opt : constant-expression

此处常量表达式以位为单位指定字段的宽度。

#include<stdio.h>

    int main()
    {
        struct value{
           int bit1 : 8;
           int bit3 : 8;
           int bit4 : 8;
           }bit;


       printf("%d\n",sizeof(bit));
     return 0;
}

输出为4

#include<stdio.h>

int main()
{
    struct value{
       int bit1 : 1;
       int bit3 : 4;
       int bit4 : 4;
       }bit;


       printf("%d\n",sizeof(bit));
     return 0;
}

输出 4

#include<stdio.h>

    int main()
    {
        struct value{
           int bit1 : 1;
           int bit3 : 16;
           int bit4 : 16;
           }bit;


           printf("%d\n",sizeof(bit));
         return 0;
    } 

输出为8

据我所知,结构的大小是其中声明的所有数据类型的大小。

最佳答案

这是因为打包和字节对齐。检查structure alignment

检查 C-FAQ详情

这是为了“对齐”。许多处理器无法访问 2 字节和 4 字节的数量(例如整数和长整型),如果它们以各种方式塞满的话。

假设你有这样的结构:

struct  {
    char a[3];
    short int b;
    long int c;
    char d[3];
    };

现在,您可能认为应该可以像这样将此结构打包到内存中:

+-------+-------+-------+-------+
|           a           |   b   |
+-------+-------+-------+-------+
|   b   |           c           |
+-------+-------+-------+-------+
|   c   |           d           |
+-------+-------+-------+-------+

但是如果编译器这样安排它,处理器会容易得多:

+-------+-------+-------+
|           a           |
+-------+-------+-------+
|       b       |
+-------+-------+-------+-------+
|               c               |
+-------+-------+-------+-------+
|           d           |
+-------+-------+-------+

packed'' 版本中,请注意,对于您和我来说至少有一点点难以看到 b 和 c 字段是如何环绕的?简而言之,处理器也很难。因此,大多数编译器将像这样填充“结构”(就像使用额外的、不可见的字段一样):

+-------+-------+-------+-------+
|           a           | pad1  |
+-------+-------+-------+-------+
|       b       |     pad2      |
+-------+-------+-------+-------+
|               c               |
+-------+-------+-------+-------+
|           d           | pad3  |
+-------+-------+-------+-------+

同时检查这个 C-Faq

关于c++ - c++中的结构对齐和填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24383771/

相关文章:

c++ - 在C++中将数组中的所有数字相加

c++ - 我正在尝试使用这种方法来检测移动物体。有人可以为此建议我吗?

c++ - 我可以从 `std::array` 派生一个类吗?

c++ - 中的复数

c++ - QML 图像不加载图像源中具有非 ASCII 字符的图像

c++ - 成员函数返回指向成员函数的指针

c++ - 辅音计数程序不返回辅音数

c++ - Anaconda Python2.7 在Windows 7 上编译包报错

c++ - 桶排序和计数排序的场景

c++ - 非成员函数不推荐静态关键字的基本原理