我正在进行网络编程,我看到有人使用vector作为socket的输入缓冲区而不是char数组。
我想知道这样做有什么好处。
提前致谢..
答案 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编写网络应用程序,则可能熟悉ByteBuffer和IoBuffer。这两个类通过非常简单直观的界面使缓冲区处理变得更加容易。
在C ++世界中,非常幸运的是,使用标准的矢量类,这两个类提供的所有内容都是您可以使用的。由于vector可以动态增长,因此它比ByteBuffer和IoBuffer更强大。只需编写代码,您就可以在字节缓冲区包装器中找到所需的一切。
一些明显的优势:
答案 5 :(得分:0)
std::vector<char> buffer(SIZE)
和std::array<char, SIZE> buffer
之间的主要区别是SIZE
参数的位置:对于vector
,您只需要在运行时知道大小,就可以甚至可以根据需要更改大小。对于array
,SIZE
是模板参数,因此您需要在编译时就已经知道它,并且在重新编译之前它一直保持不变。因此,基本上std::array
只是C样式数组char buffer[SIZE]
的包装。尽管自C ++ 14标准以来,可以在C ++中动态调整C样式数组的大小,但是std::array
始终是静态大小的。但是请注意,C样式数组通常在堆栈上分配,并且在大多数实现中堆栈空间是有限的。
下一个区别是std::vector
对元素进行值初始化,这通常意味着将它们设置为零(除非您使用自定义构造函数覆盖它们),而std::array
和C样式数组保留其内容未初始化。
因此:
std::array
或C样式数组。这是更快的解决方案。std::vector
。这是更安全的解决方案。