1

说,我有一个如下所示的功能

void caller()
{
    int flag = _getFlagFromConfig();
    //this is a flag, which according to the implementation
    //is supposed to have only two values, 0 and 1 (as of now)

    callee_1(flag);
    callee_2(1 == flag);
}

void callee_1(int flag)
{
    if (1 == flag)
    {
        //do operation X
    }
}

void callee_2(bool flag)
{
    if (flag)
    {
        //do operation X
    }
}

哪个被调用函数将是更好的实现?

我已经浏览了这个链接,我非常相信在 if 条件下使用 bool 进行比较不会对性能产生太大影响。但就我而言,我将标志作为整数。在这种情况下,是否值得为第二个被调用者?

4

4 回答 4

8

它在性能方面没有任何区别,但是在可读性方面,如果只有 2 个值,那么 abool更有意义。特别是如果您将标志命名为isFlagSet.

于 2012-04-26T07:42:11.613 回答
2

在效率方面,它们应该是相同的。

但是请注意,它们不会做同样的事情 - 您可以传递除1第一个函数之外的其他内容,即使参数本身不是 false,条件也会评估为 false。额外的比较可能会导致一些开销,可能不会。

因此,让我们假设以下情况:

void callee_1(int flag)
{
    if (flag)
    {
        //do operation X
    }
}

void callee_2(bool flag)
{
    if (flag)
    {
        //do operation X
    }
}

在这种情况下,从技术上讲,第一个变体会更快,因为bool值不会直接检查trueor false,而是提升为字大小的类型,然后检查0. 尽管生成的程序集可能相同,但处理器理论上在该bool选项上做了更多的工作。

于 2012-04-26T07:46:09.317 回答
1

如果值或参数被用作布尔值,请声明它bool。它对性能产生任何影响的可能性几乎为 0,并且bool向读者和编译器都记录了您的意图。

此外,如果您有一个intwhich 被用作标志(由于现有接口):使用隐式转换(如果接口将其记录为布尔值),或者将其与0(而不是与 1)进行比较。int这与如何用作布尔值的旧定义一致(在 C++ 之前bool)。

于 2012-04-26T07:45:50.293 回答
0

bool 和 int 之间的差异导致不同(优化的)asm 的一种情况是否定运算符(“!”)。

对于“!b”,如果 b 是布尔值,编译器可以假设整数值是 1 或 0,因此否定可以是简单的“b XOR 1”。OTOH,如果 b 是整数,则编译器(除非进行数据流分析)必须假定变量可能包含任何整数值,因此要实现否定,它必须生成如下代码

(b != 0) ? 0: 1

话虽如此,我敢肯定,否定是性能关键操作的代码非常罕见。

于 2012-04-26T07:56:23.497 回答