代码比较:哪种代码在效率方面更好用?

问题描述 投票:-2回答:2

哪个代码更好用:初始化字符串?

bool flag = /*function call...*/
string str = "abc";
if(flag)
  str = "bcd";

要么

string str;
if(flag)
  str = "bcd";
else
  str = "abc";

要么

string str("abc");
if(flag) 
  str = "bcd";

提前致谢。

c++ string copy-constructor assignment-operator
2个回答
2
投票

C ++方式是使用初始化:

bool flag = foo();
string str { flag ? "bcd" : "abc" };

flag确定在调用std::string::string(const char*)时使用的字符串文字。但是有一个调用,一个正在构造的字符串对象,并且没有赋值。

[edit]翻转字符串文字。在C ++中,对于if构造和?:构造,“真实”案例首先出现,然后是“假”案件。但问题是他们倒转了,“abc”首先出现在flag==false案件中。


9
投票

这是一个你不应该做的微优化。 C ++程序不是人类可读格式的汇编描述。它是对程序应具有的行为的高级描述。编译器的工作是发出展示我们指定的行为的程序集。

您没有指定如何使用结果字符串,但如果我做了一些假设并将您的代码转换为小函数...

#include <string>

std::string foo1(bool flag) {
    std::string str = "abc";
    if(flag)
        str = "bcd";
    return str;
}

std::string foo2(bool flag) {
    std::string  str;
    if(flag)
        str = "bcd";
    else
        str = "abc";
    return str;
}

std::string foo3(bool flag) {
    std::string str("abc");
    if(flag) 
        str = "bcd";
    return str;
}

.. Clang 8.0将为这三种情况(尤其是foo1foo3)生成几乎相同的组件1。你可以在Godbolt上看到它。

这并不奇怪,因为您的三个片段所指示的可观察行为是相同的,并且不受您选择的片段的影响。所以不要纠缠于微观优化。详细描述更大规模的最佳行为。


1 - 嗯,foo2中有一个明显的分支,但是在运行时执行的代码仍然总是一个可能的分配和字符串内容的副本。这里的分支错误预测可能会有一些成本,但除非它处于一个非常紧密的循环中,否则我认为不值得考虑。此外,在这样的循环中使用std::string本身可能被认为是有问题的。

© www.soinside.com 2019 - 2024. All rights reserved.