将read()直接用于C++ std:vector

Joe*_*Joe 17 c++ sockets buffer vector

我在一些C++中为嵌入式系统包装用户空间linux套接字功能(是的,这可能会再次重新发明轮子).

我想使用向量提供读写实现.

写入非常简单,我可以通过&myvec[0]并避免不必要的复制.我想做同样的事情并直接读入一个向量,而不是读入一个char缓冲区,然后将所有这些复制到一个新创建的向量中.

现在,我知道我想读多少数据,我可以适当地分配(vec.reserve()).我也可以读到&myvec[0],虽然这可能是一个非常糟糕的想法.显然这样做不允许myvec.size返回任何合理的东西.有没有办法做到这一点:

  1. 从安全/ C++的角度来看,并不完全令人讨厌
  2. 不涉及数据块的两个副本 - 一次从内核到用户空间,一次从C char *样式缓冲区到C++向量.

Mar*_*n B 24

resize()而不是reserve().这将正确设置向量的大小 - 然后&myvec[0],像往常一样,保证指向一个连续的内存块.

编辑:使用&myvec[0]作为指向底层数组的指针进行读取和写入是安全的,并保证可以通过C++标准工作.这就是Herb Sutter 所说的:

那么为什么人们不断询问std :: vector(或std :: array)的元素是否连续存储?最可能的原因是他们想要知道他们是否可以咳嗽指向内部的指针来共享数据,无论是读取还是写入,以及其他处理C数组的代码.这是一个有效的用途,一个足以保证标准.