返回空字符串:c++中的有效方法
Returning an empty string : efficient way in c++
我有两种方法可以从函数返回空字符串。
1)
std::string get_string()
{
return "";
}
2)
std::string get_string()
{
return std::string();
}
哪一个更有效,为什么?
Gcc 7.1-O3这些都是相同的,godbolt.org/z/a-hc1d–4月25日下午3:27
原答覆:
做了一些挖掘。以下是一个示例程序和相关程序集:
代码:
#include <string>
std::string get_string1(){ return ""; }
std::string get_string2(){ return std::string(); }
std::string get_string3(){ return {}; } //thanks Kerrek SB
int main()
{
get_string1();
get_string2();
get_string3();
}
装配:
__Z11get_string1v:
LFB737:
.cfi_startproc
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_offset 3, -8
subl $40, %esp
.cfi_def_cfa_offset 48
movl 48(%esp), %ebx
leal 31(%esp), %eax
movl %eax, 8(%esp)
movl $LC0, 4(%esp)
movl %ebx, (%esp)
call __ZNSsC1EPKcRKSaIcE
addl $40, %esp
.cfi_def_cfa_offset 8
movl %ebx, %eax
popl %ebx
.cfi_restore 3
.cfi_def_cfa_offset 4
ret $4
.cfi_endproc
__Z11get_string2v:
LFB738:
.cfi_startproc
movl 4(%esp), %eax
movl $__ZNSs4_Rep20_S_empty_rep_storageE+12, (%eax)
ret $4
.cfi_endproc
__Z11get_string3v:
LFB739:
.cfi_startproc
movl 4(%esp), %eax
movl $__ZNSs4_Rep20_S_empty_rep_storageE+12, (%eax)
ret $4
.cfi_endproc
这是用-std=c++11 -O2
编译的。
您可以看到,对于return "";
语句有相当多的工作,而对于return std::string
和return {};
(这两者是相同的)则相对较少。
正如Frerich Raabe所说,当传递一个空的C_string
时,它仍然需要对其进行处理,而不仅仅是分配内存。这似乎无法优化(至少GCC无法优化)
所以答案是肯定使用:
return std::string();
或
return {}; //(c++11)
尽管除非在性能关键代码(我想是日志记录?)中返回大量空字符串,否则差异仍然微不足道。
后一个版本永远不会比前一个慢。第一个版本调用采用C字符串的std::string
构造函数,然后它必须首先计算字符串的长度。尽管对于空字符串这样做很快,但肯定不会比根本不这样做快。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法