我想知道是否有一种在RAM中重新利用空间的有效方法。
让我们说我的函数在专用空间中创建了四个不同的数组和10个变量。然后调用一些其他函数,它将分配的空间归零并创建自己的结构,这是不同的。我有什么选择?这样做有直接的方式吗?
答案 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/maps
,cat /proc/$$/maps
和cat /proc/$$/smaps
以了解有关虚拟地址空间的更多信息。增加虚拟地址空间的主要系统调用是proc(5)。
如果您想在C ++中重用一些新的(或另一个)数据结构的现有有效地址,您将使用 placement new
运算符。详细了解mmap(2)。您可能希望在重用某个对象使用的空间之前调用一些析构函数。另请阅读operator new
,union types和tagged unions
请注意std::variant
编程习语和RAII。
不要害羞使用指针。在C ++中,大多数时候更喜欢rule of five。详细了解smart pointers。