linux - 将缓冲区或 C 字符串复制到 std::string 的最快方法

标签 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);

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

不知道有没有更快的方法。我知道我需要进行基准测试才能准确判断哪种方式更快……但我想看看其他一些解决方案,然后再进行基准测试……

提前致谢。

最佳答案

  1. 如果可以的话,我会在缓冲区的末尾添加一个 '\0' 并且 然后使用 string 构造函数的 c 字符串版本。

  2. 如果你不能,你需要确定你的代码中是否有'\0' 缓冲区,当你在它的时候,你不妨数一数 '\0' 之前遇到的字符。然后你可以使用它 使用 string 构造函数的 (buffer,length) 形式计数:

    #include <string.h>
    //...   
    std::string s(buffer, strnlen(buffer, length));
    
  3. 如果您不能执行 1. 并且不想遍历 buffer 两次(一次确定长度,一次在字符串构造函数中),您可以这样做:

    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); 
    }
    

    我把基准测试留给你了。构造函数的 c-string 版本有可能在内部使用类似 strlen 的东西来避免重新分配,因此使用 c-string 版本可能没有太多好处string 构造函数。

关于linux - 将缓冲区或 C 字符串复制到 std::string 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26176357/

相关文章:

linux - 如何在没有父目录的情况下压缩目录

linux - 从文件添加 iptable 规则

java - java代码设置日期和时间的问题

c++ - makefile中的 `OBJECTS = $(SOURCES:.cpp=.o)`是什么意思

c++ - 将无符号字节数组转换为结构数组

c++ - mex 编译时出现 GCC 版本警告

c++ - Switch case 语句如何实现或在内部工作?

c - GCC - 如何停止链接 malloc?

c++ - decltype 在 gcc 4.3.2 中不能正常工作?

c++ - 带有静态变量的静态内联函数