【问题标题】:Why aren't std::chrono::duration instances passed by value in the Standard Library?为什么标准库中的 std::chrono::duration 实例不按值传递?
【发布时间】:2018-01-26 04:02:01
【问题描述】:

根据cppreference.com

持续时间中存储的唯一数据是 Rep 类型的滴答计数。

但是,我注意到例如:

this_thread::sleep_for 通过 const ref 获取 sleep_duration

future::wait_for 同样通过 const ref 获取 duration

等等

(1) 有什么特殊原因说明它们不是按值传递的吗?

(1a) 通过 const 引用传递是否会影响一些可能的 constexpr 优化?

【问题讨论】:

  • Re (1a):您是作为一般准则还是在thread::sleep_forfuture::wait_for 的上下文中询问?如果您在后者的上下文中询问,那对我来说根本没有意义。您无法优化预期会在一定时间内执行某项操作的函数。
  • @RSahu 让我想到的是,如果我调用this_thread::sleep_for(10ms),编译器将不得不将10ms 存储在某个地方,例如在堆栈上,然后将其地址传递给sleep_for然后将从地址中提取 10 并将其传递给底层的睡眠函数。而按值传递10ms 会将其传递到寄存器中,从而避免不必要的写入/读取。最后它可能会被编译器优化掉,所以我可能不应该担心。
  • 也许我应该把它作为一个单独的问题来问
  • 既然你已经解释过了,你的问题就说得通了。尽管与您传递给上述函数的持续时间相比,您提到的所有操作所花费的时间在今天的硬件中很可能会减少。

标签: c++11 pass-by-reference constexpr pass-by-value


【解决方案1】:

这是一个判断电话。与函数将要执行的操作(睡眠)的成本相比,“内置”持续时间的常见情况的成本很小。而且我不想考虑包含自定义 Rep 的自定义持续时间的按值传递成本,复制成本可能很高(例如 BigNum)。

【讨论】:

  • 啊,那是你的错……谢谢霍华德。 ;) 好点,关于 BigFoot...我的意思是 BigNum
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2016-07-20
  • 2020-08-03
  • 1970-01-01
相关资源
最近更新 更多