我有一些代码或更好的说法是将一个完整的项目从STM32 / FreeRTOS复制到OMAP2430 / WindowsCE平台。
在复制的C / C ++文件中,我有一些代码处理在运行时创建和销毁的数据结构,并且大小和地址对齐完全取决于在创建期间进入数据结构的数据量。每个
我不想使用任何打包/填充来使地址对齐正确,但是想使用任何允许对数据结构进行未对齐访问的编译器选项。
目前我一直在使用__unaligned
类型修饰符来表示数据结构指针(来自UNALIGNED
的{{1}}宏)
我知道它可以创建一些性能下降,但我可以在这个特定的代码部分中使用它。
我想从我的程序员那里得知,Windows CE编译器设置中有一个选项会强制所有内存访问都不对齐。我在谈论像https://blogs.oracle.com/d/entry/on_misaligned_memory_accesses
这样的事情非常感谢任何答案。
由于
答案 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)。
如果您只是将指针从数据结构中复制出来,那么您可以充分利用这两个世界。例如,只需将其分配给临时的函数指针。