2012-07-05 89 views
2

一般short變量必須在2字節對齊地址,但如果我試圖將它指向一個奇數地址,是否有任何問題?在VS C++ 2008上對齊

我在VC++ 2008上試試這個代碼,它運行正常,所以你可以解釋爲什麼?

unsigned char ca[10]; 
    unsigned short *s1 = 0; 
    memset(ca, 1, 10); 

    s1 = (unsigned short*)&ca[0]; 
    printf("s1 = %d\n", *s1); 
    s1 = (unsigned short*)&ca[1]; 
    printf("s1 = %d\n", *s1); 

在代碼段的上方,ca[0]ca[1]有一個肯定在奇數地址,所以它不爲2字節對齊,但s1是完全分配給兩個ca[0]ca[1]

那麼這段代碼是否正確無誤,建議這樣做?我想有一個可移植的方法,它可以讀取字節數組中的任何兩個字節作爲短變量,以便在幾乎所有的平臺/編譯器中都能正常工作。

非常感謝。

+2

http://stackoverflow.com/questions/1496848/does-unaligned-memory-access-always-cause-bus-errors可能會在這裏提供一些有用的背景信息... – reuben

+1

你現在所擁有的肯定不是便攜式的也不安全。迂迴地說,它實際上是UB。它在你的情況下工作的原因是因爲x86允許未對齊的內存訪問。 – Mysticial

+1

除此之外,還存在排序問題...... – Mysticial

回答

4

沒有「必須」,它只是CPU可以或不可以做的事情。特別是x86可能會做「錯位」的訪問,雖然它幾乎可以肯定效率較低。

其他CPU體系結構的可移植性可能是也可能不是你關心的,但通常應避免錯位的內存訪問。另外,你甚至不得不欺騙編譯器,甚至讓你做錯位的東西......就像你乞求它「請,請,請,但我真的想拍我自己的腳,請讓我這樣做」;這通常不是你偶然可以做的事情。