【发布时间】:2019-10-19 00:35:06
【问题描述】:
考虑这段代码sn-p:
bool foo(const std::string& s) {
return s == "hello"; // comparing against a const char* literal
}
bool bar(const std::string& s) {
return s == "hello"s; // comparing against a std::string literal
}
在first sight,与const char* 进行比较似乎需要更少的汇编指令1,因为使用字符串文字将导致std::string 的就地构造。
(编辑:正如答案中指出的那样,我忘记了s.compare(const char*) 将在foo() 中被调用的事实,所以在这种情况下当然不会发生就地构造. 因此删除下面的一些行。)
不过,看着operator==(const char*, const std::string&) reference:
所有比较都是通过
compare()成员函数完成的。
根据我的理解,这意味着我们无论如何都需要构造一个std::string 来执行比较,所以我怀疑开销最终会是相同的(尽管通过调用operator== 隐藏了) .
- 我应该更喜欢哪个比较?
- 一个版本是否比另一个版本有优势(可能在特定情况下)?
1我知道,更少的汇编指令并不一定意味着更快的代码,但我不想在这里进行微基准测试。
【问题讨论】:
-
return s == "hello";. -
最好使用
-O2/3进行比较,我的意思是谁在乎它在调试版本中有多少条指令? ;) -
@Someprogrammerdude 不,不是。这是不编写不必要的浪费代码的情况。字符串文字和不必要的字符串实例化之间的选择不是微优化。这是常识!换句话说,这是关于编写好的代码。
-
目前世界上有太多臃肿和缓慢的代码,因为人们认为编写不需要做更多事情的好代码是“过早的优化”并且被吓跑了考虑到他们正在编写的代码结果:(
-
@Someprogrammerdude 这与过早优化没有任何关系,我一开始是出于好奇而问的,这也会在一定程度上影响编码风格.在一般情况下,您不会告诉人们通过
const A与const A&,只是因为他们不应该关心“过早优化”
标签: c++ c++14 c++17 string-comparison string-literals