与其他一些答案所说的相反,在大多数系统中,如果没有编译指示或编译器选项,结构的大小将至少为6个字节,而在大多数32位系统上,则为8个字节.对于64位系统,大小很容易为16个字节.对齐确实起作用; 总是.单个结构的大小必须使得可以分配这些大小的数组,并且阵列的各个成员对于所讨论的处理器充分对齐.因此,如果结构的大小是其他人假设的5,那么两个这样的结构的数组将是10个字节长,并且第二个数组成员中的char指针将在奇数字节上对齐,这将是(在大多数情况下)处理器)导致性能的主要瓶颈.
#includetypedef struct { char* c; char b; } a; int main() { printf("sizeof(a) == %d", sizeof(a)); }
我在32位机器上得到"sizeof(a)== 8".结构的总大小将取决于打包:在我的情况下,默认打包为4,因此'c'需要4个字节,'b'需要一个字节,剩下3个填充字节将它带到下一个4的倍数:8.如果你想改变这种打包方式,大多数编译器都有办法改变它,例如,在MSVC上:
#pragma pack(1) typedef struct { char* c; char b; } a;
给sizeof(a)== 5.如果这样做,请小心在任何库头之前重置打包!
与其他一些答案所说的相反,在大多数系统中,如果没有编译指示或编译器选项,结构的大小将至少为6个字节,而在大多数32位系统上,则为8个字节.对于64位系统,大小很容易为16个字节.对齐确实起作用; 总是.单个结构的大小必须使得可以分配这些大小的数组,并且阵列的各个成员对于所讨论的处理器充分对齐.因此,如果结构的大小是其他人假设的5,那么两个这样的结构的数组将是10个字节长,并且第二个数组成员中的char指针将在奇数字节上对齐,这将是(在大多数情况下)处理器)导致性能的主要瓶颈.
如果要手动对其进行计数,则结构的大小仅是考虑对齐后其每个数据成员的大小。结构没有魔术开销字节。