目前我执行以下操作:
// float *c_array = new float[1024];
void Foo::foo(float *c_array, size_t c_array_size) {
//std::vector<float> cpp_array;
cpp_array.assign(c_array, c_array + c_array_size);
delete [] c_array;
}
如何优化此分配?我不想执行元素复制,只是交换指针。
答案 0 :(得分:21)
当前std::vector
不提供任何功能或接口来获取先前分配的存储的所有权。据推测,偶然传递一个堆栈地址太容易了,比它解决的问题还要多。
如果你想避免复制到矢量中,你需要在整个调用链中使用矢量,或者在整个时间内使用float[]
的C方式。你不能混合它们。您可以保证&vec[0]
将等同于C阵列,但完全连续,因此在整个程序中使用向量可能是可行的。
答案 1 :(得分:6)
目前,std::vector
界面不具备从另一个std::vector
移动或与之交换的能力。
答案 2 :(得分:4)
唯一的方法是创建自定义分配器。
编写一个可以用数组初始化的分配器类。
以分配器作为参数实例化向量。
答案 3 :(得分:1)
不太可能 - 它很危险,因为std :: vector不知道如何分配内存以及如何释放内存。
如果可能,您可以使用正确大小的std :: vector替换原始分配。它使用连续的内存区域,因此可以替换手动分配的缓冲区。