布尔数据类型与整数数据类型来表示真值
Boolean data type vs integer data types to represent truth values
使用 bool 数据类型比使用整数值 0 和 1 表示真值和假值有什么优势,使用起来效率更高?
它在不同语言(如 c 和 c++)中有何不同?
为了节省内存,强烈建议使用 BOOL,例如,如果我们只是检查条件(true 或 false)或类似的东西。
布尔仅占用 1 个字节(通常是最小可寻址大小)内存,而整数可能占用 2 或 4 个字节或更多,具体取决于编译器。
因此,非常建议使用 bool 而不是 integer 来仅存储 1 或 0。如果可以在更少的内存中这样做,为什么要浪费内存。
并且bool可以保证只有0或1的值。所以它适合条件语句。
int
在没有bool
的情况下在C中使用,没有优势1在C++中使用整数类型表示布尔值或者在现代 C 中:
bool
是有意义的,int
不是:
bool try_something();
int try_something(); // What does this return?
在 C 语言中使用 returning int
来指示成功或失败是很常见的,但是很多(大多数?)这些并不 return 1
成功时 0
失败时,它们遵循 UNIX 标准,成功时为 return 0
,错误时为其他内容,因此您会得到如下代码:
int close(int fd);
if (close(fd)) { /* Something bad happened... */ }
参见 close 手册,其中 returns 0
成功,-1
失败。对于新用户,此代码令人不安,您希望 close
到 return 如果成功则为真,而不是相反。
- 如果您需要存储大量布尔值,您可能希望通过仅使用一位来表示该值来优化存储(如果将其存储在
int
中则需要 32 位),并且在 C++ 中,std::vector<bool>
2 已经专门用于执行此操作,因此:
std::vector<bool> bvec(8000); // Size ~ 1000 bytes (optimization of std::vector<bool>)
std::vector<int> ivec(8000); // Size ~ 32000 bytes (32-bits int)
1 如果以相同的方式使用它们(例如,通过 bool b = f();
与 int b = f();
或上面的 vector<bool>
(如果你可以用 bool
替换 int
而没有问题,那么就这样做),但是如果你使用 int
来存储多个布尔值使用按位运算,这是另一个问题。
2注意这里只适用于std::vector<bool>
,其他容器如std::array<bool, N>
没有优化,因为不能使用proxy反对 "represent" 位值。
bool - 内置布尔类型。布尔值可以有值 true
和 false
.
因此,如果您有一个 boolean
类型有意义的场景,例如 flag
或 return
值表示 yes/no
或 success/failure
, 你会考虑使用 bool
.
但是如果您有多个这样的值,则使用 int(s)
会更合适。 bool
不合适,因为涉及的值应限制为 true/false
.
这主要是风格问题,所以很难证明一种方法是正确的。 C 允许语法 if(x)
如果 x 非零则执行条件。所以 "true" 可能有点陷阱, if(x == true)
并不总是你想的那样。另一方面,在像 is_valid()
这样的函数中,return true
比 return 1
清晰得多。 bool
可以提高内存效率,但这可能是一种错觉,出于效率原因,它通常被填充到四个字节。
bool
的主要问题是
,虽然这又是风格问题
mywdgt = openwidget("canvaswidget", 256, 256, true);
显然意味着打开或创建一个小部件,它是一个 canvas,并且是 256 x 256 像素。但是最后一个参数是什么?
mywdgt = openwidget("canvaswidget", 256, 256, ALLOW_ALPHA);
清晰多了。你知道参数是什么以及它的作用,在
一眼。所以在函数签名中应该避免 bool
参数,
请改用定义并说出标志的含义。
使用 bool 数据类型比使用整数值 0 和 1 表示真值和假值有什么优势,使用起来效率更高? 它在不同语言(如 c 和 c++)中有何不同?
为了节省内存,强烈建议使用 BOOL,例如,如果我们只是检查条件(true 或 false)或类似的东西。
布尔仅占用 1 个字节(通常是最小可寻址大小)内存,而整数可能占用 2 或 4 个字节或更多,具体取决于编译器。
因此,非常建议使用 bool 而不是 integer 来仅存储 1 或 0。如果可以在更少的内存中这样做,为什么要浪费内存。
并且bool可以保证只有0或1的值。所以它适合条件语句。
int
在没有bool
的情况下在C中使用,没有优势1在C++中使用整数类型表示布尔值或者在现代 C 中:
bool
是有意义的,int
不是:
bool try_something();
int try_something(); // What does this return?
在 C 语言中使用 returning int
来指示成功或失败是很常见的,但是很多(大多数?)这些并不 return 1
成功时 0
失败时,它们遵循 UNIX 标准,成功时为 return 0
,错误时为其他内容,因此您会得到如下代码:
int close(int fd);
if (close(fd)) { /* Something bad happened... */ }
参见 close 手册,其中 returns 0
成功,-1
失败。对于新用户,此代码令人不安,您希望 close
到 return 如果成功则为真,而不是相反。
- 如果您需要存储大量布尔值,您可能希望通过仅使用一位来表示该值来优化存储(如果将其存储在
int
中则需要 32 位),并且在 C++ 中,std::vector<bool>
2 已经专门用于执行此操作,因此:
std::vector<bool> bvec(8000); // Size ~ 1000 bytes (optimization of std::vector<bool>)
std::vector<int> ivec(8000); // Size ~ 32000 bytes (32-bits int)
1 如果以相同的方式使用它们(例如,通过 bool b = f();
与 int b = f();
或上面的 vector<bool>
(如果你可以用 bool
替换 int
而没有问题,那么就这样做),但是如果你使用 int
来存储多个布尔值使用按位运算,这是另一个问题。
2注意这里只适用于std::vector<bool>
,其他容器如std::array<bool, N>
没有优化,因为不能使用proxy反对 "represent" 位值。
bool - 内置布尔类型。布尔值可以有值 true
和 false
.
因此,如果您有一个 boolean
类型有意义的场景,例如 flag
或 return
值表示 yes/no
或 success/failure
, 你会考虑使用 bool
.
但是如果您有多个这样的值,则使用 int(s)
会更合适。 bool
不合适,因为涉及的值应限制为 true/false
.
这主要是风格问题,所以很难证明一种方法是正确的。 C 允许语法 if(x)
如果 x 非零则执行条件。所以 "true" 可能有点陷阱, if(x == true)
并不总是你想的那样。另一方面,在像 is_valid()
这样的函数中,return true
比 return 1
清晰得多。 bool
可以提高内存效率,但这可能是一种错觉,出于效率原因,它通常被填充到四个字节。
bool
的主要问题是
mywdgt = openwidget("canvaswidget", 256, 256, true);
显然意味着打开或创建一个小部件,它是一个 canvas,并且是 256 x 256 像素。但是最后一个参数是什么?
mywdgt = openwidget("canvaswidget", 256, 256, ALLOW_ALPHA);
清晰多了。你知道参数是什么以及它的作用,在
一眼。所以在函数签名中应该避免 bool
参数,
请改用定义并说出标志的含义。