gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:29:57 24 4
gpt4 key购买 nike

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

例如 :

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com