我知道该函数不允许更改对象的状态,但我想我在某处读过允许编译器假设如果使用相同的参数调用函数,它将返回相同的值,因此可以重用缓存值(如果可用).例如
class object
{
int get_value(int n) const
{
...
}
...
object x;
int a = x.get_value(1);
...
int b = x.get_value(1);
Run Code Online (Sandbox Code Playgroud)
然后编译器可以优化第二个调用,并使用寄存器中的值或只是执行 b = a;
这是真的?
我注意到Clojure中的延迟序列似乎在内部表示为链表(或者至少它们被视为仅具有对元素的顺序访问的序列).即使在被缓存到内存中之后,lazy-seq上的访问时间nth也是O(n),而不是像向量那样的常量时间.
;; ...created my-lazy-seq here and used the first 50,000 items
(time (nth my-lazy-seq 10000))
"Elapsed time: 1.081325 msecs"
(time (nth my-lazy-seq 20000))
"Elapsed time: 2.554563 msecs"
Run Code Online (Sandbox Code Playgroud)
如何在Clojure中以增量方式获取常量查找或创建延迟向量?
想象一下,在生成惰性向量期间,每个元素都是之前所有元素的函数,因此遍历列表所花费的时间成为一个重要因素.
相关问题只发现了这个不完整的Java片段: 设计一个懒惰的向量:const的问题