c++ - 为什么类的大小取决于成员声明的顺序?如何?

标签 c++ c padding memory-alignment

有人向我解释了类中成员声明的顺序如何确定该类的大小。

例如 :

class temp
{
public:
    int i;
    short s;
    char c;
};

上一类的大小为8个字节。

但是当成员声明的顺序更改如下时
class temp
{
public:
    char c;
    int i;
    short s;
};

那么类的大小是12个字节。

怎么样?

最佳答案

上述行为背后的原因是数据结构对齐和填充。基本上,如果您正在创建一个4字节的变量,例如int,它将与四个字节的边界对齐,即它将从内存中的地址开始,该地址是4的倍数。同样适用于其他数据类型。短2字节应从偶数存储器地址开始,依此类推。

因此,如果您在int之前声明了一个1字节的字符(此处假定为4个字节),则在它们之间将剩下3个空闲字节。用于它们的通用术语是“填充”。

Data structure alignment

Another good pictorial explanation

对齐原因

填充允许更快的内存访问,即对于cpu,访问对齐的内存区域的速度更快,例如读取一个4字节对齐的整数可能需要单次读取调用,就好像一个整数位于一个未对齐的地址范围内(例如地址0x0002-0x0006),那么需要两次的内存读取才能获得此整数。

强制编译器避免对齐的一种方法是(特定于gcc / g++)使用带有结构属性的关键字“packed”。 packed keyword此外,该链接还指定了如何使用aligned关键字在您选择的特定边界(2、4、8等)上强制对齐。

最佳做法

构造类/结构始终是一个好主意,以使变量已经与最小填充对齐。这减少了整个类的大小,并且减少了编译器完成的工作量,即不重新安排结构。同样,应该始终通过代码中的成员变量访问成员变量,而不是假设值将位于该字节中,尝试从结构中读取特定字节。

另一个有用的SO question on performance advantage of alignment

为了完成起见,在您的方案(32位计算机)中,之后的大小仍为8字节,但是由于现在已占用了8个字节,并且没有填充,因此它不会变得更好。

class temp
{
public:
    int i;
    short s;
    char c;
    char c2;
};

关于c++ - 为什么类的大小取决于成员声明的顺序?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62602085/

相关文章:

c++ - 为什么在执行增量操作之前分配指针值

c++ - 将指向枚举的指针传递给函数

c - 如何在匿名成员中存储结构数组?

c - 我的函数显示正确的数字,但没有将其添加到变量中

css - 填充单个单元格而不影响整行?

c++ - 如果从同一个信号调用两个槽,Qt 可以同时调用它们吗?

C 帮助创建进程树

c++ - 将类型包装在结构中会导致额外的填充吗?

html - 填充弄乱背景颜色

c++ - 在带有 Rcpp 的 R 包中使用头文件 (.h) 和 cpp 文件