为什么有人可能会将缓存实现为
void DoSomethingWith(CGColorRef color)
{
static CGColorRef cachedColor = NULL;
static int cachedColorID = 0;
if (color == cachedColor && color->colorID == cachedColorID)
{
UseCachedColorTransformations();
}
else
{
cachedColor = color;
cachedColorID = color->colorID;
CalculateColorTransformations();
CacheColorTransformations();
}
...
}
而不仅仅是比较colorIDs?
void DoSomethingWith(CGColorRef color)
{
static CGColorRef cachedColor = NULL;
static int cachedColorID = 0;
if (color->colorID == cachedColorID)
{
UseCachedColorTransformations();
}
else
{
cachedColor = color;
cachedColorID = color->colorID;
CalculateColorTransformations();
CacheColorTransformations();
}
...
}
请注意,color-> colorID值是一个增量值,它从1开始并安全地分配线程(从全局计数器InterlockedIncrement)到创建时的颜色。
当删除某些颜色并且未在内存中移动或复制颜色时,不会减少全局计数器。因此,每种颜色都具有唯一的colorID值,colorID只能在地址处使用一种颜色。可以删除某些颜色,并且可以在同一地址创建另一种颜色,因此在同一地址将有一种颜色具有不同的颜色ID,我们可以使用它来确定它是相同的颜色还是在该地址重新创建的颜色。
因此,没有必要比较参考文献,足以比较colorIDs ;它们是独一无二的,并且只根据它唯一的地址识别出一种颜色。