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