-1
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));

手動オフセットはコンパイル時に解決されますか、それとも実行時に算術演算を実行するオーバーヘッドが追加されますか?

4

2 に答える 2

3

の代わりに定数があっても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));
于 2012-07-15T11:01:42.727 に答える
2

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
于 2012-07-15T10:39:55.490 に答える