假设我有一个C类,我希望能够隐式地转换为bool以在if
语句中使用。
class C {
public:
...
operator bool() { return data ? true : false; }
private:
void * data;
};
和
C c;
...
if (c) ...
但是强制转换操作符的条件是技术上的开销(即使相对无关紧要)。如果data
是公开的,我可以if (c.data)
代替,这完全有可能并且不涉及任何条件。我怀疑编译器会在后一个场景中进行涉及条件的任何隐式转换,因为如果为零,它可能会产生一个"跳转。或者"如果不是零则跳#34;它并不真正需要任何布尔值,而CPU很可能无论如何都没有这个概念。
我的问题是类型转换运算符重载的效率是否确实低于直接使用data
成员的效率。
请注意,我确实确定如果类型转换直接返回data
,它也可以使用,可能使用在{{{}的情况下使用的相同类型的隐式(假设而不是实际发生)转换。 1}}。
编辑:只是为了澄清,事情的重点实际上有点假设。困境是布尔本身就是一个假设的结构(它最初并不存在于C / C ++中),实际上它只是整数。正如我所提到的,类型转换可以直接返回if (c.data)
或使用data
代替,但它实际上不是非常易读,但即使这不是问题。我不知道如何用它来更好地理解它,C类有一个!=
是一个整数,CPU有条件跳转使用整数,问题是遵守位于中间的假设布尔构造要求额外的条件。 Dunno,如果那样"澄清"尽管让事情变得更加清晰......
答案 0 :(得分:3)
我的问题是类型转换运算符重载的效率是否确实低于直接使用数据成员的效率。
只检查您的编译器输出 - 使用您想要使用的特定优化标志 - 可以肯定地告诉您,然后它可能会在一些看似无关的更改之后发生变化,例如在调用上下文中的某处添加额外变量,或者可能使用下一个编译器发布等....
更一般地说,如果优化者没有完全处理这种情况,那么C ++就不会因速度而闻名,所以你的几率非常好。
此外,编写工作代码然后对其进行概要分析,您将更多地了解性能问题的实际意义。
答案 1 :(得分:3)
这取决于编译器优化器的智能程度。我认为他们应该足够智能去除无用的? true: false
操作,因为应该内联类型转换操作。
或者你可以写这个而不用担心:
operator bool() { return data; }
由于void*
到bool
内置了隐式类型转换,data
在函数出路时会得到类型转换。
我不记得if
中的条件是否需要bool
或void*
;有一次,在C ++添加bool
之前,它是后者。 (operator!
类中的iostream
当时返回void*
。)
答案 2 :(得分:1)
在现代编译器上,这两个函数产生相同的机器代码:
bool toBool1(void* ptr) {
return ptr ? true : false;
}
bool toBool2(void* ptr) {
return ptr;
}
所以它确实无关紧要。