提问人:archana 提问时间:5/22/2023 更新时间:7/14/2023 访问量:61
为什么后面跟着字符串时字符填充较少
Why is character padding is less when followed by string
问:
根据我在 64 位操作系统中的知识,在读取类变量时,为了减少 CPU 周期,c++ 编译器会进行填充并尝试将数据放入 8 个字节的块中。现在在下面的程序中,由于 int i 和 j 将占用一个 8 字节,并且可以在没有额外 CPU 周期的情况下读取,因此如果字符 'name' 不填充 7 个字节,以便字符串将在 3 个 8 字节的周期内顺利读取。如果是这样,sizeof(e1) 应该返回 40.但它只返回 36.为什么会这样?注意:如果我在字符后面加倍,这需要 8 个字节,那么该字符将被填充 7 个字节,则 e1 的大小返回为 24。我的操作系统是 64 位。
#include <iostream>
using namespace std;
class emp{
public:
int i; //needs 4 bytes
int j; //needs 4 bytes
char name; //should be padded by 7 bytes
string s; //needs 24 bytes
//double d; //needs 8 bytes.
};
int main()
{
emp e1;
cout<<sizeof(e1);
}
答案应该是40分,但我得到的是36分。
答:
0赞
Raman
7/14/2023
#1
通过我的调试,我发现你的“字符名”占用了 4 位的内存。 38
上述行为背后的原因是数据结构对齐和填充。基本上,如果您要创建一个 4 字节变量,例如 int,它将与一个 4 字节边界对齐,即它将从内存中的地址开始,该地址是 4 的倍数。这同样适用于其他数据类型。2 字节短应从偶数内存地址开始,依此类推。
因此,如果您在 int 之前声明了一个 1 字节字符(此处假设为 4 个字节),则中间将剩下 3 个可用字节。用于它们的常用术语是“填充”。
这是我从某个地方发现的,我认为这将帮助您理解..
评论
cout<<'\n'<<(void*)&e1.i<<'\n'<<(void*)&e1.j<<'\n'<<(void*)&e1.name<<'\n'<<(void*)&e1.s<<'\n';
reinterpret_cast