这是基本问题。有一个我依赖的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>
有解决方案吗?
答案 0 :(得分:3)
您必须像函数所期望的那样使用默认分配器。你有两种不同的类型,没有办法解决这个问题。
在操作向量之前调用reserve
以获取内存分配。
想想可能发生的坏事。该函数可以使用向量并开始添加更多元素。很快,你可能会溢出你分配的堆栈空间;糟糕!
如果您真的关注性能,那么更好的方法是用自定义内存管理器替换operator new
和kin。我这样做了,分配可以大大改善。对我来说,分配大小为512或更小的大小约为4次操作(移动几个指针);我使用了池分配器)