2017-11-21 12 views
-1

私はC99であなたのサイズはこのように、パラメータの値である配列宣言することができることを知っている:私が理解から隠しメモリ割り当てですか?

void foo(int size) { 
    int array[size]; 
    // do stuff 
} 

を関数が呼び出されたとき、それはスタック上に割り当てられています。どうやら、これはC++で動作するはずではありません。

は最近、私はC++でこのような何かを書いた:

void bar(vector<Thing> vec) { 
    for (Thing t : vec) { 
    int n = t.get_n(); 
    int array[n]; 
    // do stuff 
    } 
} 

驚くべきことに、コンパイラ(G ++)は、なぜ、文句はないのですか? 隠れたメモリ割り当てがありますか?

+5

あなたの警告をオンにしなかったので、gcc拡張子 –

+2

なぜ[可変長配列はC++標準の一部ではないのですか?](https://stackoverflow.com/questions/1887097)/why-arent-variable-length-arrays-c-standardの一部)またはhttps://stackoverflow.com/questions/7812566/why-no-variable-size-array-in-stackまたはhttps: //stackoverflow.com/questions/17899274/g-variable-size-array-no-warningまたはhttps://stackoverflow.com/questions/43857625/variable-sized-array-on-the-stackなど –

答えて

4

可変長配列はC++標準の一部ではありません。これはG ++によって提供される拡張機能です。

-pedanticフラグでコンパイルすると、コンパイラは警告を発します。

3

GCCでは、標準準拠ではないにもかかわらず、デフォルトでC++で可変長配列(別名VLA)を使用できます。

たとえば、-std=c++14オプションを指定して標準に厳密に従うように指示すると、コードが正しく拒否されます。

+0

私は、 'set(CMAKE_CXX_STANDARD 11)'オプションを使って、cmakeを使ってプロジェクトをビルドしました。これは '-std = C++ 11'をコンパイラに渡すが、あなたが言っていないことによると、それは配列について不平を言うだろう。 – DBLouis

+3

いいえ:https://cmake.org/cmake/help/v3.1/prop_tgt/CXX_STANDARD.html => _ "一部のコンパイラでは、' -std = gnu ++ 11'のようなフラグを追加しますコンパイルすることができます。 "それゆえ、GNU拡張を静かに許可するかもしれません。愚かなはい、文書化されていない。 –

+0

@DBLouis私は推測していますが、それはおそらくgnu ++ 11ではなくGNU拡張を可能にするC++ 11になりました。 –