为什么此结构的大小不正确

why the size of this struct is not correct

本文关键字:不正确 结构 为什么      更新时间:2023-10-16

我有这个示例代码,我用pack对其进行了修饰,以确保其大小为5字节(4表示int,1表示char)。

但打印出来的结构体大小是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 %dn",x);
    return 0;
}

为什么te-pck不起作用?

如何确保结构的大小始终为5。

您的pragma语法错误。

试试这个:

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

演示。

我认为编译器可以忽略pack杂注;也许它可以用编译器开关重写。

编译器总是可以忽略您停止打包的尝试。从某些方面来说,这是一件好事,因为包装可以提高效率。。。想象一个数组,当你访问元素1时,它会被有效地遍历到,因为元素之间的距离(就内存而言)是一致的。这也通过结构来执行,以确保保持效率。

我指引你到这个堆栈溢出在不使用杂注的情况下禁用C中的结构填充

奇怪-我在一个第三方程序中有一些结构,它们被封装在1字节的边界上,并且可以按预期工作(尽管不受欢迎!)。

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

如果编译器正在进行"我最了解"的优化,也许把char放在第一位会停止它。