我有一个类似于下面的代码:
myLibFunc(std::vector<char > &data)
{
// dosomthing with data
}
myFunc(char *buffer,int bufferSize)
{
std::vector<char > mydata(buffer,buffer+bufferSize);
myLibFunc(mydata);
}
代码可以工作,但是向量为自己分配了内存而没有使用已经可用的内存。
如何更改vector使用可用内存而不分配内存的代码?
请注意,我无法更改功能的签名。
我有两个函数,在其中一个函数中,我收到一个缓冲区,我需要操作内存并将其作为向量传递给下一个函数。我试图实现的功能,如果接口的一部分让我无法改变它,另一个功能是我需要调用的库,所以我不能改变函数的签名。问题是上面的代码分配了一个新的内存并将数据从缓冲区复制到它不是最佳的。 -
答案 0 :(得分:0)
如果您无法更改功能的签名,则无法复制。
但更好的方法是考虑你的界面。如果在随机访问迭代器上构建myLibFunc
,则问题就解决了:
template <class CharRandomAccessIterator>
myLibFunc(CharRandomAccessIterator& begin, CharRandomAccessIterator& end )
{
// dosomthing with data
size = end - begin;
begin[xyz]; // access elements
}
myFunc(char *buffer,int bufferSize)
{
std::vector<char > mydata(buffer,buffer+bufferSize);
myLibFunc(mydata.begin(), mydata.end()); // This will work
myLibFunc(buffer, buffer+size); // This will work too
}
答案 1 :(得分:0)
std :: vector旨在专门拥有它所拥有的数据,因此执行内存复制是std :: vector工作的唯一安全方式。这只留下了不安全的黑客。如果我们可以假设函数不改变向量大小,你可以滥用std :: vector。在我的编译器中(在g ++ 4.8和cpp.sh上测试),std :: vector实现为三个指针(开始数据,结束使用数据和结束alloc),因此我可以将向量滥用为:
>>> del trg[:]
>>> trg.extend(src)
请注意,此滥用可能是不可移植的,并导致无法解释的崩溃。