1

int の配列がある場合は、次のように言いましょう。

int iarr[5] = {0, 7, 3, 12, 99};

アドレスに存在するもの0xbfdf53a8。これの値をループで出力したいのですが、次のようなことができます:

for(i=0; i<5; i++)
   printf("value of iarr[%d] = %d\n", i, *(iarr+i));

このループが機能するのは、毎回「int」を 1 ずつインクリメントしているためです (通常の 32 ビット マシンでは、反復ごとにアドレスが 4 バイトずつ増加します)。

私の質問は、タイプ指定されたバイトオフセットが適用されるのはいつですか? それはコンパイルプロセスの一部ですか(アセンブリのどこかにあることを意味します)、それともOSレベルで行われますか?

これが標準化された方法でどのように処理されるかを推測しますが、まだその答えを見つけることができませんでした.

4

2 に答える 2

3

これはコンパイル プロセスの一部であり、コンパイラはオペランドのサイズを考慮したコードを生成します。

struct4 バイトへのポインターと同じくらい簡単に、5412 バイトへのポインターをインクリメントして算術演算を実行できることに注意してくださいint。コンパイラは、ポインター式の型を検査し、適切なコードを生成します。

オペレーティング システムは、これらの低レベルの詳細にはまったく関与していません。それは、その観点からはプロセス内のコードにすぎません。

于 2012-10-17T14:08:43.667 に答える
1

これはコンパイル時に行われ、生成されるアセンブリ (およびオブジェクト コード) に含まれます。

OS は、操作しているデータ型を認識していません (気にしません)。(仮想)生メモリのチャンクのみを使用して再生できます。

データ型とその特性を知っているのは、ユーザーとコンパイラだけです。

于 2012-10-17T14:08:38.723 に答える