结构前缀的布局
Layout for struct prefix
C/C++ 语言不会对内存中的结构成员重新排序,也不会在第一个成员之前插入填充。 但是,如果我有 2 个以相同成员开头的结构,如果我只访问公共成员,我可以在它们之间转换吗? 换句话说,结构布局是贪婪的吗? 我的具体案例是在视频信息标题和VIDEOINFOHEADER2之间铸造
C++标准包含以下声明,但仅适用于工会(9.2 [class.member] 第19段):
如果标准布局联合包含两个或多个共享公共初始序列的标准布局结构,并且标准布局联合对象当前包含其中一个标准布局结构,则允许检查其中任何一个结构的公共初始部分。如果相应的成员具有布局兼容的类型,并且两个成员都不是位字段,或者两者都是具有相同宽度的位字段,则两个标准布局结构共享一个公共初始序列。
我没有看到 C 或 C++ 标准中关于部分定义的结构的任何其他保证。不过,这并不意味着它不存在,只是我没有通过快速扫描几个相关部分找到它。
简短的回答:是的。主要。
编译器无法对结构成员重新排序:true。 我不太确定填充,IFAIR 结构成员对齐是实现定义的。
但是,编译器在布局结构时是一致的。 它必须是,否则你永远不会能够写入然后读回文件的结构。大多数编译器使用"理智"规则进行结构布局,因此您可以从一个程序编写并使用另一个程序读入,即使它们是不同系统上的不同编译器。
大多数时候。 结构布局没有明确定义的规则。 因此,偶尔你会因为依靠"自然"布局来匹配而被咬,当它不匹配时。 但在这种情况下,你应该是安全的。
它不能保证在理论上有效,但它很可能永远有效。除了在结构的第一个成员(在 C 中)之前没有填充之外,无法保证成员之间存在什么填充,因此理论上两个结构可以具有不同的布局。但实际上,对于您能想到的大多数填充规则,您会期望两者的填充相同。
您可以做的(但不在您的特定示例中)是使用单个成员(另一个结构)启动两个结构,并强制转换为指向第一个成员的指针。
- 如何使用C/C++在MacOSX中获得键盘布局
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 布局兼容类型的并集
- Qt自定义QPush按钮未显示在布局上
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 按钮悬停在 QT 中垂直布局的选项卡小部件中不起作用
- 查找带有 Anaconda cmake 前缀的 boost-python3
- 迭代器类的重载前缀增量运算符会引发分段错误
- 调整布局上的 QGraphicsView 小部件的大小
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 生成前缀位掩码
- 如何在qt中将对象添加到现有布局中?--已解决
- 将布局映射到内存地址
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- C++继承的虚拟类的内存布局
- 如何在自定义对象的<<运算符中添加自定义前缀
- 高效的字符串截断算法,按顺序删除相等的前缀和后缀
- 检查nullptr是否100%保护内存布局不受segfault影响
- 结构前缀的布局