アラインされたintの読み取りと書き込みはアトミックで安全だと聞きましたが、パックされた構造とキャスト/ポインター算術バイトバッファー以外の非mallocされたグローバルをいつシステムがアラインされないようにするのでしょうか?
[X86-64 linux]私の通常のケースではすべて、システムは常にワードが破損しない整数の場所を選択します。たとえば、一方のワードで2バイト、もう一方のワードで他の2バイトです。整数が引き裂かれ、システムが1つの整数値をロードするために2つの読み取りを使用する必要があるように、グローバル変数を非整列アドレスに強制するプログラム/スニップ(Cまたはアセンブリ)を投稿できますか?
以下のプログラムを印刷すると、複数の変数が64ビット以内にあるようにアドレスが互いに接近していますが、単語のティアリングが一度も見られません(システムまたはコンパイラのスマートさ?)
#include <stdio.h> int a; char b; char c; int d; int e = 0; int isaligned(void *p, int N) { if (((int)p % N) == 0) return 1; else return 0; } int main() { printf("processor is %d byte mode \n", sizeof(int *)); printf ( "a=%p/b=%p/c=%p/d=%p/f=%p\n", &a, &b, &c, &d, &e ); printf ( " check for 64bit alignment of test result of 0x80 = %d \n", isaligned( 0x80, 64 )); printf ( " check for 64bit alignment of a result = %d \n", isaligned( &a, 64 )); printf ( " check for 64bit alignment of d result = %d \n", isaligned( &e, 64 )); return 0;}
出力:
processor is 8 byte mode a=0x601038/b=0x60103c/c=0x60103d/d=0x601034/f=0x601030 check for 64bit alignment of test result of 0x80 = 1 check for 64bit alignment of a result = 0 check for 64bit alignment of d result = 0
上記の場合、charの読み取りはどのように行われますか?8バイトに整列された境界(私の場合は0x601030)から読み取り、0x60103cに移動しますか?
メモリアクセスの粒度は常にワードサイズですよね?
どうも。