如何解决结构定义中的VS2019 alignas否决了实用程序包
我正在尝试使用#pragma pack打包结构“ Test”。
在VS2019 16.7.2中,以下静态断言失败。
struct alignas(4 * sizeof(float)) Vec4
{
float x,y,z,w;
};
#pragma pack(push,1)
struct Test
{
char f;
Vec4 vec;
};
#pragma pack(pop)
static_assert(sizeof(Test) == sizeof(char) + sizeof(Vec4),"Incorrect size.");
Test的大小为2 * sizeof(Vec4),这表明结构定义上的alignas会否决包。
在GCC 10.2或Clang 11.0.0中,静态断言不会失败。
有人知道如何根据需要打包Test吗? (无需更改Vec4结构的对齐方式)
谢谢。
本
解决方法
#pragma
是实现定义的。 ISO C ++标准只对它们说了这一点:
编译指示 [cpp.pragma]
形式的预处理指令
# pragma
pp令牌 opt 换行使实现以实现定义的方式运行 方式。该行为可能导致翻译失败或导致 转换器或生成的程序表现为不合格 方式。实施无法识别的任何杂用 忽略。
因此,GCC或Clang以某种方式实现#pragma pack
是无关紧要的,显然VC ++以考虑#pragma pack
指令的方式实现了alignas
。在警告级别4,它甚至会发出警告:
警告C4324:“测试”:由于对齐说明符而填充了结构
MSDN进一步says
在没有
__declspec(align(#))
的情况下,编译器通常会根据目标处理器和数据大小在自然边界上对齐数据,在32位处理器上最多4字节边界,在64位处理器上最大8字节边界。位处理器。类或结构中的数据在其自然对齐和当前打包设置(来自#pragma pack
或/Zp
编译器选项)的最小值下在类或结构中对齐。
这建议#pragma pack
仅影响默认对齐方式,而alignas
将覆盖默认对齐方式。还有
__declspec(align(#))
只能增加对齐限制。
因此,似乎一旦alignas
的{{1}}设置为16
,就无法减少它(无需更改Vec4
结构的声明)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。