是否过早优化以尽快破坏事物?

时间:2014-10-11 17:29:01

标签: c++ memory-leaks

假设我有很多内存将在程序的某些点分配。内存泄漏的一个重要争论是,如果在流程执行结束时操作系统将回收内存,那么占用大量内存是可以的。问题在于,即使泄漏是良性的,它仍然会占用内存。我希望我的进程一次只能“占用”大块内存。这就是我的意思:

{ // begin block
    int a[some_large_number];
    do_work_with_a();
} // destruct large allocation

{ // different block
    int a[some_large_number];
    do_work_with_a();
} // destruct large allocation

这真的有很大的不同吗?

3 个答案:

答案 0 :(得分:3)

你的例子无关紧要,这些变量在堆栈中并且不需要被释放。

此外,释放内存也不是优化,而是必须。应仔细处理堆上保留内存的每次调用,并在使用后解除分配。

您可以在堆上阅读更多内容并堆叠here

答案 1 :(得分:0)

首先,这里a处于堆栈状态,所以希望some_large_number不是太大,因为线程的堆栈大小通常以一位数兆字节来衡量。

然后第二件事,因为你担心做正确的事情:没有实际原因不要使用C风格的数组。相反,请使用std::vectorstd::array或其他一些容器类。

第三件事,你不可能在堆栈中有任何内存泄漏。您可能有堆栈溢出,并且您可能有悬空指针指向堆栈中的内容超出范围,但内存泄漏...没有。


这样的话,拥有单独的块肯定对堆栈对象更好,特别是当它们需要重新初始化时,因为简单的堆栈分配操作非常简单,基本上只是调整堆栈指针寄存器。拥有这些小范围将允许编译器在块之间的其他事物中使用相同的堆栈空间,如果有任何代码那里。同样重要的是,它将清楚地表明这些是单独的数组,并且不会传输任何数据,这也可以启用编译器有关未初始化变量的警告(如果重新使用变量并且忘记重新初始化,则无法获得这些变量)。 / p>

但是,如果您在堆中有项目,例如您实际使用std::vector,那么事情会有所不同。堆分配更昂贵,无论是制作还是发布,因此如果它是代码的性能关键部分,您可能宁愿重新使用已创建的std::vector

答案 2 :(得分:0)

没有。现代编译器已经重用了内存空间,因为int没有析构函数。但是,调试版本是一个例外,因此您可以在调试器中研究旧的数组内容。