2012-04-08 11 views
26

なぜstd :: listはC++ 11上で大きくなっていますか?このコードで

#include <iostream> 
#include <list> 

int main() { 
    std::cout << sizeof(std::list<void*>) << std::endl; 
}; 

私はそのGCC 4.7にC++ 98にstd::list<void*>のサイズは16バイトであり、C++ 11にそのサイズが24バイトで気づくことができました。

私はstd :: listで何が変わったのだろうと思っていました。

+12

技術的な観点からは、この動作は実装固有のものです。図書館の作者は、彼らが好きであれば、正当化せずにクラスを100倍大きくすることを任意に決めることができました。正確に16バイトのリストのサイズに依存するコードを記述することは、おそらく良い考えではありません。これが実際にバグを起こした場所は何でしたか? – templatetypedef

+0

ここをクリックしてください:http://en.cppreference.com/w/cpp/container/list std :: listのC++ 11でいくつかのメンバータイプが変更されていることがわかります。 – dexametason

+3

彼らはおそらくリストのサイズをキャッシュしました。 24バイトは、開始ポインタ、終了ポインタ、およびサイズの3つの64ビット値です。 – Borealid

答えて

41

C++ 11は、一定時間内に実行するにはlist::size()が必要です。 GCCはこれをadding the size as a data memberによって可能にしました。 GCCはC++ 98モードではそうしませんでした。バイナリ互換性が損なわれるからです。

C++ 98モードでコンパイルしたコードとC++ 11モードでコンパイルしたコードを混在させないでください。それは動作しません。

更新:どうやら、GCCの人々は、心の変化があったが、C++ 11準拠のでlist::size()はもはやGCC 4.7.2に一定の時間で実行されません、今の互換性を維持することよりも重要です。将来のバージョンでは、C++ 98とC++ 11の両方のモードで使用されます。

+2

'std :: list :: splice'の複雑さは何ですか? –

+0

@André:どの過負荷を呼び出すかによって異なります。いくつかの過負荷はO(1)であり、いくつかはO(N)です。 – ildjarn

+0

サイズフィールドを更新する必要があるため、イテレータによって参照されているアイテムの数をカウントする必要があります。 –

関連する問題