1

C++ コンパイラは、関数で初期化された変数をどのように整理して格納し、コンピューターがそれらを最速の方法で見つけられるようにしますか?

コンパイラがそれらをスタックに次々と配置することは理解していますが、その背後にはいくつかのロジックが必要です.Googleを何時間も検索していましたが、何も見つかりませんでした.

例えば:

int main()
{
    float a;
    int b;
    char c;
    double d;
}

これは、C++ コンパイラがメモリに格納する方法のため、以下のものよりも多くのメモリを占有するはずです。

もちろん、使用される正確なビットは同じですが、以下の例ではより効率的な順序で格納する必要があります。次の例では、これらの変数はコンパイラによってメモリ内のどこに格納されるでしょうか? 私が理解している限り、変数は常に次のようなブロックに格納されます(logical number) % (number of bytes the datatype) = 0

int main()
{
    char c;
    int b;
    float a;
    double d;
}
4

4 に答える 4

3

C++ 標準では、自動( stackと呼ばれるもの) 変数を特定の順序または場所に配置する必要はありません (アラインメント要件が満たされている限り)。

于 2017-01-06T15:19:03.830 に答える
0

これは、C++ コンパイラがメモリに格納する方法のため、以下のものよりも多くのメモリを占有するはずです。

実際には、両方の関数によって消費されるスタック メモリは、正常な最適化コンパイラで同じである必要があります...最新の C++ コンパイラは、特定の最適化に非常に積極的です。

適切なアラインメントを除いて、C++ は関数内の自動変数にメモリ アドレスの順序付けを課しません。それは事実ですが、プログラムの観察可能な動作はコンパイラによって変更されてはなりません。

メモリ レイアウトと変数のアドレス順序が宣言されてstructいるs とesについて話そうとしていると思います。class

C++ コンパイラは、関数で初期化された変数をどのように整理して格納し、コンピューターがそれらを最速の方法で見つけられるようにしますか?

実際には、C++ の自動変数へのすべてのアクセスは、スタック ポインター1に対する単純なポインター オフセットです (コンパイラーがレジスターに直接配置した変数を除く)。さらに、そのような自動変数を高速化するには (順不同):


1 : スタック ポインターでさえ、ほとんどのコンパイラで整列されます。

于 2017-01-06T15:21:17.870 に答える