VS2005如何强制所有指针访问不对齐?

时间:2012-07-03 14:32:04

标签: c++ pointers compiler-construction visual-studio-2005

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

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

我不想使用任何打包/填充来使地址对齐正确,但是想使用任何允许对数据结构进行未对齐访问的编译器选项。 目前我一直在使用__unaligned类型修饰符来表示数据结构指针(来自UNALIGNED的{​​{1}}宏)

我知道它可以创建一些性能下降,但我可以在这个特定的代码部分中使用它。

我想从我的程序员那里得知,Windows CE编译器设置中有一个选项会强制所有内存访问都不对齐。我在谈论像https://blogs.oracle.com/d/entry/on_misaligned_memory_accesses

这样的事情

非常感谢任何答案。

由于

2 个答案:

答案 0 :(得分:1)

我认为在ARM上,未对齐的访问可能是硬件错误,而不是x86上的性能下降。因此,编译器执行此类操作可能不可能

答案 1 :(得分:0)

您有几个选择。

将特定元素设置为__unaligned将执行此操作。所以会:

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

或使用/ Zp1

在编译器命令行上设置打包

如果您的目标处理器支持通过未对齐访问解除引用指针,您会非常快地知道 - 如果它不支持,您将在未对齐访问时遇到总线错误(SIGBUS)。

如果您只是将指针从数据结构中复制出来,那么您可以充分利用这两个世界。例如,只需将其分配给临时的函数指针。