C++ 的 NRVO std::string
NRVO for C++ std::string
我试图找到一些关于 std::string 命名 Return 价值优化 (NVRO) 的信息。
我什至不确定这是否适用,但我想知道从可读性和性能 POV 来看哪个更好。
std::string first(const bool condition)
{
std::string info = "This";
info += condition
? " is"
: " irrelevant"; //.append()
info += " info.";
return info; // nrvo here?
}
std::string second(const bool condition)
{
const auto firstPart = "First part";
const auto anotherPart = condition
? " second part"
: " irrelevant "; //.append()
return std::string{}.append(firstPart).append(anotherPart);
}
std::string third(const bool condition)
{
//would avoid due to poor readability if strings are long
return std::string{}
.append("First part")
.append(condition ? " second" : "irrelevant");
}
int main()
{
// printf("Hello World");
const auto irrelevant {true};
std::cout<<first(irrelevant)<<std::endl;
std::cout<<second(irrelevant)<<std::endl;
std::cout<<third(irrelevant)<<std::endl;
return 0;
}
如评论所述:
会在"frist"进行nvro吗?
有没有更好的(cleaner/performance)解决这个问题的方法?
我的目的是创建一个辅助函数,它将根据给定的参数连接正确的字符串
在 C++11 和 14 中,copy elision 在这种情况下是允许的。从 C++17 开始,return 值优化是强制性的(并且不再被视为 copy elision)。
不是我通过查看三个候选函数可以看出@ godbolt 但我没有做太多汇编程序。不过,这可能看起来更干净一些:
std::string fourth(const bool condition) {
return std::string{"First part "} += (condition ? "second" : "irrelevant");
}
@Ted_Lyngmo回答了您的第一个问题
如果您真的关心性能(并且测量证明此功能是您的热点)std::string
在这种情况下有点太重了。它不允许所有编译时优化,例如 constexpr
我建议使用std::string_view
#include <string_view>
constexpr std::string_view print(const bool condition) {
if (condition){
return "This is relevant info";
} else {
return "This is irrelevant info";
}
}
int main() {
std::string_view info = print(false);
return info.size();
}
此 program 将完全优化为
main:
mov eax, 23
ret
如果您使用 print(true)
它将更改为
main:
mov eax, 21
ret
所以,如果你以后要用这句话,最好还是让编译器优化一下。
注意:如果您有 C++17 编译器,则只能使用 string_view。
我试图找到一些关于 std::string 命名 Return 价值优化 (NVRO) 的信息。 我什至不确定这是否适用,但我想知道从可读性和性能 POV 来看哪个更好。
std::string first(const bool condition)
{
std::string info = "This";
info += condition
? " is"
: " irrelevant"; //.append()
info += " info.";
return info; // nrvo here?
}
std::string second(const bool condition)
{
const auto firstPart = "First part";
const auto anotherPart = condition
? " second part"
: " irrelevant "; //.append()
return std::string{}.append(firstPart).append(anotherPart);
}
std::string third(const bool condition)
{
//would avoid due to poor readability if strings are long
return std::string{}
.append("First part")
.append(condition ? " second" : "irrelevant");
}
int main()
{
// printf("Hello World");
const auto irrelevant {true};
std::cout<<first(irrelevant)<<std::endl;
std::cout<<second(irrelevant)<<std::endl;
std::cout<<third(irrelevant)<<std::endl;
return 0;
}
如评论所述:
会在"frist"进行nvro吗?
有没有更好的(cleaner/performance)解决这个问题的方法?
我的目的是创建一个辅助函数,它将根据给定的参数连接正确的字符串
在 C++11 和 14 中,copy elision 在这种情况下是允许的。从 C++17 开始,return 值优化是强制性的(并且不再被视为 copy elision)。
不是我通过查看三个候选函数可以看出@ godbolt 但我没有做太多汇编程序。不过,这可能看起来更干净一些:
std::string fourth(const bool condition) {
return std::string{"First part "} += (condition ? "second" : "irrelevant");
}
@Ted_Lyngmo回答了您的第一个问题
如果您真的关心性能(并且测量证明此功能是您的热点)std::string
在这种情况下有点太重了。它不允许所有编译时优化,例如 constexpr
我建议使用std::string_view
#include <string_view>
constexpr std::string_view print(const bool condition) {
if (condition){
return "This is relevant info";
} else {
return "This is irrelevant info";
}
}
int main() {
std::string_view info = print(false);
return info.size();
}
此 program 将完全优化为
main:
mov eax, 23
ret
如果您使用 print(true)
它将更改为
main:
mov eax, 21
ret
所以,如果你以后要用这句话,最好还是让编译器优化一下。
注意:如果您有 C++17 编译器,则只能使用 string_view。