誰かがキャッシュを次のように実装する理由
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 つの色を識別します。