4

私は最近、自分では説明できない非常に奇妙なコード膨張効果に出くわしました... 以下は、動作する最小限の例です。

#include <array>

const int SIZE = 4000000;

struct Foo
{
    static Foo& GetInstance()
    {
        static Foo instance;
        return instance;
    }

    std::array<float, SIZE> Bar;
};

int main()
{
    Foo::GetInstance().Bar[0] = 1.0f;
    return 0;
}

結果のバイナリ (GCC MinGW 4.9.2 x86_64 posix sjlj でビルド) のサイズは15.28 MBです。ただし、eg を設定すると、代わりに17 KBのバイナリSIZE = 1が取得されます。

では、バイナリのサイズが配列のサイズに依存するのはなぜですか? どうやら、効果は構造体がシングルトンであることが原因です。それでも、コンパイラがバイナリを肥大化させるもっともらしい理由はまだわかりません。ご協力いただきありがとうございます!

(最適化の有無にかかわらず、-std=c++11フラグのみを使用してテストされました。ところで、これはCスタイルの配列でも発生します...)

4

1 に答える 1

6

「明らかに、効果は構造体がシングルトンであることによって引き起こされます。それでも、コンパイラがバイナリを肥大化させるもっともらしい理由はまだわかりません。」

はい、あなたの観察は正しいです。シングルトン インスタンスには静的ストレージ期間があります。配列のサイズがバイナリ コードのサイズを決定するという事実は、シングルトン オブジェクトのすべての初期化がコンパイル時に行われ、おそらく.textセクションに移動するためです。

ただし、それはすべて、現在使用されているコンパイラの実装と最適化レベルに依存します。

于 2015-05-13T16:14:40.727 に答える