3

私はプログラミングに比較的慣れていないので、構造体の配列 (それぞれが特定の「アイテム」の n 個の属性を含む) を構築する方が属性の n 配列を構築するよりも速いと誰かが提案したとき、私は配列について十分に知らなかったことがわかりました。いずれかの方法で議論する。

私はこれを読みました:

c/c++ で配列が内部的にどのように機能するか

基本的な配列のチュートリアル

しかし、C プログラムがインデックスによって配列から特定の値を取得する方法をまだよく理解していません。

配列のデータ要素がメモリに隣接して格納されていること、および配列名が最初の要素を指していることは明らかです。

C プログラムは、ターゲット データの正確なメモリ アドレスを計算するために、データ型とインデックスに基づいて計算を行うのに十分なほどスマートですか。リンクリストのデータ構造)?

より基本的には、プログラムがメモリ アドレスで情報を要求した場合、マシンはどのようにそれを見つけるのでしょうか?

4

3 に答える 3

7

もっと簡単な例を見てみましょう。int test[10]アドレス 1000 に次のように格納されている配列があるとします。

1|2|3|4|5|6|7|8|9|10

コンパイラは、たとえば int が 4 バイトであることを認識しています。配列アクセス式は次のとおりです。

baseaddr + sizeof(タイプ) * インデックス

構造体のサイズは、その要素のサイズとコンパイラによって追加されたパディングの合計です。したがって、この構造体のサイズ:

struct test {
  int i;
  char c;
}

5 かもしれません。また、パディングのためにそうでないかもしれません。

あなたの最後の質問については、非常に簡単に(これは非常に複雑です)、MMUはページテーブルを使用して仮想アドレスを物理アドレスに変換し、それが要求され、キャッシュにある場合は返され、そうでない場合はメインからフェッチされますメモリー。

于 2014-02-11T01:43:35.510 に答える
2

あなたが書いた:

C プログラムは、データ型とインデックスに基づいて演算を行い、ターゲット データの正確なメモリ アドレスを割り出すほどスマートですか。

はい、それはまさに彼らがしていることです。それらは介在するアイテムを反復しません (そして、各アイテムの開始と終了をガイドするマーカーがないため、そうすることは役に立ちません)。

于 2014-02-11T01:39:03.960 に答える