【发布时间】:2013-11-21 20:58:36
【问题描述】:
我的 Hacker's Delight 副本在家里,我找到的网络资源并不清楚这个细节。
我使用著名的“行列平方”算法编写了以下 8 级 LRU。 (有更好的名字吗?)。
#include <stdint.h>
typedef union {
uint8_t rows[8];
uint64_t cols;
} lru_state;
void lru_init(lru_state *this) {
this->cols=0;
}
void lru_up(lru_state *this, int used /* in 0..7 */) {
this->rows[used]=0xff;
this->cols &= ~(0x0101010101010101 << used);
}
int lru_get(lru_state *this) {
int i;
for (i=1; i<8 ; i++) {
if (0==(this->rows[i])) return i;
}
return 0;
}
我想确认我的假设,即最近最少使用的行将全为零。它似乎有效,但我没有数学来证明它令我满意。
那么,这是对的吗?还是我需要计算每一行的最小汉明权重?
【问题讨论】:
-
注意:
lru_get()中的 for 循环从不测试rows[0]。这是您的意图还是您希望采用的方式? -
我只是让它成为失败者。将其向上移动到循环中(没有失败)取决于这个问题的答案。
-
我的 2 美分专业知识:同意你的说法。可移植性问题:有些机器是大端或小端,这会影响功能。一个好的编译器可以很好地处理
uint64_t FF = 0xff; cols |= FF << (used*8);与rows[used]=0xff;并消除对联合的需要。 -
@chux,你将如何处理 lru_get() 中的测试?我认为我的版本还可以;只要 rows[i]=0xff 在与 0==rows[i] 相同的字节上运行,我并不真正关心内存排列。你同意吗?
-
if (0==(cols & (FF << (i*8)) )) return i;或者设置一个掩码并移动它而不是增加i。顺便说一句:如果从未调用过lru_up(),您的断言是否会失败/起作用-您在乎吗?身份证。我没有看到初始条件,但如果我知道更多,我可以假设一些事情。