1

为什么有人可能将缓存实现为

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 只能由一个地址中的一种颜色使用。一些颜色可以被删除,另一种颜色可以在同一个地址创建,因此在同一个地址会有一个具有不同 colorID 的颜色,我们可以使用它来确定它是相同的颜色还是在该地址重新创建另一种颜色。

因此,没有必要比较引用,它足以比较 colorIDs;它们是唯一的,并且在其唯一地址上准确识别一种颜色。

4

0 回答 0