【发布时间】:2020-01-22 14:32:00
【问题描述】:
我想到了 C 中的 _Bool/ bool (stdbool.h) 和 C++ 中的 bool 的类型。
我们使用布尔类型来声明对象,这些对象只能保存 0 或 1 的值。 例如:
_Bool bin = 1;
或
bool bin = 1;
(注意:bool是_Bool在stdbool.h头文件中的宏。)
在 C 中,
或
bool bin = 1;
在 C++ 中。
但是_Bool 和bool 的布尔类型真的有效吗?
我做了一个测试,以确定每个对象在内存中的大小:
对于 C:
#include <stdio.h>
#include <stdbool.h> // for "bool" macro.
int main()
{
_Bool bin1 = 1;
bool bin2 = 1; // just for the sake of completeness; bool is a macro for _Bool.
printf("the size of bin1 in bytes is: %lu \n",(sizeof(bin1)));
printf("the size of bin2 in bytes is: %lu \n",(sizeof(bin2)));
return 0;
}
输出:
the size of bin1 in bytes is: 1
the size of bin2 in bytes is: 1
对于 C++:
#include <iostream>
int main()
{
bool bin = 1;
std::cout << "the size of bin in bytes is: " << sizeof(bin);
return 0;
}
输出:
the size of bin in bytes is: 1
因此,布尔类型的对象确实存储在内存中的 1 字节(8 位)内,而不仅仅是一个 1 位,因为它通常只需要。
这里讨论的原因是:Why is a char and a bool the same size in c++?。这不是我的问题。
我的问题是:
为什么我们在 C 中使用
_Bool/bool(stdbool.h) 和在 C++ 中使用bool类型,如果它们不在内存中提供好处存储,因为它是专门假装使用这些类型的?为什么我不能只使用
int8_t或char的类型(假设char在具体实现中包含8位(通常是这种情况))?
是否只是为了给代码读者提供一个明显的印象,即各个对象仅用于0或1/true或false目的?
非常感谢您的参与。
【问题讨论】:
-
嗯,根据个人经验,我曾经提出过一个测试用例,其中
bool的正确使用实际上比使用int的对应物减少了代码大小。很遗憾记不起细节了。 -
是否只是为了给代码读者提供一个明显的印象,即各个对象仅用于 0 或 1/true 或 false 目的? 那是一个主要好处。
-
我确实使用
bool来使用true和false而不是0和1。如果你认为1和0很好,你就不需要bool -
不要忘记,由于
bool是uint8_t的不同类型,某些模板的行为可能会有所不同。 (是的,我看着你std::vector<bool>) -
@MartinMorterol 不要太难看。当你这样做时它往往会咬人;)