Поскольку вы опустили остальную часть вашей программы, все это превращается в догадки. Эта функция часто отображается в результатах профилирования, вероятно, из-за того, что она вызывается из внутреннего цикла. Что делает эта функция (это довольно очевидно), так это то, что она возвращает ячейку памяти пикселя или, если запрошенный индекс находится за пределами массива пикселей, возвращает ячейку памяти фиктивного пикселя.
Если вы запускаете эту функцию внутри цикла, тогда проверка границ выполняется для каждой итерации, что, конечно, является излишним. Это действительно очень слабый фрукт в отношении оптимизации: поместите проверки границ перед циклом и убедитесь, что сам цикл не выходит за границы:
static inline
RGBPixel* bm_get_pixel_at_UNSAFE(
unsigned int x,
unsigned int y,
RGBPixel *pixel_array )
{
size_t const width_with_padding = info_h.width;
size_t const index = ((size_t)info_h.height-1 - y) * width_with_padding + x;
return &pixel_array[index];
}
RGBPixel* bm_get_pixel_at(
unsigned int x,
unsigned int y,
RGBPixel *pixel_array )
{
return ( x < info_h.width && y < info_h.height ) ?
bm_get_pixel_at_UNSAFE(x,y, pixel_array)
: &blackPixel;
}
void foo(RGBPixel *pixel_array)
{
/* iteration stays inside array bounds */
for( unsigned int y = 0; y < info_h.height; ++y )
for( unsigned int x = 0; x < info_h.width; ++x ){
RGBPixel *px = bm_get_pixel_at_UNSAFE(x, y, pixel_array);
/* ... */
}
}