我有一些代码,或者更确切地说,是从STM32/FreeRTOS复制到OMAP2430/WindowsCE平台的完整项目。
在复制的C/C++文件中,我有一些处理数据结构的代码,这些数据结构是在运行时创建和销毁的,大小和地址对齐完全取决于在创建每个数据结构时进入数据结构的数据量。
我不想使用任何打包/填充来使地址对齐正确,但希望使用任何允许对数据结构进行非对齐访问的编译器选项。目前,我一直使用__unaligned类型修饰符来表示数据结构指针(来自Windef.h的UNALIGNED宏)
我知道它会造成一些性能下降,但我可以在这段代码中接受它。
我想从我的程序员同事那里知道的是,在Windows CE编译器设置中有一个选项,它将强制所有内存访问不对齐。我说的是像这样的https://blogs.oracle.com/d/entry/on_misaligned_memory_accesses
任何答案都是非常感谢的。
谢谢
发布于 2012-07-04 01:47:58
我认为,在ARM上,未对齐的访问可能是硬件错误,而不是x86上的性能下降。因此,编译器可能不可能执行这样的操作。
发布于 2012-07-04 01:54:46
你有几个选择。
将特定元素设置为__unaligned就可以了。也是如此:
# pragma pack (1)
struct x_
{
char a; // 1 byte
int b; // 4 bytes
short c; // 2 bytes
} MyStruct;
# pragma pack ()或者使用/Zp1在编译器命令行上设置打包
你很快就会知道你的目标处理器是否支持通过非对齐访问来取消对指针的引用-如果不支持,你会在非对齐访问上得到一个总线错误(SIGBUS)。
如果您在跟随指针之前将指针复制出数据结构,那么您可能会两全其美。例如,只需将其临时赋值给函数指针。
https://stackoverflow.com/questions/11313174
复制相似问题