我最近偶然发现了一个非常奇怪的代码膨胀效应,我真的无法向自己解释......以下是一个有用的最小例子:
#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风格的数组...)
答案 0 :(得分:6)
“显然,效果是由结构体成为单身人士造成的。但我仍然没有看到任何合理的推理,为什么编译器会膨胀二进制文件。”
是的,你的观察是正确的。您的单例实例具有静态存储持续时间。数组大小决定二进制代码大小这一事实是因为单个对象的所有初始化都是在编译时完成的,可能会转到.text
部分。
但这完全取决于当前使用的编译器实现和优化级别。