将Buffer或C-String复制到std :: string的最快方法

时间:2014-10-03 09:17:42

标签: linux gcc c++11 stdstring

假设我有char buffer[64]uint32_t lengthbuffer可能会或可能不会被终止。如果它以null结尾,则缓冲区的其余部分将填充空值。 length变量保存缓冲区的长度。

我想将它复制到std::string,而不会在字符串对象的末尾添加额外的空值。

最初,我试过了:

std::string s(buffer, length);

当缓冲区在末尾填充空值时复制额外的空值。

我能想到:

char buffer2[128];
strncpy(buffer2, buffer, 128);
const std::sring s(buffer2);

但它有点浪费,因为它会复制两次。

我想知道是否有更快的方法。我知道我需要进行基准测试才能确切地知道哪种方式更快......但我想看看其他一些解决方案然后进行基准测试...

提前致谢。

2 个答案:

答案 0 :(得分:2)

  1. 如果可以,我只需在缓冲区的末尾添加'\0'即可 然后使用string构造函数的c-string版本。

  2. 如果你不能,你需要确定你的'\0'是否有'\0' 缓冲区,当你在它的时候,你也可以计算它的数量 在(buffer,length)之前遇到的字符。然后你可以使用它 使用string构造函数的#include <string.h> //... std::string s(buffer, strnlen(buffer, length)); 形式计算:

    buffer
  3. 如果你不能做1.并且不想迭代char last_char = buffer[length-1]; buffer[length-1] = '\0'; std::string s(buffer); //the c-string form since we're sure there's a '\0' in the buffer now if(last_char!='\0' && s.length()==(length-1)) { //With good buffer sizes, this might not need to cause reallocation of the strings internal buffer s.push_back(last_char); } 两次(一次确定长度,一次在字符串构造函数中),你可以这样做:

    strlen

    我将基准测试留给您。无论如何,构造函数的c-string版本可能在内部使用类似c-string的内容来避免重新分配,因此使用string构造函数的{{1}}版本可能无法获得太多好处。

答案 1 :(得分:0)

您可以使用所有规范方式来执行此操作。

更快的方法肯定是由您自己实施 smartpointer (或使用已经完成的任何事情std::shared_ptr )。

每个smartpointer(sp)指向数组的第一个char并包含。

每次执行array.copy时,你都不会做一个真正的副本,但你只需要添加一个引用来做那个数组。

所以,#34;副本&#34;取O(1)而不是O(N)