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();
    }
    ...
}

単に colorID を比較する代わりに?

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 はアドレスの 1 つの色だけで使用できます。一部の色が削除され、同じアドレスで別の色が作成される可能性があるため、同じアドレスに別の colorID を持つ色が存在し、それを使用して、同じ色であるか、そのアドレスで再作成された別の色であるかを判断できます。

したがって、参照を比較する必要はなく、colorIDs を比較するだけで十分です。それらは一意であり、一意のアドレスで正確に 1 つの色を識別します。

4

0 に答える 0