Я пишу некоторый код для смешивания битмапов, и у моей функции есть много вариантов для этого. Я решил использовать switch
для обработки этих параметров, но тогда мне нужно было либо поставить switch
внутри цикла (я читал, что это влияет на производительность), либо назначить цикл для каждого случая switch
(делает код слишком большим). Я решил сделать это, используя третий способ (смотри ниже):Установка указателя из его диапазона памяти
/* When I need to use static value */
BYTE *pointerToValue = (BYTE*)&blendData.primaryValue;
BYTE **pointerToReference = &pointerToValue;
*pointerToReference = *pointerToReference - 3;
/* When I need srcLine's 4th value (where srcLine is a pointer to BYTE array) */
BYTE **pointerToReference = &srcLine;
while (destY2 < destY1) {
destLine = destPixelArray + (destBytesPerLine * destY2++) + (destX1 * destInc);
srcLine = srcPixelArray + (srcBytesPerLine * srcY2++) + (srcX1 * srcInc);
for (LONG x = destX1; x < destX2; x++, destLine += destInc, srcLine += srcInc) {
BYTE neededValue = *(*pointerToReference + 3); //not yet implemented
destLine[0] = srcLine[0];
destLine[1] = srcLine[1];
destLine[2] = srcLine[2];
if (diffInc == BOTH_ARE_32_BIT)
destLine[3] = srcLine[3];
}
}
Иногда может понадобиться использовать srcLine[3]
или blendData.primaryValue
. srcLine[3]
можно легко получить с помощью *(*pointerToReference + 3)
, однако для доступа к blendData.primaryValue
Мне нужно уменьшить указатель на 3, чтобы сохранить одно и то же выражение (*(*pointerToReference + 3)
).
Так вот мои вопросы:
- Безопасно установить указатель из своего диапазона памяти, если позже он собирается вернуть?
- Я на 100% уверен, что он не будет использоваться, когда он выходит за пределы допустимого диапазона, но может Я уверен, что это не вызовет какого-либо нарушения прав доступа?
- Может быть, есть какой-то подобной альтернативы использовать одну переменную , чтобы захватить значение
srcLine[3]
илиblendData.primaryValue
безif()
, как это делается в моем примере кода?
До тех пор, пока вы не разыгрываете указатель, все должно быть в порядке. – drescherjm
Вы уверены, что выполнение 'switch' внутри цикла * * плохое? Я чувствую, что это может быть преждевременная оптимизация (http://programmers.stackexchange.com/a/80092). –
@ drescherjm: Станьте кем-то, кто-то напишет * неопределенное поведение * всего через 2 секунды (пользователи SO любят UB). –