我应该使用什么数据类型作为缓冲区?

时间:2016-12-29 22:36:00

标签: c++ string buffer boost-asio

我正在编写一个简单的聊天服务器,我想知道我应该将哪种数据类型用于缓冲区。我在考虑string(在我的情况下会很舒服),但是很多次我看到有人写string不应该用作缓冲区(更好地使用vector<char>)但情况总是这样吗?

在我的程序中,我想从客户端读取一些消息到缓冲区,将该数据发送到其他客户端,并将该消息存储在数据库中。我使用SQLite,string(跳过数据库初始化)它看起来像这样:

std::string buffer;
buffer.resize(1024);

// read some data into the buffer
socket.async_read_some(boost::asio::buffer(&buffer[0], 1024),
    [this, self](boost::system::error_code ec, size_t length)
{
    buffer.resize(length);

    // do some other things with buffer - send to another user ...

    std::string query = "INSERT INTO messages (message) VALUES (\"" + buffer "\")";

    sqlite3_exec(database, query.c_str(), sql_callback, NULL, &err_msg);
}

如果我要使用vector<char>,我首先需要将其转换为字符串(或者可能还有另一种方式?)

那我该怎么用?

1 个答案:

答案 0 :(得分:2)

如果您的用例主要需要一些&#34;转换&#34;到std::string,那么简单地使用std::string可能是个好主意。使用std::string作为字符缓冲区与std::vector<char>之间最明显的区别是允许前者执行一些神奇的短字符串优化(取决于库供应商)。虽然后者不允许这样做。你的里程可能会变化。

  

如果我要使用vector<char>,我首先需要转换   它是一个字符串(或者还有另一种方式?)

是的,你必须std::vector<char>std::string&#34;转换&#34;像这样:

std::string query = "INSERT INTO messages (message) VALUES (\"" + std::string(buffer.begin(), buffer.end()) + "\")";

通过一些工作,您可以避免创建由缓冲区&#34;转换&#34;产生的临时(和多个内存分配)。 使用std::string::operator +连接。

std::string build_query(const char* left_string, std::size_t left_string_size,
                        const std::vector<char>& buffer,
                        const char* right_string, std::size_t right_string_size)
{
    std::string query;
    query.reserve(left_string_size + buffer.size() + right_string_size + 1);
    query.append(left_string);
    query.append(buffer.begin(), buffer.end());
    query.append(right_string);
    return query;
}

并使用如下:

std::vector<char> buffer(24);

constexpr char left[] = "INSERT INTO messages (message) VALUES (\"";
constexpr char right[] = "\")";
std::string query = build_query( left, len(left), buffer, right, len(right) );

请在此处查看完整示例:Live On Coliru

从长远来看,您可以更进一步,编写一些简洁的模板助手,以涵盖从std::vector<char>构建查询字符串的更一般情况。

至于表现,你必须衡量。虽然GCC和Clang虽然不是一个有效的衡量标准,但实际上build_query的{​​{1}}指令比常规&#34;转换&#34;。