首页 > 解决方案 > 是否可以直接保留并复制到 std::string 中?

问题描述

是否可以在 std::string 中保留空间并获取将 char 数据直接复制到其中的指针?我必须与通过将字符串复制到 char * 中返回字符串的 C 库进行交互。如何设置 std::string 以便库可以直接写入其中,避免中间副本。

假设示例:

std::string mystring;
int strlen = foolib_get_string_size(fooval);
mystring.size(strlen); // assuming size() with arg exists and does reserve() and set size
foolib_string_to_char_buffer(fooval, mystring.data(), strlen); // abusing data() method for writing

标签: c++stringperformancecopybuffer

解决方案


是否可以在 std::string 中保留空间并获取将 char 数据直接复制到其中的指针?

是的。使用它的resize()方法分配内存,然后使用它的data()方法(C++17 和更高版本)或它的operator[], 来访问该内存。

我必须与通过将字符串复制到 char * 中返回字符串的 C 库进行交互。如何设置 std::string 以便库可以直接写入其中,避免中间副本。

像这样:

std::string mystring;
int strlen = foolib_get_string_size(fooval);
if (strlen > 0)
{
    mystring.resize(strlen); // -1 if strlen includes space for a null terminator
    foolib_string_to_char_buffer(fooval, mystring.data()/*&mystring[0]*/, strlen);
}

或者,std::string也有可以分配内存的构造函数:

int strlen = foolib_get_string_size(fooval);
std::string mystring(strlen, '\0'); // -1 if strlen includes space for a null terminator
if (strlen > 0)
    foolib_string_to_char_buffer(fooval, mystring.data()/*&mystring[0]*/, strlen);

当然,这确实需要连续std::string分配 's 内存块,这仅在 C++11 及更高版本中得到保证(但实际上,几乎在所有已知的实现中都已完成)。如果您不使用 C++11 或更高版本,并且真的想符合标准,那么您应该使用中间缓冲区,例如 a ,例如:std::vector

std::string mystring;
int strlen = foolib_get_string_size(fooval);
if (strlen > 0)
{
    std::vector<char> myvector(strlen);
    foolib_string_to_char_buffer(fooval, &myvec[0], strlen);
    mystring.assign(&myvec[0], strlen); // -1 if strlen includes space for a null terminator
}

推荐阅读