gpt4 book ai didi

使用编译指示包和继承的 C++ 对齐

转载 作者:太空狗 更新时间:2023-10-29 23:17:03 24 4
gpt4 key购买 nike

我不太熟悉 C++ 中的打包/对齐概念,最近阅读了一些相关内容并有一个问题。

我派生自一个基类(由其他人编写,我有它的标题)。此类的作者使用 pragma pack 将成员对齐到 1 字节边界。但是我不确定派生类是否有必要做同样的事情,打包/不打包与基类具有相同对齐方式的派生类的后果是什么?

任何帮助/建议将不胜感激

谢谢

最佳答案

在日常的编写良好 C++ 代码中,是否有填充通常并不重要,尽管选择可能会影响性能。因此,您应该能够从该基类派生而不用担心自己明确指定任何包装。也就是说,基类可能会被打包,因为内存中会有大量实例或按位复制到文件或网络流中,在这种情况下,您需要考虑新类的实例是否可能会结束与该数据混合,以及您是否也出于同样的原因想要对额外的数据成员使用打包。

但并非所有代码都写得很好。例如,如果程序将对象视为二进制数据 block 并对它们使用像 memcmp 这样的函数,或者按字节执行 void*/size 校验和,那么垃圾填充成员中的数据可能会破坏逻辑/行为。如果数据是逐个对象写入的,具有特定的分隔符或定界符,则嵌入式垃圾可能会注入(inject)不需要的分隔符/定界符并破坏读取/解析逻辑。如果不对现有代码进行影响研究,就无法评估这些风险。

关于使用编译指示包和继承的 C++ 对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20754452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com