我有这个示例代码,我用pack装饰,以确保其大小为5字节(4为int,1为char)。
但它打印出struct的大小是8字节。
#pragma pack push
#pragma pack 1
struct mystruct
{
int x;
char y;
};
#pragma pack pop
//static_assert(sizeof(mystruct) == 5, "Size of mystruct should be 5 byte.");
int _tmain(int argc, _TCHAR* argv[])
{
int x=sizeof(mystruct);
printf("size of struct is %d\n",x);
return 0;
}
为什么te pck无效?
如何确保struct的大小始终为5。
答案 0 :(得分:7)
答案 1 :(得分:0)
我相信允许编译器忽略pack
pragma;也许它可以用编译器开关覆盖。
答案 2 :(得分:0)
编译器始终可以忽略您停止打包的尝试。这在某种程度上是一件好事,因为打包允许更高的效率......想想一个数组,当你访问元素1时,它被有效地遍历为内存方面的距离。元素是统一的。这也是用结构进行的,以确保保持效率。
我指导你到这个堆栈溢出 Disable structure padding in C without using pragma
答案 3 :(得分:0)
奇怪 - 我已经在第三方程序中进行了结构化,这些程序包含在1字节边界上,并且它们按预期工作(尽管不喜欢!)。
如果编译器忽略了你的pragma,请尝试设置对齐编译器选项 - C / C ++ |代码生成|结构成员对齐为1。
如果编译器正在进行“我知道最好”的优化,那么首先放置char会阻止它。