尽可能快地破坏事物是不是过早的优化

Is it premature optimization to destruct things as soon as possible?

本文关键字:是不是 优化 尽可能      更新时间:2023-10-16

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

{ // 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

这真的有很大的不同吗?

您的示例不相关,这些变量在堆栈中,不需要释放。

此外,释放内存也不是优化,而是必须的。每次调用堆上的保留内存都应该小心处理,并在使用后释放。

你可以在这里阅读更多关于堆和堆栈的内容。

首先,这里a在堆栈中,所以希望some_large_number不会太大,因为线程的堆栈大小通常以个位数兆字节为单位。

第二件事,因为你担心做对事情:不要在没有实际原因的情况下使用C样式数组。而是使用std::vectorstd::array或其他容器类。

第三件事,堆栈中的任何东西都不可能发生内存泄漏。您可能有堆栈溢出,并且可能有指向堆栈中超出范围的东西的悬空指针,但内存泄漏。。。编号


顺便说一句,对于堆栈对象来说,拥有单独的块当然更好,尤其是当它们无论如何都需要重新初始化时,因为堆栈的简单分配是非常简单的操作,基本上只是调整堆栈指针寄存器。拥有这些小作用域将允许编译器在块之间使用相同的堆栈空间来处理其他事情(如果有任何代码的话)。同样重要的是,它将清楚地表明这些是单独的数组,并且没有数据被遗留,这也会启用关于未初始化变量的编译器警告(如果您重复使用变量并忘记重新初始化,则不会得到警告)。

但是,如果您有堆中的项目,例如您实际使用的std::vector,那么情况就有点不同了。堆分配无论是制作还是发布都更昂贵,因此如果是代码的性能关键部分,您可能更愿意重用已经创建的std::vector

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