我很好奇Windows和Linux是如何使用C++程序进行内存管理的。
产生这种好奇心的原因是,我刚刚用C++编写了3个非常简单的程序,可以在Linux和Windows之间移植。代码是完全相同的。硬件也是。但结果却大相径庭!两个测试都重复10次,然后计算算术平均值。
我已经在静态整数数组、类向量和堆栈(带有指针)上测试了顺序插入。插入的总次数为10^6。
Windows XP SP2 x86结果:静态整数数组: 56毫秒类向量: 686毫秒堆栈(带指针):2193毫秒
Slackware 11 x86结果:静态整数数组: 100毫秒类向量: 476毫秒堆栈(带指针):505毫秒
Windows
考虑下面这个简单的代码: class X {
int i_;
public:
X();
};
void f() {
X x;
} f的栈帧是32字节长的,与GCC,这是不必要的长。返回地址和x只需要12个字节,根据Linux/x86_64ABI应该需要16字节对齐。使用Clang时,仅分配了16个字节。为什么GCC需要这么多堆栈空间? GCC组件: f():
sub rsp, 24
lea rdi, [rsp+12]
call X::X()
add rsp, 24
ret Clang组件: f():
push rax
m