C ++释放内存的确切大小

时间:2016-02-14 21:13:57

标签: c++ performance list memory dynamic

我已经考虑过如何通过在程序启动时读入的(无符号)整数提高列表排序读取的性能,并且在程序退出之前不会改变。我想到了不同的可能性,但后来我有了一个想法,我想知道这是否可能,如果没有,为什么不呢 - 因为在我的理论中它应该可以用于计算机。

我有一个类似10.000条目的列表,每个条目都有一个唯一的ID(唯一ID不是0)。现在如何分配大小为object* pList = new(sizeof(object) * max_unique_id)的内存,然后删除所有未使用的内存(检查哪个唯一ID不存在,并在大小sizeof(对象)的位置释放内存)...你将使用只需要所需的内存,您只需访问pList[unique_id]的列表条目 - >会真的,​​非常快......但是你不能删除动态分配数组中的单个元素:/在程序终止时你当然可以释放所有元素,安全指针+大小在std ::没有问题矢量或者那样的。

这就是为什么我要问我的理论是否不正确,或者系统是否不允许或问题出在何处。

3 个答案:

答案 0 :(得分:4)

不,你不能那样控制记忆。但是, IS 可能会作弊。如果要分配大块内存,则可以创建自己的内存池。这样,您可以自己创建漏洞并将该内存用于程序的其他部分。

我不推荐它,因为您可能遇到严格别名的问题,以及必须处理代码中更复杂的问题。

稍微回卷一下,你忘记了缓存效果,这很重要。保持对象紧密堆积在一起可能会比速度更快地影响速度。

要实现这一点,您可以使用简单的哈希来查找对象,或者您可以创建一个16位索引的稀疏索引数组。

答案 1 :(得分:0)

你可以,(虽然我不知道你为什么要这样做),但你必须把它写成你自己的自定义内存分配和释放例程或类。使用开箱即用的标准C ++库,你就可以了。

参见一些用于在C ++中分配内存的接口

void* operator new  ( std::size_t );
void* operator new[]( std::size_t );
void* operator new  ( std::size_t, const std::nothrow_t&);
void* operator new[]( std::size_t, const std::nothrow_t&);

void* operator new[]( std::size_t );为例。这个例程绝对没有办法知道将返回的内存区域中存储了多少对象。

与它的匹配功能相同

 void operator delete[]( void* ptr );

它只需要一个void指针,绝对没有办法知道你要删除多少。从ptr magically指向的块开始提供内存的内存分配器知道它分配的大小,因此适当地删除它

答案 2 :(得分:0)

使用placement new

object* pList = new(sizeof(object) * max_unique_id)

不要这样做。 new不是malloc。但你也不能这样做:

object* pList = new object[max_unique_id];
delete object[1];

C ++不允许使用简单的delete删除动态分配的数组中单独分配的元素。

C ++允许您使用placement new在预先分配的内存空间中创建对象。在这种情况下,您必须手动调用构造函数并调用placement new和析构函数。

参考:Malloc and constructors

A* a = (A*)malloc(sizeof(A));
new (a) A();

a->~A();
free(a);

换句话说,提供您想要创建特定对象的确切位置。我建议你使用一个循环:

// Allocate the space using malloc()
object* pList = std::malloc(sizeof(object) * max_unique_id);

// Allocate using a loop. I would not trust a parallelization of this code.
// Doing memory allocation in parallel without the proper locks and stuff
// is probably wrong.
for (auto i = 0; i < max_unique_id; ++i) {
  // Supply the point as the argument to placement new.
  new (&pList[i]) object(/* arguments go here */);
}

然后,当您使用某个对象完成后,请说i = 20 ...

// Select the object
object* todelete_object = pList[i];
// Manually call the destructor.
todelete_object->~object()
// Now, free the memory.
std::free(todelete_object);

我使用C ++风格的C标准库中定义的std::malloc()std::free()