这是我在 windows 7 下的 MSVC++ 2010 上做的一个简单测试:
// A struct with sizeof(s) == 4, e.g 4 bytes
struct s
{
int x;
};
// Allocate 1 million structs
s* test1 = new s[1000000];
// Memory usage show that the increase in memory is roughly 4 bytes * 1000000 - As expected
// NOW! If I run this:
for (int i = 0; i < 1000000; i++)
new s();
// The memory usage is disproportionately large. When divided by 1000000, indicates 64 bytes per s!!!
这是常识还是我遗漏了什么?以前我总是习惯于在需要时即时创建对象。例如 new Triangle() 用于网格中的每个三角形等。
单个实例的动态内存分配是否确实存在数量级的开销?
干杯
编辑:
刚刚使用 g++ 在 Windows XP 上编译并运行了相同的程序:现在开销是 16 字节,而不是之前观察到的 64 字节!非常有趣。
不一定,但操作系统通常会为您预留内存,以它认为方便的任何大小的 block 为单位;在您的系统上,我猜它会为您提供每个请求 64 字节的倍数。
毕竟,跟踪内存分配会产生开销,而且保留非常小的数量是不值得的。
我是一名优秀的程序员,十分优秀!