【问题标题】:C++ passing const bool by reference [duplicate]C++ 通过引用传递 const bool [重复]
【发布时间】:2018-05-26 06:05:30
【问题描述】:

是否值得通过引用传递 bool ?

void foo(const bool& iflag);

void foo(const bool iflag);

我听说 bool 引用比 bool 声明花费更多时间,但我无法检查它。

【问题讨论】:

  • 这是一个值得担心的问题的可能性有多大?
  • 这是generated assembly for GCC 的示例。一个显然是成本更低的访问。
  • “我无法检查。” 为什么不呢?你尝试了什么?你不能写测试或者简单地检查生成的代码吗?
  • 仅当 foo 打算设置 iflag 但您应该删除 const 时。在第二个版本中使用 const 是多余的,因为它无论如何都是按值传递的。我个人更喜欢从函数返回值,但如果函数返回多个值,传递引用可能会派上用场。
  • 抱歉,如果你无法衡量差异,那么这个问题就毫无意义,因为只有你能看到差异,答案才有意义

标签: c++ function boolean pass-by-reference


【解决方案1】:

我总是按值传递它,除非我想在调用站点阻止隐式转换,在这种情况下,const 引用可能是一个明智的选择。

至于性能原因,如果您有任何疑问,请检查生成的程序集。本能向我暗示了在引用的情况下潜在的开销,尽管编译器可能会优化出混乱。

有趣的是,尽管 C++ 标准没有规定 bool 的大小;它可能在一个故意敌对的编译器中绝对是巨大的。此外,该标准没有提供检查引用大小的机制:sizeof(T&) 始终为 sizeof(T)

【讨论】:

  • ..同时 C++ 标准并没有规定参考的大小,对吧?
  • @tobi303: 更糟糕的是,标准让你无法检查,因为对 T 的引用的 sizeof 是 sizeof(T)。
  • 引用甚至不需要占用空间(依赖于实现),所以 sizeof(ref) 有点抽象。
  • “该标准没有提供检查引用大小的机制” 但是您可以通过将其作为唯一成员来查看用于表示引用的实现定义的大小结构并检查sizeof。当然,这将是一个指针,在实践中。当然,在 as-if 下,它可能会被完全优化掉 - 但任何其他结构也可能如此,所以我认为在这方面作为参考并不特别。
  • 我猜他们不可能做到(sizeof(ref) 为零),因为 new T 实际上调用了 new (sizeof(T)),所以我们最终根本没有对象。
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
相关资源
最近更新 更多