为什么这个结构的大小不正确

时间:2014-04-25 10:49:08

标签: c++ struct sizeof

我有这个示例代码,我用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。

4 个答案:

答案 0 :(得分:7)

您的编译指示语法错误。

试试这个:

#pragma pack(push,1)
...
#pragma pack(pop)

Demo

答案 1 :(得分:0)

我相信允许编译器忽略pack pragma;也许它可以用编译器开关覆盖。

答案 2 :(得分:0)

编译器始终可以忽略您停止打包的尝试。这在某种程度上是一件好事,因为打包允许更高的效率......想想一个数组,当你访问元素1时,它被有效地遍历为内存方面的距离。元素是统一的。这也是用结构进行的,以确保保持效率。

我指导你到这个堆栈溢出 Disable structure padding in C without using pragma

答案 3 :(得分:0)

奇怪 - 我已经在第三方程序中进行了结构化,这些程序包含在1字节边界上,并且它们按预期工作(尽管不喜欢!)。

如果编译器忽略了你的pragma,请尝试设置对齐编译器选项 - C / C ++ |代码生成|结构成员对齐为1。

如果编译器正在进行“我知道最好”的优化,那么首先放置char会阻止它。