我想重写一些使用大量unsigned char
数组的代码,而不是使用std::vector<unsigned char>
个对象。我遇到的问题是,这些目前用于存储将写入串行端口或套接字写缓冲区的数据,而执行此操作的库函数需要void*
或unsigned char*
。这种功能的一个例子是
WriteToSocketBuffer(unsigned char* pBuffer, int iSize);
所以目前我有
形式的代码 unsigned char* pArray = new unsigned char[iSize];
// populate array with data
WriteToSocketBuffer(pArray,iSize);
delete [] pArray;
我的问题如下:如果我改变我的班级以使用std::vector<unsigned char>
而不是原始数组,我可以使用
std::vector<unsigned char> myVector;
WriteToSocketBuffer(&myVector[0],myVector.size());
传递向量中第一个元素的地址是否与传入原始数组中第一个元素的地址相同。这很简单吗?
答案 0 :(得分:12)
是的,确保向量的元素与数组相似是连续的。
参考:
C ++ 03标准: [lib.vector] 23.2.4班级模板载体
......
的身份
向量的元素是连续存储的,这意味着如果v
是vector<T, Allocator>
,其中T
是bool
以外的某种类型,那么遵守所有&v[n] == &v[0] + n
0 <= n < v.size()
答案 1 :(得分:6)
C ++ 98没有要求对std::vector
中的数据进行连续分配,但这就是所有已知实现所做的事情。
从C ++ 03开始,这被标准化为一项要求,因此现在需要它,而不仅仅是事情的发生方式。
答案 2 :(得分:3)
是的,你可以这样做,只要缓冲区永远不会是空的。
如果向量是空的,那么&buffer[0]
是一个错误,即使被调用的函数通常不会取消引用指针因为大小为0,它也可能会崩溃。