C 在LRU平方算法中,最近使用的最少行是否总是零?
我的Hacker's Delight副本在家里,我找到的网络资源对此细节并不清楚 我使用著名的“行-列-平方”算法编写了以下8级LRU。(有更好的名字吗?)C 在LRU平方算法中,最近使用的最少行是否总是零?,c,algorithm,lru,C,Algorithm,Lru,我的Hacker's Delight副本在家里,我找到的网络资源对此细节并不清楚 我使用著名的“行-列-平方”算法编写了以下8级LRU。(有更好的名字吗?) #包括 typedef联合{ uint8_t行[8]; uint64_t cols; }卢卢州; 无效lru_init(lru_状态*此){ 这->cols=0; } 无效lru_up(lru_状态*此,在0..7*/中使用的int/*){ 此->行[已使用]=0xff; 这->cols&=~(0x0101010101010101您的假设
#包括
typedef联合{
uint8_t行[8];
uint64_t cols;
}卢卢州;
无效lru_init(lru_状态*此){
这->cols=0;
}
无效lru_up(lru_状态*此,在0..7*/中使用的int/*){
此->行[已使用]=0xff;
这->cols&=~(0x0101010101010101您的假设是正确的
我们可以用矛盾来证明:
假设LRU候选(具有最多零位的字节)是c,并且在位置x处设置了一个位
这意味着在c行之后没有使用x行,因此x必须具有c所具有的所有零位,再加上x位置的零位。这是一个矛盾,因为c是零位最多的字节,所以我们得出结论,c不能设置任何位。您的假设是正确的
我们可以用矛盾来证明:
假设LRU候选(具有最多零位的字节)是c,并且在位置x处设置了一个位
这意味着在c行之后没有使用x行,因此x必须具有c所具有的所有零位,加上x位置的零位。这是一个矛盾,因为c是零位最多的字节,所以我们得出结论c不能设置任何位。注意:您的for循环在lru_get()
从不测试行[0]
。这是你的意图还是你希望采用的方法?我只是让它成为一个漏洞。将它向上移动到循环中(没有漏洞)取决于这个问题的答案。我2分钱的专业知识:同意你的断言。可移植性问题:有些机器是大的或小的endian,这会影响功能。一个好的编译器会很好地处理uint64_t FF=0xff;cols |=FF@chux,你会如何处理lru_get()中的测试?我认为我的版本还可以;只要行[I]=0xff与行[I]在同一字节上运行,我就不关心内存安排。你同意吗?if(0==(cols&(FF)注意:你的for循环在lru_get()
从不测试行[0]
。这是你的意图还是你希望采用的方法?我只是让它成为一个漏洞。将它向上移动到循环中(没有漏洞)取决于这个问题的答案。我2分钱的专业知识:同意你的断言。可移植性问题:有些机器是大的或小的endian,这会影响功能。一个好的编译器会很好地处理uint64_t FF=0xff;cols |=FF@chux,你会如何处理lru_get()中的测试?我认为我的版本还可以;只要行[I]=0xff与行[I]在同一字节上运行,我就不关心内存安排。你同意吗?if(0==(cols&(FF))
#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;
}