加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 高效的const char *连接和输出到std :: string

发布时间:2020-12-16 07:07:01 所属栏目:百科 来源:网络整理
导读:参见英文答案 Most optimized way of concatenation in strings????????????????????????????????????6个 首先考虑将存储在输出字符串中的总数据量几乎肯定会很小,因此我怀疑这些数据对性能有明显的影响.我的主要目标是找到一种方法来连接一系列未知大小的co
参见英文答案 > Most optimized way of concatenation in strings????????????????????????????????????6个
首先考虑将存储在输出字符串中的总数据量几乎肯定会很小,因此我怀疑这些数据对性能有明显的影响.我的主要目标是找到一种方法来连接一系列未知大小的const char *,它们看起来并不可怕,同时还要考虑到效率.以下是我的搜索结果:

方法1:

std::string str = std::string(array1) + array2 + array3;

方法2:

std::string str(array1);
str += array2;
str += array3;

我决定使用第一种方法,因为它简洁明了.如果我没有弄错的话,两种方法都会调用同一系列的操作.未经优化的编译器将首先创建一个临时字符串,并在内部为其缓冲区> = sizeof(array1)分配一些空间.如果该缓冲区足够大,则附加操作不需要任何新分配.最后,如果支持移动语义,则交换临时和命名str的缓冲区.

有没有其他方法可以执行这样一个看起来不错但不会产生可怕开销的操作?

解决方法

请记住,在数组的情况下,sizeof(array)返回它的参数的实际大小(也就是长度),如果它已被声明为显式大小的数组(并且你写了’未知大小的const char *系列) “).因此,假设您想要创建通用解决方案,则应该考虑使用strlen().

我认为你不能避免所有额外的操作.在许多连接的情况下,最好的解决方案是分配缓冲区,该缓冲区足够大以存储所有连接的字符串.

我们可以很容易地推断出,在这种情况下,append()的最佳版本是:

string& append (const char* s,size_t n);

为什么?因为引用说:’如果s没有指向一个足够长的数组(…),它会导致未定义的行为’.所以我们可以假设,内部没有进行额外的检查(特别是额外的strlen()调用).哪个好,因为你完全确定,传递给append()的值是正确的,你可以避免不必要的开销.

现在,实际的连接可以像这样完成:

len_1 = strlen(array_1);
len_2 = strlen(array_2);
len_3 = strlen(array_3);

//Preallocate enough space for all arrays. Only one reallocation takes place.
target_string.reserve(len_1 + len_2 + len_3);

target_string.append(array_1,len_1);
target_string.append(array_2,len_2);
target_string.append(array_3,len_3);

我不知道你认为这个解决方案“看起来不错”,但它绝对清晰,并针对这个用例进行了优化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读