struct test {
char c;
} x;
根据我对结构填充的了解,我预计这个结构的大小在32位系统上是4字节。为什么它显示1个字节?
答案 0 :(得分:0)
你只有一个字符,在这种情况下你不需要任何对齐/填充。 如果你试试这个,你应该看到一些对齐方式:
char *p; /* 4 or 8 bytes */
char c; /* 1 byte */
//char pad[3]; /* 3 bytes */
int x; /* 4 bytes */
对于不同的体系结构有不同的规则,在这种情况下,int具有4字节对齐,这会强制添加三个字节的填充。
答案 1 :(得分:-1)
在C中,strucute填充到当前数据大小。 如果你有一个char将与1B对齐,简称为2B,依此类推。
快速规则是:先前元素的大小+当前元素的大小与当前元素的大小对齐。
以下是一些问题:
struct
{
int a1; // 0 + 4 aligned to 4 => 4
char a2; // 4 + 1 aligned to 1 => 5
} // total size 5
struct
{
char a1; // 0 + 1 aligned to 1 => 1
int a2; // 1 + 4 aligned to 4 => 8
}
struct
{
char a1; // 0 + 1 aligned to 1 => 1
short a2; // 1 + 2 aligned to 2 => 4
int a3; // 4 + 4 aligned to 4 => 8
}
此规则是内存寻址的效果: 读取/写入X字节存储器的最快方法是,如果该存储器地址是X的倍数。(这就是英特尔处理器通过忽略某些寻址位来优化存储器访问的方式)。
另一个填充是在内存中的结构之间。如果您的结构具有int
和char
(总大小为5),则在内存中,它们之间仍然会有3个字节的填充,以便进行内存访问优化。