Я понимаю, что это старый вопрос, но я думаю, что текущие ответы как-то вводят в заблуждение.
Вызов как at<T>(...)
, так и ptr<T>(...)
проверит границы в режиме отладки. Если макрос _DEBUG
не определен, они в основном вычислят y * width + x
и дадут вам либо указатель на данные, либо сами данные. Таким образом, использование at<T>(...)
в режиме деблокирования эквивалентно самостоятельному вычислению указателя, но безопаснее, поскольку вычисление указателя — это не просто y * width + x
, если матрица является просто подвидом другой матрицы. В режиме отладки вы получаете проверки безопасности.
Я думаю, что лучший способ - обрабатывать изображение построчно, получая указатель строки с помощью ptr<T>(y)
, а затем с помощью p[x]
. Преимущество этого заключается в том, что вам не нужно учитывать различные макеты данных и по-прежнему простой указатель для внутреннего цикла.
Вы можете постоянно использовать простые указатели, что было бы наиболее эффективно, поскольку вы избегаете одного умножения на строку, но тогда вам нужно использовать step1(i)
для продвижения указателя. Я думаю, что использование ptr<T>(y)
— хороший компромисс.
person
Lukáš Lalinský
schedule
12.12.2014