私は最近、自分では説明できない非常に奇妙なコード膨張効果に出くわしました... 以下は、動作する最小限の例です。
#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スタイルの配列でも発生します...)