我对C ++中的打包/对齐概念不太熟悉,我最近对此做了一些阅读并提出了一个问题。
我是从一个基类派生的(由其他人编写,我有标题)。该类的作者使用pragma pack将成员对齐到1字节边界。但是我不确定派生类是否有必要做同样的事情,包装/不打包派生类与基类具有相同对齐的后果是什么?
任何帮助/建议将不胜感激
感谢
答案 0 :(得分:0)
在日常的编写良好的 C ++代码中,如果有填充或不填充通常并不重要,尽管选择可能会影响性能。因此,您应该能够从该基类派生而不必担心自己明确指定任何包装。也就是说,基类可能被打包,因为内存中存在大量实例或按位复制到文件或网络流,在这种情况下,您将需要考虑新类的实例是否可能最终与这些数据混合在一起,以及是否还想出于同样的原因使用打包作为额外的数据成员。
但并非所有代码都写得很好。例如,如果程序将对象视为二进制blob数据并对它们使用memcmp
之类的函数,或者执行逐字节void*
/ size校验和,则填充成员中的垃圾数据可能会破坏逻辑/行为。如果数据是使用特定的分隔符或分隔符字符逐个对象编写的,那么嵌入式垃圾可能会注入不需要的分隔符/分隔符并破坏读取/解析逻辑。如果不对现有代码进行影响研究,就无法评估这些风险。