2012-07-03 74 views
2

我有一些代碼或更好的說從STM32/FreeRTOS複製到OMAP2430/WindowsCE平臺的完整項目。VS2005如何強制所有指針訪問未對齊?

在複製的C/C++文件中,我有一些代碼處理在運行時創建和銷燬的數據結構,並且大小和地址對齊完全取決於在創建過程中進入數據結構的數據量每個。

我不想使用任何打包/填充來使地址對齊正確,但想要使用任何編譯器選項,將允許數據結構的不對齊訪問。 現在我已經用了數據結構的指針__unaligned類型修飾符(從Windef.hUNALIGNED宏)

我知道它可以創建一些性能下降,但我可以在這個代碼特定部分與生活。

我想從我的同行程序員那裏知道的是,Windows CE編譯器設置中有一個選項會強制所有內存訪問未對齊。我正在談論這樣的一些事情https://blogs.oracle.com/d/entry/on_misaligned_memory_accesses

任何答案是非常感謝。

感謝

+0

這可能是你需要的http://stackoverflow.com/questions/1318844/how-to-enable-armv6-unaligned-access-on-winmobile6 – Alex

回答

1

我相信ARM的,對齊的訪問可以是硬件錯誤,而不是業績下滑是在x86。因此編譯器可能不可能使用來執行這樣的動作。

+2

不允許未對齊訪問的系統的編譯器可以讀取逐字節數據並重建值。我知道當啓用嚴格對齊並且數據從已知未對齊的地址加載時,gcc完全用於ARM,並且問題中的__unaligned關鍵字表明Windows CE編譯器(無論哪種編譯器)都可以。 – hvd

0

您有幾個選項。

將特定元素設置爲__unaligned即可。所以將:

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

或設置編譯器命令行用/ ZP1

你會知道相當快,如果你的目標處理器支持通過對齊訪問取消引用指針的包裝 - 你會得到一個總線錯誤(SIGBUS)在未對齊的訪問上進行訪問,如果它不支持的話。

如果您只是在將數據結構指針從數據結構中移出之前,您可能會獲得兩全其美的好處。例如,只需將它分配給臨時的函數指針。