我正在移植一个msvc项目,该项目有几个库,每个库都有特定的结构成员对齐。使用默认对齐导致了许多致命的错位问题,谷歌搜索告诉我,我可以通过使用__attribute__ ((aligned (MY_ALIGN)))
标志手动设置每个struct / class / union的对齐来解决这个问题,但有一件事困扰我:
为简单起见,我们假设项目A使用1字节对齐和项目B,它主动使用项目A的功能并包含许多标题,具有16字节对齐。会不会有问题,或者我想得太多而且它会起作用?我有一种不好的感觉,在构建库时,msvc编译器为所有头中的每个结构设置对齐(无论它们是包含在项目中还是由源引用)。这是真的?如果是,请告诉我,如何设置对齐以模拟MSVC的结构成员对齐设置?
答案 0 :(得分:1)
我认为不应该存在问题。请记住,未对齐的访问(我认为在大多数系统上最少4个字节)将花费你(尽管你节省了空间,但在某些情况下并不多)。结构本身具有属性,并且编译器将执行所有指针运算,因此只要标题不会混淆彼此的定义就应该没问题。
答案 1 :(得分:1)
首先,源文件中的每个标题#include
'd按字面意思获取进程,无论它是否在同一个项目中都无关紧要。
肯定会导致一些问题。例如,项目A定义一个结构并将其所有成员对齐到一个字节边界(打包),并导出一个接受指向该结构的指针的函数。
然后,如果项目B由于某种原因在这样的环境中编译,即相同的结构以不同的方式对齐,则将无法将此struct
的实例的地址直接传递给该导出的例程。他们至少在A和B中有不同的sizeof
。
简单的规则是:
1)如果你要与一些外部编译库连接,你应该确保结构对齐与库编译器使用的结构一致。这涉及图书馆标题中的结构。优秀的库试图通过为某些编译器提供#pragma
来确保正确对齐来最小化工作量
2)如果你在你的某个项目中使用结构,你可以不管它,只需编写不依赖于某些特定对齐的可移植代码,它就可以。