C++ 将0-1整数r值转换为布尔值

C++ 将0-1整数r值转换为布尔值,c++,performance,C++,Performance,我有一个表达式,它返回0或1个整数作为临时值。该值可能已经在寄存器中,我想从内联函数以bool的形式返回它 有没有一种普通的方法可以做到这一点?我相信(bool)和static\u cast注入了额外的测试和设置指令。这对我来说太多了,而这个案例是关于内存管理器的性能关键部分。只需返回它。任何值,不同于 0 是真< /代码>和 0 < /COD>是C++中的代码> false < /Cord>。p> 只需从内联函数(返回bool)返回int。假设整数表达式是foo,然后使用!!foo获取bool

我有一个表达式,它返回0或1个整数作为临时值。该值可能已经在寄存器中,我想从内联函数以bool的形式返回它

有没有一种普通的方法可以做到这一点?我相信
(bool)
static\u cast
注入了额外的测试和设置指令。这对我来说太多了,而这个案例是关于内存管理器的性能关键部分。

只需返回它。任何值,不同于<代码> 0 <代码>是<代码>真< /代码>和<代码> 0 < /COD>是C++中的代码> false < /Cord>。p>
只需从内联函数(返回
bool
)返回
int

假设整数表达式是
foo
,然后使用
!!foo
获取
bool
值。

如何

return rtVal;

只要返回整数,如果它不为0</p>< P>,则从C++ 2012标准(ISO/IEC N33 37):

4.12布尔转换

算术、非范围枚举、指针或指向成员类型的指针的prvalue可以转换为 bool类型的pr值。零值、空指针值或空成员指针值转换为false; 任何其他值都将转换为true。std::nullptr_t类型的prvalue可以转换为的prvalue 类型布尔;结果值为false


那就把它还给我

当我在cppcheck中遇到这样的性能警告时,我通常会使用最优雅的方法(至少在我看来;):

返回您的整数!=0;


这与假设相符,即所有与0不同的值都被认为是真的。

您对返回值做了什么?如果你正在使用它 在这种情况下,编译器可能会立即生成 无论类型是否为
bool
或者不是。将与
0
进行简单比较。如果你是 将其分配给
bool
变量,编译器通常会 生成一条额外的指令,以确保二进制值 是
0
1
(而不是其他值)。但这是什么呢 表达式,以便您可以确保它是0或 1.如果它类似于
x&1
,那么一个好的编译器将 认识到这一点,并将优化额外的指令

编辑:

我可以补充一点,我假设使用内联和优化。 如果性能是一个问题,那么这是前两个步骤

你应该选择。

或者干脆选择
foo
(如果这足够了——这在很多情况下都是正确的)。@Nawaz确信在大多数情况下都可以。以防万一OP确实需要一个类型为
bool
的值。这涉及到额外的CPU指令,我将其标记为“我不想要”。@Number47然后直接返回它们(如果适合您)。这是一个可怕的建议。他应该在写
foo!=0
。当然,很大程度上取决于他对结果值所做的操作,但是从来没有出现过
!!foo
绝不是混淆。但它涉及转换,因此它将注入额外的指令。当正确的布尔值(0或1)已在寄存器中时。@Number47但您希望是谁,如何在不转换的情况下转换值?我知道该值是正确的布尔值,希望强制编译器将其视为布尔值而不进行隐式转换。我想要类似于重新解释cast(我的int表达式)
的东西。但这实际上是被禁止的。所以将其内部声明为bool?@Number47如果你不能这样做,你就不能强迫编译器将其视为真正的bool,因为它不会一直在运行时bool,所以必须有一个转换的步骤。--所以:如果你可以一直使用ti jsut作为bool,那么也可以将它声明为bool类型,如果你不能,因为你对它进行算术运算,编译器需要将它作为整数类型进行数学处理。所以这两种情况都相当简单。一方面只是让返回型boool。或者你必须接受转换。应该是这样,但至少在没有内联的情况下,它将涉及隐式转换和附加指令,我不想这样。你真的检查过转换是否添加了附加指令吗?编译器可能会对此进行优化。那么内存管理器到底在做什么,您需要担心将
int
转换为
bool
的性能?我问这个问题是因为我想知道你怎么能如此廉价地管理内存,以至于这是你的瓶颈(你已经分析了它,不是吗?)@Grizzly,它确实执行起来很便宜,因为它与预分配块一起工作。-只有在块(取消)分配和数据删除(如果数据对象很大)时,它才会减慢速度。@Number47:那么这些隐式强制转换对您的实际伤害有多大?因为如果这足够重要的话,我会假设您希望确保代码以任何方式内联,因为函数调用的成本会影响到。@Number47唯一不依赖于编译器的功能的是汇编程序。你在C++中写的任何东西都是编译器的摆布。总是当然,编译器的作者并不是有意要给你带来糟糕的性能。假设函数返回
int
,这至少是可读性最好的。没有优化和内联,与返回
int
相比,它需要一到两条额外的指令。但是,当然,如果性能是个问题,他将使用优化和内联,因此他可能会正确地执行。希望没有人会像这样“优化”函数/方法^^^^关于编辑:我不确定,使用-O3是否安全,因为我已经在代码中使用了汇编程序。这对急切的优化不是一种威胁吗?@Number47这取决于编译器,但一般来说,内联汇编程序不应该是一个问题:g++有一种注释汇编程序的方法,因此编译器几乎知道它需要知道的关于它的一切,而其他编译器通常会假设最坏的情况(或docum)