13

32 ビット システムまたは 64 ビット システムの意味をよく理解しています。したがって、基本的にすべてのレジスタまたはワード長は 32 ビットまたは 64 ビットです。

簡単にするために、32 ビット システムを取り上げて、C でプログラムを書いているとします。int 型を宣言する場合は、「int a = 5;」と言います。その場合、1 ワード長のメモリ ロケーションが var a 用に予約されます。そのため、アクセスしたいときはいつでも、そのメモリ位置のワードアドレスを使用してアクセスできます。

しかし、「char a、b、c、d;」の 4 文字があるとします。それはそれぞれ1バイトなので、それらすべてが1つのワードに配置されているので、char bのみにアクセスしたい場合はどうすればよいですか?(メモリはバイトアドレス指定可能であると言います)今、bはワードの3番目のバイトだと言います... .では、どうやってバスに乗り込むのでしょうか? 3 番目のバイトがバスの 17 ~ 24 行目に配線されていませんか? b だけがアクセスされている場合、他の 24 行はどうなるでしょうか。

4

2 に答える 2

6

あなたの質問に対する答えは、使用するコンパイラと、CPU、メモリ コントローラ、およびメモリ アーキテクチャ (キャッシュと外部メモリ) の内部動作によって大きく異なります。
コンパイラのみを制御できます (C または C++ コンパイラを使用していると仮定します)。コンパイラには、ワード サイズより小さい変数を使用している場合に対応するさまざまなモードがあります。速度の最適化とメモリの最適化のためのフラグがあります。これらのフラグのどれがオンになっているかに応じて、コンパイラは、4 つの変数 (この場合) すべてを 1 つの単語にパックするコードを生成することを選択できます。または、コンパイラは、変数ごとにメモリ ワードを割り当てることを選択する場合がありますが、実際の値を格納するために特定のバイトを使用します。コンパイラがケースごとにそれを行う方法は、CPU に対して異なる命令セットを生成することです。後者の場合、変数がメモリから読み取られると、ワード全体がバスに置かれ、次に汎用レジスタに入れられます。前者の場合、ワードはレジスタに入れられますが、ワードはビットごとにシフトされ、論理 AND 演算を使用して他のビットをゼロにすることができます。そうすれば、正しいバイトがレジスタに格納されます。または、CPU アーキテクチャが 1 ワードでバイト レベルのアクセスをサポートしている可能性があります。この場合、CPU によって実行される操作は 1 つだけです。最後に、内部で何が起こっているかを理解することは良い考えですが、コンパイラーによって生成された一連の命令はユーザーの観点から正しく機能するため、あまり気にする必要はありません。気にするのは、パフォーマンスに敏感なソフトウェアを作成するときだけです。その場合、CPU とメモリの詳細、およびコンパイラがサポートするフラグを知る必要があります。そうすれば、正しいバイトがレジスタに格納されます。または、CPU アーキテクチャが 1 ワードでバイト レベルのアクセスをサポートしている可能性があります。この場合、CPU によって実行される操作は 1 つだけです。最後に、内部で何が起こっているかを理解することは良い考えですが、コンパイラーによって生成された一連の命令はユーザーの観点から正しく機能するため、あまり気にする必要はありません。気にするのは、パフォーマンスに敏感なソフトウェアを作成するときだけです。その場合、CPU とメモリの詳細、およびコンパイラがサポートするフラグを知る必要があります。そうすれば、正しいバイトがレジスタに格納されます。または、CPU アーキテクチャが 1 ワードでバイト レベルのアクセスをサポートしている可能性があります。この場合、CPU によって実行される操作は 1 つだけです。最後に、内部で何が起こっているかを理解することは良い考えですが、コンパイラーによって生成された一連の命令はユーザーの観点から正しく機能するため、あまり気にする必要はありません。気にするのは、パフォーマンスに敏感なソフトウェアを作成するときだけです。その場合、CPU とメモリの詳細、およびコンパイラがサポートするフラグを知る必要があります。内部で何が起こっているかを理解することは良い考えですが、コンパイラーによって生成された一連の命令はユーザーの観点から正しく機能するため、あまり気にする必要はありません。気にするのは、パフォーマンスに敏感なソフトウェアを作成するときだけです。その場合、CPU とメモリの詳細、およびコンパイラがサポートするフラグを知る必要があります。内部で何が起こっているかを理解することは良い考えですが、コンパイラーによって生成された一連の命令はユーザーの観点から正しく機能するため、あまり気にする必要はありません。気にするのは、パフォーマンスに敏感なソフトウェアを作成するときだけです。その場合、CPU とメモリの詳細、およびコンパイラがサポートするフラグを知る必要があります。

于 2012-09-19T02:15:49.917 に答える
3

アセンブラによって異なりますが、1 ワードまたは 1 バイトのメモリを指定する場合があります。
したがって、単語に 4 つの異なる文字が含まれている場合でも、それらすべてが一度にアクセスされますが、必要な文字のみが操作されます。つまり、それらすべてがメモリからプロセッサに入り、必要なバイトのみが考慮され、他のバイトは拒否されます。

于 2013-02-07T13:35:26.030 に答える