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

#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 。但是,如果您设置例如SIZE = 1 你会得到一个 17 KB 二进制文件。

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

(使用和不使用优化以及仅使用 -std=c++11 标志进行测试。顺便说一句,这也发生在 C 样式数组中......)

最佳答案



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

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

关于c++ - 为什么我的二进制文件的大小取决于数组的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30220104/

10-08 22:11
查看更多