C ++本地范围减少内存?

时间:2014-06-11 18:48:55

标签: c++

当尝试尽可能减少内存使用时,我看到一些程序使用其他本地范围。这是减少足迹的最佳方法吗?当括号关闭时,是否会从堆栈中删除变量?明确delete对象会更好吗,还是同样好?或者编译器会删除多余的括号?

void foo()
{
    {
        int a = 4;
        BigObject obj1;
        obj1.operations(a);
    }
    {
        double b = 9;
        BigObject obj2;
        obj2.operations(b);
    }
}

2 个答案:

答案 0 :(得分:5)

是的,他们引入了新的范围。具有自动存储持续时间的对象,即堆栈中的对象("局部变量")将会消失范围的最后范围。

您可以保证调用析构函数,但不能保证对象实际上是从堆栈中删除的(因为 stack 是一个实现细节 - 标准只涉及自动存储持续时间)

然而,这样做的表现很少。相反,它在使用RAII pattern时非常有用。

但请注意,仅适用于本地变量。动态分配的内存,即堆上的对象(使用new分配的), not 将被释放,直到您明确delete它们为止。

指针必须指向动态分配的内存。 C ++清楚地区分了pointer to BigObjectBigObject的概念。换句话说,你的程序是不正确的。你应该写:

BigObject* obj1 = new BigObject();
//       ^-- Important!

您不能使用自动存储delete变量,因此您的部分问题没有意义。

而不是使用new,而不是使用std::unique_ptr代替:

std::unique_ptr<BigObject> obj1 = make_unique<BigObject>();

BigObject超出范围时,为obj1分配的内存将自动释放 - 这是RAII模式。

答案 1 :(得分:-1)

我过去曾经考虑过这个问题,但事实上,根据我讨厌的实验,它实际上并没有节省空间。本地人似乎仍然在筹码上连续存货:

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