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

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

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

4

1 回答 1

6

“显然,这种影响是由于结构是单例造成的。但我仍然看不出编译器会膨胀二进制文件的任何合理推理。”

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

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

于 2015-05-13T16:14:40.727 回答