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

Ren*_* R. 4 c++ arrays mingw c++11 stdarray

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

生成的二进制文件(使用GCC MinGW 4.9.2 x86_64 posix sjlj构建)的大小为15.28 MB.但是,如果设置为eg,SIZE = 1则会获得17 KB二进制文件.

那么为什么二进制的大小取决于数组的大小呢?显然,效果是由结构为单身人士引起的.然而,我仍然没有看到任何合理的推理,为什么编译器会膨胀二进制文件.谢谢你的帮助!

(使用和不使用优化测试并-std=c++11仅使用标志.顺便说一下,这也适用于C风格的数组...)

πάν*_*ῥεῖ 6

"显然,结果是单例导致结果.但我仍然没有看到任何合理的推理,为什么编译器会膨胀二进制文件."

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

但这完全取决于当前使用的编译器实现和优化级别.