void *p = malloc(1000);
*((int*)p) = 666;
*((int*)p+sizeof(int)) = 777;
int i;
for (i = 0; i<10; ++i)
printf("%d ", *((int*)p+sizeof(int)*i));
手動オフセットはコンパイル時に解決されますか、それとも実行時に算術演算を実行するオーバーヘッドが追加されますか?
の代わりに定数があってもsizeof(int)
、コンパイラは のアドレスを事前に知ることができないp
ため、加算を行う必要があります。次のようなものがある場合i = sizeof(int)+4
は、コンパイル時に最適化を行い、直接 に設定する必要がありi
ます8
。
また、あなたがそうするとき、私は思います:
*((int*)p+sizeof(int)) = 777;
あなたが意味することは次のとおりです。
*((int*)p + 1) = 777; /* or ((int*)p)[1] = 777; */
同様に次のようにprintf("%d ", *((int*)p+sizeof(int)*i));
なります。
printf("%d ", *((int*)p + i));
sizeof(int)
コンパイル時に確実に認識され、この情報を効率的に使用することは理にかなっています。ただし、特定のコンパイラが次のようなものを生成するという保証はありません。
mov dword [ebx+16], 777
このようなものの代わりに:
mov ecx, 16
mov dword [ebx+ecx], 777
また
lea ebx, [ebx+16]
mov dword [ebx], 777
あるいは
add ebx, 16
mov dword [ebx], 777