在RAM中分配空间,然后在此处创建和销毁不同的数据结构

时间:2017-10-11 07:17:54

标签: c++ data-structures

我想知道是否有一种在RAM中重新利用空间的有效方法。

让我们说我的函数在专用空间中创建了四个不同的数组和10个变量。然后调用一些其他函数,它将分配的空间归零并创建自己的结构,这是不同的。我有什么选择?这样做有直接的方式吗?

2 个答案:

答案 0 :(得分:3)

这种直截了当的方式是使用C.这就是“适当”的地方。在C ++中,不要。

在C ++中,初始化函数一起使用数据类型(称为构造函数)。分配是使用new完成的,或者更好的是,new由容器(例如矢量或智能指针)完成。

示例:

<强> Live On Coliru

#include <vector>
#include <iostream>

struct MyData {
    int value;
    std::string name;

    MyData() : value(0), name("") 
    { }

    ~MyData() {
        if (!name.empty()) {
            std::cout << "The element with name " << name << " is being destructed\n";
        }
    }
};

int main() {
    std::vector<MyData> v(100); // allocates 100 MyData instances, all initialized to `0, ""`

    v[5].value = 5;
    v[5].name = "Five";

} // here, all of the vector is destructed and memory is correctly "de-allocated" (freed).

打印:

The element with name Five is being destructed

摘要

您在上面看到的“自动化”是C ++ C ++的原因。它是一种更好的语言¹,它具有抽象功能,使您无需完成所有工作(并使其正确)。

¹客观地说,与C相比。当然,它可能使用错误,但所有语言都是如此。

答案 1 :(得分:2)

你没有在(物理)RAM中分配(至少在Linux,Windows,MacOSX等普通操作系统上),你在virtual address space中使用{{3}进行分配} system calls使用分配函数(例如C中的malloc,C ++中的operator new)。另请阅读standard library以了解有关操作系统的更多信息。

在Linux上,请阅读Operating Systems: Three Easy Pieces并尝试cat /proc/self/mapscat /proc/$$/mapscat /proc/$$/smaps以了解有关虚拟地址空间的更多信息。增加虚拟地址空间的主要系统调用是proc(5)

如果您想在C ++中重用一些新的(或另一个)数据结构的现有有效地址,您将使用 placement new 运算符。详细了解mmap(2)。您可能希望在重用某个对象使用的空间之前调用一些析构函数。另请阅读operator newunion typestagged unions

请注意std::variant编程习语和RAII

不要害羞使用指针。在C ++中,大多数时候更喜欢rule of five。详细了解smart pointers