使用'color'来定义对象的标志状态?

时间:2009-08-05 01:07:44

标签: c bit-manipulation status

我问的是这个问题,因为这不是我第一次看到这种编码习惯,但从未看到任何关于其原因的评论:我正在浏览Lua的来源并看到他们使用'颜色'(白色) ,黑色)来描述一个物体的状态。这是头文件lgc.h中的代码:

/*
** Layout for bit use in `marked' field:
** bit 0 - object is white (type 0)
** bit 1 - object is white (type 1)
** bit 2 - object is black
** bit 3 - for userdata: has been finalized
** bit 3 - for tables: has weak keys
** bit 4 - for tables: has weak values
** bit 5 - object is fixed (should not be collected)
** bit 6 - object is "super" fixed (only the main thread)
*/

#define WHITE0BIT   0
#define WHITE1BIT   1
#define BLACKBIT    2
#define FINALIZEDBIT    3
#define KEYWEAKBIT  3
#define VALUEWEAKBIT    4
#define FIXEDBIT    5
#define SFIXEDBIT   6
#define WHITEBITS   bit2mask(WHITE0BIT, WHITE1BIT)

#define iswhite(x)      test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT)
#define isblack(x)      testbit((x)->gch.marked, BLACKBIT)
#define isgray(x)   (!isblack(x) && !iswhite(x))

#define otherwhite(g)   (g->currentwhite ^ WHITEBITS)
#define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS)

#define changewhite(x)  ((x)->gch.marked ^= WHITEBITS)
#define gray2black(x)   l_setbit((x)->gch.marked, BLACKBIT)

#define valiswhite(x)   (iscollectable(x) && iswhite(gcvalue(x)))

我已经在其他项目中看到了类似的东西(甚至使用了'红色'),但从未理解(也没有理解)颜色和对象状态之间的概念联系。有任何类型的约定规定'white'应该表示'good'和'black','bad'或类似的东西?谁知道这种做法的起源是什么?

3 个答案:

答案 0 :(得分:1)

它可能起源于white-gray-black深度优先搜索吗?在此版本的算法中,未访问白色顶点,在树下的路上访问了灰色顶点,并且在返回的路上灰色顶点变为黑色。

我从评论中假设这与垃圾收集有关?

答案 1 :(得分:1)

当您看到在此类上下文中使用的颜色时,通常是由于基本算法的实现本身是根据颜色定义的。梅雷迪思提到了这方面的一个例子;另一个是Red-Black Trees

答案 2 :(得分:1)

我没有在我面前的Lua源代码,但位定义名称似乎是 与garbage collection相关。请参阅维基百科中的部分 进入三色标记。