簡體   English   中英

我應該使用什么數據類型作為緩沖區?

[英]What data type should I use as a buffer?

我正在寫一個簡單的聊天服務器,我想知道我應該為緩沖區使用什么數據類型。 我正在考慮string (在我的情況下會非常舒服),但是很多次我看到寫string人不應該用作緩沖區(最好使用vector<char> )但總是這樣嗎?

在我的程序中,我想從客戶端讀取一些消息到緩沖區,將該數據發送到其他客戶端,並將該消息存儲在數據庫中。 我使用SQLite,使用string (跳過db初始化),它看起來像這樣:

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> ,我首先需要將其轉換為字符串(或者可能還有另一種方式?)

那我該怎么用?

如果你的用例主要需要對std::string一些“轉換”,那么簡單地使用std::string可能是個好主意。 使用std::string作為字符緩沖區與std::vector<char>之間最明顯的區別是前者被允許做一些神奇的短字符串優化 (取決於庫供應商)。 雖然后者不允許這樣做。 你的旅費可能會改變。

如果我要使用vector<char> ,我首先需要將其轉換為字符串(或者可能還有另一種方式?)

是的你必須像這樣對std::vector<char>進行std::string “轉換”:

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

通過一些工作,您可以避免使用緩沖區“轉換” 使用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 組裝指令更少

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM