尽可能快地破坏事物是不是过早的优化
Is it premature optimization to destruct things as soon as possible?
假设我有很多内存将在程序中的某些点上分配。内存泄漏的一个大争论是,如果操作系统在进程执行结束时回收大量内存,那么占用大量内存是可以的。问题是,即使泄漏是良性的,它仍然占用内存。我希望我的过程一次只"占用"大块内存。我的意思是:
{ // 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::vector
或std::array
或其他容器类。
第三件事,堆栈中的任何东西都不可能发生内存泄漏。您可能有堆栈溢出,并且可能有指向堆栈中超出范围的东西的悬空指针,但内存泄漏。。。编号
顺便说一句,对于堆栈对象来说,拥有单独的块当然更好,尤其是当它们无论如何都需要重新初始化时,因为堆栈的简单分配是非常简单的操作,基本上只是调整堆栈指针寄存器。拥有这些小作用域将允许编译器在块之间使用相同的堆栈空间来处理其他事情(如果有任何代码的话)。同样重要的是,它将清楚地表明这些是单独的数组,并且没有数据被遗留,这也会启用关于未初始化变量的编译器警告(如果您重复使用变量并忘记重新初始化,则不会得到警告)。
但是,如果您有堆中的项目,例如您实际使用的std::vector
,那么情况就有点不同了。堆分配无论是制作还是发布都更昂贵,因此如果是代码的性能关键部分,您可能更愿意重用已经创建的std::vector
。
否。现代编译器将已经重用内存空间,因为int
没有析构函数。但是,调试生成是一个例外,因此您可以研究调试器中的旧数组内容。
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 在枚举类型上使用std::max是不是一种糟糕的做法
- std::元组大小,是不是错过了优化?
- 拥有相同方法的静态和非静态版本是不是设计不好
- 他是不是很贪婪
- SDL2:移动所有东西而不是使用视图端口是不是很糟糕
- OOP-我是不是把事情复杂化了
- 在DLL中分配内存并将其指针提供给客户端应用程序,这是不是一种糟糕的做法
- 在C++代码中使用C风格的注释是不是一种糟糕的做法
- 如果我在C++中使用堆,我是不是做错了什么
- 这个简单但有用的模式是不是太简单了,不可能成为一个真正的模式
- 在C++中,通过引用传递常量布尔值是不是不好的
- 在main.cpp中而不是在头文件中定义函数是不是一种糟糕的做法
- 既然智能指针已经存在,那么使用C型指针是不是已经过时了
- LNK2019:未解析的外部符号;我是不是忘了
- 重载一个函数同时获取指针或引用是不是一种糟糕的做法
- 是不是比较意味着一个分支
- 标准池:wstring.是不是这种做法太幼稚了
- 尽可能快地破坏事物是不是过早的优化