3
#include <iostream>

    using namespace std;

    int main(int argc, const char * argv[])
    {

        int size;
        cin >> size;
        int myArray[size]; //this shouldn't compile , right ? 

        return 0;
    }

これはコンパイルされないと思いましたが、実際にはコンパイルされます(g ++コマンドを使用)。

後でわかったことは、標準のC ++が可変サイズの配列をサポートしていない場合でも、GCCは実際には可変サイズの配列を許可しているということです。これは奇妙なことです。int* array = new int[size];可変サイズ配列を作成する唯一の方法は、またはそれ以上の動的割り当てを使用することであると誰もが言っているのを聞いているからですstd::vector。GCCはそのコードを許可しないと思いました!

とにかく、私の理論的な質問は、配列がヒープまたはスタック領域myArrayに割り当てられているということです。

4

3 に答える 3

2

これはコンパイラ側の拡張機能です。それはどのように機能しますか?まあ、それはある程度しか機能しません。

実装は基本的に、スタックポインタを配列のサイズに依存する量だけ移動し、配列の名前で中央のメモリを呼び出します。VLAではサイズが型の不可欠な部分ではないため、ある程度しか機能しません。つまり、たとえば参照によって配列をテンプレートに渡すなど、通常の配列で使用できる多くの構造はこの型では実行できません。 ...sizeof通常は提供されますが、ランタイム構造として実装されます。

于 2012-09-18T21:22:12.250 に答える
0

あなたの例のmyArrayはスタックに割り当てられています。g ++には、このトリックを可能にする拡張機能があります。これを行うためにヒープは必要ありません。コンパイラは、実行時に計算される量だけスタックポインタを増やすコードを生成するだけです。

于 2012-09-18T21:21:11.953 に答える
0

VLAは拡張機能であり、多くの実装にはC++言語に対する独自の拡張機能があります。g ++に標準に準拠していないと文句を言う場合は、-pedanticフラグを渡します。VLAは非常に高速なスタック上にありますが、スタックスペースが限られているため、これも問題の原因になります。ただし、C ++にはstd::vector、などの構造があるため、実際に使用する必要はありません。

于 2012-09-18T21:28:48.847 に答える