Câu trả lời của user143506 là đúng nhưng đối với một vấn đề hiệu suất có thể xảy ra, tôi đã so sánh các khả năng trong asm:
return x;
, return x != 0;
, return !!x;
Và thậm chí return boolean_cast<bool>(x)
kết quả trong bộ này hoàn hảo của hướng dẫn asm:
test edi/ecx, edi/ecx
setne al
ret
Điều này đã được thử nghiệm cho GCC 7.1 và MSVC 19 2017. (Chỉ boolean_converter trong MSVC 19 2017 dẫn đến lượng mã asm lớn hơn nhưng điều này là do quá trình tạo khuôn mẫu và cấu trúc gây ra và có thể bị bỏ qua bởi quan điểm hiệu suất, vì cùng các dòng như đã lưu ý ở trên có thể chỉ bị trùng lặp cho các chức năng khác nhau với cùng thời gian chạy.)
Điều này có nghĩa là: Không có sự khác biệt về hiệu suất.
PS: Boolean_cast này đã được sử dụng:
#define BOOL int
template< class TargetT, class SourceT >
struct boolean_converter;
template< >
struct boolean_converter<bool, BOOL>
{
static bool convert(BOOL b)
{
return b ? true : false;
}
};
template< class TargetT, class SourceT >
TargetT boolean_cast(SourceT b)
{
typedef boolean_converter<TargetT, SourceT> converter_t;
return converter_t::convert(b);
}
bool is_non_zero(int x) {
return boolean_cast< bool >(x);
}