为什么标准库中没有按值传递 std::chrono::d uration 实例?

Why aren't std::chrono::duration instances passed by value in the Standard Library?

提问人:Super-intelligent Shade 提问时间:8/18/2017 最后编辑:Super-intelligent Shade 更新时间:8/18/2017 访问量:516

问:

根据 cppreference.com

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

但是,我注意到例如:

this_thread::sleep_for 由 const ref.sleep_duration

future::wait_for 同样由 const ref 采用。duration

等。

(1) 为什么它们不是按值传递的,有什么特别的原因吗?

(1a) 传递常量引用是否会使一些可能的优化变得悲观?constexpr

C++11 按引用传递 constexpr 按值传递

评论

0赞 R Sahu 8/18/2017
回复(1a):你是把它作为一个一般准则还是在和的上下文中问的?如果你在后者的背景下问,这对我来说根本没有意义。您不可能优化预期在特定持续时间内执行某些操作的函数。thread::sleep_forfuture::wait_for
0赞 Super-intelligent Shade 8/18/2017
@RSahu 让我想到的是,如果我调用编译器将不得不存储在某个地方,例如堆栈上,然后获取它的地址并将其传递给该地址,然后从地址中提取 10 并将其传递给底层睡眠函数。然而,按值传递将在寄存器中传递它,避免不必要的写入/读取。最后,无论如何,它可能会被编译器优化掉,所以我可能不应该担心。this_thread::sleep_for(10ms)10mssleep_for10ms
0赞 Super-intelligent Shade 8/18/2017
也许我应该把它作为一个单独的问题来问
0赞 R Sahu 8/18/2017
既然你已经解释了,你的问题是有道理的。尽管与您传递给上述功能的持续时间相比,您提到的所有操作所花费的时间在今天的硬件中很可能会消失。

答:

8赞 Howard Hinnant 8/18/2017 #1

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