c++局部作用域减少内存
C++ local scopes to reduce memory?
当尝试尽可能减少内存使用时,我看到一些程序使用额外的本地作用域。这是减少足迹的最好方法吗?当括号关闭时,变量会从堆栈中删除吗?显式地对对象进行delete
是更好,还是同样好?或者编译器会直接删除多余的括号吗?
void foo()
{
{
int a = 4;
BigObject obj1;
obj1.operations(a);
}
{
double b = 9;
BigObject obj2;
obj2.operations(b);
}
}
是的,它们引入了新的作用域。具有自动存储持续时间的对象,即堆栈上的对象("局部变量"),将在此作用域结束时退出作用域。
可以保证析构函数被调用,但不能保证对象实际上从堆栈中删除(因为堆栈是一个实现细节——标准只讨论自动存储持续时间)。然而,这样做很少有性能方面的原因。相反,它在使用RAII模式时很有用。
但是请注意,这只适用于局部变量。动态分配的内存,即堆上的对象(您使用new
分配),将不释放,直到您显式地delete
它们。
动态分配的内存必须由指针指向。c++明确区分了pointer to BigObject
和BigObject
的概念。换句话说,您的程序是病态的。你应该写:
BigObject* obj1 = new BigObject();
// ^-- Important!
你不能用自动存储delete
变量,所以你的问题的一部分没有意义。
并不是说你应该用std::unique_ptr
来代替new
:
std::unique_ptr<BigObject> obj1 = make_unique<BigObject>();
为BigObject
分配的内存将在obj1
超出作用域时自动释放——这是RAII模式。
我过去一直在思考这个问题,但根据我讨厌的实验,现实是它实际上并没有节省空间。局部变量似乎仍然连续地存储在堆栈上:
int _tmain(int argc, _TCHAR* argv[])
{
int* nasty = NULL;
{
int value = 1;
std::cout << &value << std::endl;
}
{
int value2 = 2;
std::cout << &value2 << std::endl;
}
{
int value3 = 3;
std::cout << &value3 << std::endl;
nasty = &value3;
}
std::cout << nasty[0] << ", " << nasty[3] << ", " << nasty[6] << std::endl;
return 0;
}
输出:001FFC38
001FFC2C
001FFC20
3, 2, 1
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 我的boost managed_shared_memory在离开作用域时似乎不会从内存空间中取消映射
- 在释放了所有作用域内指针之后仍然可访问内存
- 具有类作用域的动态分配堆栈内存
- 我无法在堆内存和 OOP 作用域之间建立联系
- 内存分配器作用域的设计
- 文字值的作用域是什么,编译器如何为它分配内存
- 在作用域之外新建和删除内存管理
- c++新内存替换和作用域解析
- c++局部作用域减少内存
- std::string如何保持超出作用域的内存而不发生泄漏
- 局部变量在超出作用域时删除另一个变量的内存
- 分配函数作用域成员是否会导致内存泄漏
- 关于从内存中释放链表的析构函数的逻辑和作用域的问题
- 堆内存的作用域