C++ 为什么二进制文件的大小取决于数组的大小?

C++ 为什么二进制文件的大小取决于数组的大小?,c++,arrays,c++11,mingw,stdarray,C++,Arrays,C++11,Mingw,Stdarray,我最近偶然发现了一个非常奇怪的代码膨胀效应,我真的无法向自己解释。。。以下是一个有效的示例: #include <array> const int SIZE = 4000000; struct Foo { static Foo& GetInstance() { static Foo instance; return instance; } std::array<float, SIZE> Bar;

我最近偶然发现了一个非常奇怪的代码膨胀效应,我真的无法向自己解释。。。以下是一个有效的示例:

#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;
}
#包括
const int SIZE=4000000;
结构Foo
{
静态Foo&GetInstance()
{
静态Foo实例;
返回实例;
}
std::数组条;
};
int main()
{
Foo::GetInstance().Bar[0]=1.0f;
返回0;
}
生成的二进制文件(使用GCC MinGW 4.9.2 x86_64 posix sjlj构建)大小15.28 MB。但是,如果设置例如
SIZE=1
,则会得到17 KB的二进制文件

那么为什么二进制文件的大小取决于数组的大小呢?显然,这种效果是由结构是单体引起的。然而,我仍然看不到任何合理的理由,为什么编译器会膨胀二进制文件。谢谢你的帮助

(仅使用
-std=c++11
标志进行测试,无论是否进行优化。顺便说一句,c样式数组也会出现这种情况…)

“显然,这种效果是由于结构是一个单例造成的。但是我仍然看不到编译器为什么会膨胀二进制文件的任何合理的理由。”

是的,你的观察是正确的。您的单例实例具有静态存储持续时间。数组的大小决定了二进制代码的大小,这是因为单例对象的所有初始化都是在编译时完成的,可能会转到
.text
部分


但这一切都取决于当前使用的编译器实现和优化级别。

因为具有静态存储持续时间的对象通常存储在可执行文件的特殊部分(当然,这取决于实现)。因此,你的物体越大,那部分就越大。静态var值存储在程序文件中,显然GCC并不关心大多数值是否为0。除此之外,4Mio静态阵列看起来是错误的。这样大的堆栈数组甚至是不可能的(通常的系统+设置),所以不要在没有动态内容的情况下创建这样的数组。@DarkFalcon:但是零初始化对象通常不会存储在可执行文件中,因为这是非常浪费的;它们在
.bss
部分中有一个条目,因此可以在运行时对其进行初始化。可能由于某种原因,这个特定的编译器不会对本地静态变量执行此操作。FWIW,该代码在Linux上为我提供了一个8kb的可执行文件。这一定是明的一种怪癖。我建议你停止尝试使用Windows,这不会有任何好处。@MikeSeymour这与(你对)Windows的主观看法无关!对于MSVC13,我有一个10kb的可执行文件,使用本机工具链。