2

我有一些代码或更好的说法是从STM32/FreeRTOS复制到OMAP2430/WindowsCE平台的完整项目。

在复制的 C/C++ 文件中,我有一些代码处理在运行时创建和销毁的数据结构,大小和地址对齐完全取决于在每个创建过程中进入数据结构的数据量。

我不想使用任何打包/填充来使地址对齐正确,但想使用任何允许对数据结构进行非对齐访问的编译器选项。现在我一直在使用__unaligned数据结构指针的类型修饰符(UNALIGNED宏来自Windef.h

我知道它会造成一些性能下降,但我可以在这段特定的代码部分中忍受。

我想从其他程序员那里知道的是,Windows CE 编译器设置中有一个选项可以强制所有内存访问未对齐。我说的是这样的事情https://blogs.oracle.com/d/entry/on_misaligned_memory_accesses

非常感谢任何答案。

谢谢

4

2 回答 2

1

我相信在 ARM 上,未对齐的访问可能是硬件错误,而不是 x86 上的性能下降。因此,编译器可能无法执行这样的操作。

于 2012-07-03T17:47:58.020 回答
0

你有几个选择。

将特定元素设置为 __unaligned 即可。所以将:

# pragma pack (1)
struct x_
{
   char a;    // 1 byte
   int b;     // 4 bytes
   short c;   // 2 bytes
} MyStruct;
# pragma pack ()

或使用 /Zp1 在编译器命令行上设置打包

如果您的目标处理器支持通过非对齐访问取消引用指针,您将很快知道 - 如果它不支持未对齐访问,您将收到总线错误 (SIGBUS)。

如果您只是在跟随指针之前将指针从数据结构中复制出来,您可能会获得两全其美的效果。例如,只需将其分配给临时函数指针。

于 2012-07-03T17:54:46.130 回答