关于c ++:将STL分配器与STL向量一起使用

Using STL Allocator with STL Vectors

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

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

所讨论的代码区域是相当高的性能密集型的,我希望避免使用堆来分配内存。因此,我创建了一个自定义分配器,它分配堆栈上向量所需的内存。现在我可以定义一个向量为:

1
2
3
4
5
// 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!所以…

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

有解决办法吗?


您必须按照函数的预期使用缺省分配器。你有两种不同的类型,这是不可能的。

在对向量进行操作之前,只需调用reserve就可以避免内存分配。

想想可能发生的坏事。这个函数可以得到你的向量并开始添加更多的元素。很快,您就可以将分配的堆栈空间溢出;哎呀!

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