5

我想重写一些使用大量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());

传递向量中第一个元素的地址是否与传递原始数组中第一个元素的地址相同。就这么简单吗?

4

3 回答 3

12

是的,向量的元素被保证是连续的,类似于数组。

参考:

C++03 标准: [lib.vector] 23.2.4 类模板向量

......
向量 的 元素 是 连续 存储 的, 这 意味着 如果v是 a vector<T, Allocator>whereT是 其他 类型bool, 那么 它 服从&v[n] == &v[0] + n所有 的 恒等 .0 <= n < v.size()

于 2012-08-21T16:04:45.563 回答
6

C++98 并没有要求对 中的数据进行连续分配std::vector,但这就是所有已知实现所做的。

从 C++03 开始​​,这已被标准化为一项要求,因此现在是必需的,而不仅仅是事情发生的方式。

于 2012-08-21T16:07:17.487 回答
3

是的,只要缓冲区永远不会为空,您就可以这样做。

如果向量是空的,那么&buffer[0]就是一个错误,即使被调用的函数通常不会因为大小为 0 而取消引用指针,它也可能会崩溃。

于 2012-08-21T16:31:47.717 回答