使用vector <char>作为char数组的输入缓冲区有什么好处?</char>

时间:2011-06-22 05:12:08

标签: c++ networking

我正在进行网络编程,我看到有人使用vector作为socket的输入缓冲区而不是char数组。

我想知道这样做有什么好处。

提前致谢..

6 个答案:

答案 0 :(得分:5)

vector<char>基本上只是一个托管字符数组。

所以你可以写:

{
    vector<char> buf(4096);
    ...
    int result = recv(fd, &buf[received_so_far], buf.size() - received_so_far);
    ...
}

向量“知道”它的大小,因此您可以在任何地方使用buf.size(),而不必担心超出缓冲区。您还可以更改声明中的大小,并使其在任何地方生效,而不会出现任何混乱的#defines。

buf的这种使用将在堆上分配底层数组,并且当buf超出范围时,它将自动释放它,无论这种情况如何发生(例如异常或提前返回)。因此,您可以获得堆栈分配的良好语义,同时仍然可以在堆上保留大型对象。

您可以非常有效地使用buf.swap()将基础角色数组的“拥有权”另一个vector<char>。 (这对网络流量来说是一个好主意......现代网络很快。你要做的最后一件事就是创建你从网络收到的每个字节的另一个副本。)你仍然不必担心明确释放记忆。

对于这个特定的应用程序而言,这些都是我最大的优势。

答案 1 :(得分:3)

使用vector是:

  • 容易长大的记忆空间。
  • 易于复制数据。
  • 轻松自由。

答案 2 :(得分:2)

我的主要原因是:

  • 其例外安全。
    • 无论出现什么问题,矢量都不会泄漏内存。

答案 3 :(得分:1)

vector可以很容易地调整大小,并且可以方便地部分删除数据 - 这是一个很大的优势。在许多情况下,具有固定大小的阵列是不方便的 - 例如,您将读取数据块并以小于接收块的块处理接收的数据。然后你想知道剩下的实际数据量 - vector.size(),你不必将它存储在一个单独的变量中,当你删除部分数据时vector将移动剩余的数据对你而言。

答案 4 :(得分:0)

如果您曾使用Java编写网络应用程序,则可能熟悉ByteBufferIoBuffer。这两个类通过非常简单直观的界面使缓冲区处理变得更加容易。

在C ++世界中,非常幸运的是,使用标准的矢量类,这两个类提供的所有内容都是您可以使用的。由于vector可以动态增长,因此它比ByteBuffer和IoBuffer更强大。只需编写代码,您就可以在字节缓冲区包装器中找到所需的一切。

一些明显的优势:

  • 使用vector :: reserve
  • 预分配内存
  • 使用vector :: size
  • 记住缓冲区位置
  • 使用vector :: resize
  • 生长/清除缓冲区
  • 使用&amp; your_vector [0]
  • 转换为C缓冲区
  • 使用vector :: swap
  • 传输缓冲区所有权
  • ......还有更多值得发现。

答案 5 :(得分:0)

std::vector<char> buffer(SIZE)std::array<char, SIZE> buffer之间的主要区别是SIZE参数的位置:对于vector,您只需要在运行时知道大小,就可以甚至可以根据需要更改大小。对于arraySIZE是模板参数,因此您需要在编译时就已经知道它,并且在重新编译之前它一直保持不变。因此,基本上std::array只是C样式数组char buffer[SIZE]的包装。尽管自C ++ 14标准以来,可以在C ++中动态调整C样式数组的大小,但是std::array始终是静态大小的。但是请注意,C样式数组通常在堆栈上分配,并且在大多数实现中堆栈空间是有限的。

下一个区别是std::vector对元素进行值初始化,这通常意味着将它们设置为零(除非您使用自定义构造函数覆盖它们),而std::array和C样式数组保留其内容未初始化。

因此:

  • 如果您需要一个已知固定大小的缓冲区,如果该大小不超过几千字节,并且如果该缓冲区的内容将由应用程序正确写入,请使用std::array或C样式数组。这是更快的解决方案。
  • 否则,请使用std::vector。这是更安全的解决方案。