1

私は64ビットのi7マシンを持っています。n個の32ビット整数にメモリを割り当てたとします。割り当てで実際に使用される物理レジスタの数:n、またはn / 2?

私はそれを見つけるために次の簡単なプログラムを書いてみました。

#include <iostream>
#include <cstdlib>

using namespace std;

int main (int argc, char *argv[]) {
    int a[4];
    cout << &a[0] << "\t" << &a[3] << endl;
    cin.ignore (1);
    return 0;
} // End main ()

出力は次のとおりです。

0018FA04        0018FA10

彼らは本来あるべきよりも遠くに見えます。アドレス04と07がないのはなぜですか?これは、システムが4つの32ビット整数を2つの64ビットレジスタにパックするのではなく、実際に4つ(またはそれ以上)の整数を割り当てていることを意味しますか?

よろしくお願いします。

4

4 に答える 4

9

各intは32ビット(4バイト)です。それらのうちの3つは12バイトになります。0x0018FA10-0x0018FA04=12。

于 2012-04-05T05:29:02.233 に答える
2

これはレイアウトです:

a[0]; // 0018FA04 00 00 00 00
a[1]; // 0018FA08 00 00 00 00
a[2]; // 0018FA0C 00 00 00 00
a[3]; // 0018FA10 00 00 00 00

レジスタのサイズとは関係ありません。

于 2012-04-05T05:32:05.810 に答える
2

私は64ビットのi7マシンを持っています。n 個の 32 ビット整数にメモリを割り当てるとします。割り当てで実際に使用される物理レジスタの数: n または n/2?

64 ビットの i7 マシンは x86_64 アーキテクチャです。

このアーキテクチャでは、32 ビット整数の配列が完全にパックされて割り当てられます。つまり、配列のサイズは 4n バイトになります。

物理レジスタで機械語を意味し、機械語が x86_64 で 64 ビットであると考える場合、はいよりも n/2 機械語を使用します。

物理レジスターという言葉は使用しません。これは、配列が割り当てられている場所ではない cpu レジスターと混同される可能性があります (非常に小さく、オプティマイザーが積極的でない限り)。

必要以上に離れているように見えます。アドレスが 04 と 07 でないのはなぜですか? これは、4 つの 32 ビット整数を 2 つの 64 ビット レジスタにパックする代わりに、システムが実際に 4 つ (またはそれ以上) の整数を割り当てていることを意味するのでしょうか?

アーキテクチャがワードアドレスではなくバイトアドレスであるためです。予想どおり、それらは 12バイト離れています。

于 2012-04-05T06:03:39.270 に答える
1

まず、使用しているシステムのintsizeof(int)の幅を確認します。次に、配列が占める文字数を指定する必要があります。私が奇妙なシステムと呼ぶものが存在しない限り(私がすでに整列していると考えるデータの奇妙な整列またはパディングのため...編集しますが、64ビットシステムは余分な32ビットでそれらをパディングする32ビットデータを整列することを好むかもしれません、そしてそれはほとんど論理的に聞こえます)提供された特定の例でそれである必要があります。もちろん、おそらく配列aはどの CPU レジスタにも保持されませんが、メイン関数のスタック上にあります。sizeof(int) * Nsizeof(int) * 4 == sizeof(a)

編集

例えば、

#include <iostream>
#include <cstdlib>

using namespace std;

int main (int argc, char *argv[]) {
    int a[4];
    cout << &a[0] << "\t" << &a[3] << endl;
    cout << sizeof(int) << " " << sizeof(a) << endl;
    cin.ignore (1);
    return 0;
} // End main ()

Sun CC -m64 でコンパイルされた sparc マシンで、

ffffffff7ffff748        ffffffff7ffff754
4 16
于 2012-04-05T05:36:09.920 に答える