未對齊INT指針我有以下的測試程序:GCC認爲在ARM
#include <string.h>
int q(int *p) {
int x;
memcpy(&x,p,sizeof(int));
x+=12;
memcpy(p,&x,sizeof(int));
return p[0];
}
當我編譯此使用GCC 4.7.2臂-Linux的gnueabihf,編譯器懷疑的指針訪問可以是未對齊的,註釋的加載和存儲在裝配輸出,例如:
ldr r0, [r0, #0] @ unaligned
如果我-mno-unaligned-access
編譯,編譯器不會發出的所有直接加載和存儲,但調用庫memcpy
來代替。但事實上,這種情況下的指針永遠不應該是不對齊的。這是gcc中的一個忽略,還是我誤解了?
請張貼的全拆裝編譯後的代碼。 – 2013-04-24 15:21:31
它使用int q(int * restrict p){p [0] + = 12;返回p [0];}'。 'mov r3,r0','ldr r0,[r0]','add r0,r0,#12','str r0,[r3]','blx'。你爲什麼要編碼?誠然,它應該是一致的。正如其他人所指出的那樣,你用'memcpy()'來混淆它。至少,'x = p [0];'似乎是半理智的。你爲什麼使用'memcpy()'作爲一項任務?下一個人會出現並聲明'* p'是一個字節交換版本。也許更大的問題會有所幫助? – 2013-04-24 16:34:08
使用'memcpy'的要點與嚴格別名規則兼容。給定的'int *'指針可能來自指向另一種類型的指針。 – 2013-04-25 07:50:07