2015-06-26 3 views
0

Я пишу некоторый код для смешивания битмапов, и у моей функции есть много вариантов для этого. Я решил использовать 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)).

Так вот мои вопросы:

  1. Безопасно установить указатель из своего диапазона памяти, если позже он собирается вернуть?
  2. Я на 100% уверен, что он не будет использоваться, когда он выходит за пределы допустимого диапазона, но может Я уверен, что это не вызовет какого-либо нарушения прав доступа?
  3. Может быть, есть какой-то подобной альтернативы использовать одну переменную , чтобы захватить значение srcLine[3] или blendData.primaryValue без if(), как это делается в моем примере кода?
+1

До тех пор, пока вы не разыгрываете указатель, все должно быть в порядке. – drescherjm

+0

Вы уверены, что выполнение 'switch' внутри цикла * * плохое? Я чувствую, что это может быть преждевременная оптимизация (http://programmers.stackexchange.com/a/80092). –

+1

@ drescherjm: Станьте кем-то, кто-то напишет * неопределенное поведение * всего через 2 секунды (пользователи SO любят UB). –

ответ

2

Из-за # 2, нет использования, ответ на # 1 да, это совершенно безопасно. Из-за № 1, нет необходимости в # 3. :-)

Нарушение прав доступа может произойти только в том случае, если указатель был фактически использован.