使用STL分配器和STL向量

时间:2010-01-22 01:31:58

标签: c++ oop stl memory-management visual-c++

这是基本问题。有一个我依赖的API,使用以下语法的方法:

void foo_api (std::vector<type>& ref_to_my_populated_vector);

有问题的代码区域是性能密集型的,我想避免使用堆来分配内存。结果,我创建了一个自定义分配器,它在堆栈上分配向量所需的内存。所以,我现在可以将矢量定义为:

// Create the stack allocator, with room for 100 elements
my_stack_allocator<type, 100> my_allocator;

// Create the vector, specifying our stack allocator to use
std::vector<type, my_stack_allocator> my_vec(my_allocator);

这一切都很好。使用堆栈分配的向量与标准向量相比的性能测试显示性能大约快4倍。问题是,我不能打电话给foo_api!所以......

foo_api(my_vec); // Results in an error due to incompatible types.
// Can't convert std::vector<type> to std::vector<type, allocator>

有解决方案吗?

1 个答案:

答案 0 :(得分:3)

您必须像函数所期望的那样使用默认分配器。你有两种不同的类型,没有办法解决这个问题。

在操作向量之前调用reserve以获取内存分配。

想想可能发生的坏事。该函数可以使用向量并开始添加更多元素。很快,你可能会溢出你分配的堆栈空间;糟糕!

如果您真的关注性能,那么更好的方法是用自定义内存管理器替换operator new和kin。我这样做了,分配可以大大改善。对我来说,分配大小为512或更小的大小约为4次操作(移动几个指针);我使用了池分配器)