【发布时间】:2011-01-08 00:47:14
【问题描述】:
这是基本问题。有一个我依赖的 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>
有解决办法吗?
【问题讨论】:
-
一般来说,在堆栈上分配数据没有安全和理智的方法。不要那样做,它迟早会坏掉的。简单地调用reserve() 来确保一次性分配内存怎么样?或者,如果您想要堆栈中的所有内容,请使用固定大小的数组
-
std::vector<type, my_stack_allocator>应该是std::vector<type, my_stack_allocator<type, 100>,是吗?typedef在这里会有所帮助。 -
没错 GMan -- 抱歉 :-/ 它非常安全。事实上,它已经完成了:src.chromium.org/viewvc/chrome/trunk/src/base/stack_container.h
-
@Andrew:太糟糕了。因为如果你能做到
template<typename Iter> void foo_api(Iter begin, Iter end);它会很好而且通用,并且可以与任何容器一起使用。 -
或者
template <typename Sequence> void foo_api(Sequence &ref);,这样就不用过多修改foo_api的代码了。这取决于它使用的向量的成员函数。 foo_api 可能添加/删除任意元素,在这种情况下,使用迭代器编写 API 的唯一方法是复制和修改。
标签: c++ oop stl memory-management visual-c++