c++ - 使用 vector<char> 作为输入缓冲区比 char 数组有什么优势?

标签 c++ networking

我正在从事网络编程,我看到有人使用 vector 作为套接字的输入缓冲区而不是字符数组。

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

提前致谢..

最佳答案

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

所以你可以这样写:

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

vector “知道”它的大小,所以你可以使用 buf.size()无处不在,永远不必担心缓冲区溢出。您还可以在声明中更改大小并使其在任何地方都生效,而无需任何困惑的#defines。

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

您可以使用 buf.swap()将底层字符数组的“所有权”交给另一个 vector<char>非常有效。 (这对网络流量来说是个好主意......现代网络速度很快。你最不想做的就是为你从网络接收到的每个字节创建另一个拷贝。)而且你仍然不必明确地担心释放内存。

对于这个特定的应用程序,这些是我脑海中浮现的巨大优势。

关于c++ - 使用 vector<char> 作为输入缓冲区比 char 数组有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6435171/

相关文章:

c++ - 在构建时用整数序列填充 vector

Cordova 应用程序每分钟都会将我的位置上传到后端服务器,即使屏幕关闭或应用程序处于后台时也是如此

c++ - 如何设计具有更高可用性和可读性的图节点类?

c++ - 将指针传递给 std::function<void()>

networking - 如何将 Unix POSIX 文件描述符或标准输入句柄转换为套接字?

c - 代表 serv_addr 缓冲区的字符串是什么格式?

ios - 跟踪对象是否发布到服务器(例如 snapchat)

java - 检查 IPv4 地址是否在私有(private)范围内

c++ - 如果双重注册,如何从 boost 树中删除 child ?

c++ - CMake:在构建项目时执行 C++ 文件