【问题标题】:Boolean data type vs integer data types to represent truth values [closed]表示真值的布尔数据类型与整数数据类型[关闭]
【发布时间】:2017-01-30 13:41:26
【问题描述】:

对于真值和假值,使用 bool 数据类型而不是整数值作为 0 和 1 有什么优势,使用起来效率更高? 以及在 c 和 c++ 等不同语言中会有什么不同?

【问题讨论】:

  • 旧版本的 C 没有 bool 数据类型
  • 使用bool 传达意图,bool 值明确表示truefalse,而整数值可以呈现更多状态。例如,在维护代码时,这种模糊性可能会导致错误。性能差异可能是微不足道的,如果您需要处理这么多正在考虑优化的布尔值,您将选择将值存储在位集中,作为整数值数组中的单个位。
  • 这个问题没有意义,除非你问它 either for C++ or for C. 他们有非常不同的@实现987654326@ 和布尔表达式。请编辑标签并只选择一种语言。到目前为止,回答您问题的每个人要么没有看到多个标签,要么只是感到困惑。
  • @Lundin 扩展了这个问题

标签: c++ c boolean primitive


【解决方案1】:

在没有bool的时候在C中使用了int,没有优势1在C++或现代C中使用整数类型来表示布尔值:

  1. bool 有意义,int 没有意义:
bool try_something();
int try_something(); // What does this return?

在 C 中,函数返回 int 表示成功或失败是很常见的,但其中很多(大多数?)在成功时不返回 1,在失败时不返回 0,它们遵循 UNIX 标准是在成功的情况下返回0,在出错的情况下返回其他内容,所以你会得到这样的代码:

int close(int fd);

if (close(fd)) { /* Something bad happened... */ }

参见close 手册,该手册成功返回0,失败返回-1。对于新用户,此代码令人不安,您希望 close 在成功时返回正确的值,而不是相反。

  1. 如果您需要存储大量布尔值,您可能希望通过仅使用一位来表示该值(如果将其存储在 int 中,则使用 32 位)来优化存储,而在 C++ 中,@ 987654336@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&lt;bool&gt;(如果您可以替换@ 987654341@ by bool 在您的代码中没有问题,然后这样做)),但是如果您使用int 使用按位运算存储多个布尔值,这是另一个问题。

2 请注意,这只适用于std::vector&lt;bool&gt;,其他容器如std::array&lt;bool, N&gt; 未优化,因为它们不能使用代理对象来“表示”位值。

【讨论】:

  • bool 的存储效率低于相同大小的整数,因为它始终具有至少 7 位填充,这与可比较的整数不同。数组参数无关紧要,因为 vector 不使用 bool 类型来实现它,它使用整数。为什么?因为整数的存储效率更高。
  • 我同意这部分:bool 有意义,int 没有意义:.
  • @2501 "bool 的存储效率低于相同大小的整数,因为它始终具有至少 7 位填充,与可比较的整数不同。" - 你能详细说明一下吗?如果您使用uint8_t(假设sizeof(bool) == sizeof(uint8_t),并在其中存储01,您还将获得7 位填充。如果您要在单个uint8_t 上存储多个布尔值,那么我的论点about std::vector&lt;bool&gt; 是相关的,因为它正是发生的事情。
  • bool 向量没有使用 bool 类型来存储布尔值,所以这个说法是不正确的:bool 的存储效率更高,尤其是当你想要存储这些的大数组时(给定尺寸是可能的,不是强制性的):
  • @2501 是的,我知道,但它确实改变了使用std::vector&lt;bool&gt; 存储布尔值比std::vector&lt;int&gt; 存储效率更高的事实 - 我将更改句子以强调这样一个事实我的目标是优化容器,例如std::vector&lt;bool&gt;
【解决方案2】:

这主要是风格问题,因此很难证明一种方法是正确的。 C 允许使用语法if(x),如果 x 不为零,则执行条件。所以“真实”可能有点像一个陷阱,if(x == true) 并不总是意味着你的想法。另一方面,return true 在像is_valid() 这样的函数中比return 1 清晰得多。 bool 可以提高内存效率,但这可能是一种错觉,出于效率原因,它通常被填充到四个字节。

bool 的主要问题,虽然又是风格问题,但是

mywdgt = openwidget("canvaswidget", 256, 256, true);

显然意味着打开或创建一个小部件,它是一个画布,大小为 256 x 256 像素。但是最后一个参数是什么?

mywdgt = openwidget("canvaswidget", 256, 256, ALLOW_ALPHA);

更清晰。您知道参数是什么以及它的作用,在 一眼。所以在函数签名中应该避免bool 参数, 改用定义并说出标志的含义。

【讨论】:

    【解决方案3】:

    bool - 内置布尔类型。布尔值可以有 truefalse

    因此,如果您遇到boolean 类型有意义的场景,例如,flagreturn 值表示yes/nosuccess/failure,您会考虑使用bool

    但是如果你有多个这样的值,使用int(s) 会更合适。 bool 不合适,因为所涉及的值应限制为 true/false

    【讨论】:

      【解决方案4】:

      为了节省内存,强烈建议使用 BOOL,例如,如果我们只是检查条件(真或假)或类似的东西。

      Bool 只占用 1 字节(通常是最小的可寻址大小)内存,而整数可能占用 2 或 4 字节或更多,取决于编译器。

      因此非常建议使用 bool 而不是 integer 来仅存储 1 或 0。如果您可以在更少的内存中完成它,为什么还要浪费内存。

      并且 bool 可以保证只有 0 或 1 的值。因此它适用于条件语句。

      【讨论】:

      • sizeof(bool) 不需要为 1
      • @abhiarora 我写过一般人。
      • 内存消耗不是您应该在 C 或 C++ 中使用 bool 的原因。如果是这个原因,您将使用一个位字段,其中一位设置为 0 或 1,而不是浪费 8 位。不保证布尔值以位实现,因此内存消耗参数是无意义的。
      • 在大多数情况下,即使 bool 为 1B 也会添加填充或用于函数调用,该值将提升为 int。除非您正在创建一个 bool 数组,否则不会对内存产生重大影响。
      猜你喜欢
      • 2016-04-08
      • 2019-05-01
      • 2011-06-13
      • 1970-01-01
      • 2020-03-26
      • 2019-03-05
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多