У меня есть приложение, которое выполняет некоторую обработку на некоторых изображениях.
Учитывая, что я знаю ширину/высоту/формат и т.д. (я знаю) и думаю только об определении буфера для хранения данных пикселей:
Затем вместо использования new
и delete []
на unsigned char*
и сохраняя отдельное примечание о размере буфера, я думаю об упрощении вещей, используя std::vector
.
Итак, я бы объявил свой класс примерно так:
#include <vector>
class MyClass
{
// ... etc. ...
public:
virtual void OnImageReceived(unsigned char *pPixels,
unsigned int uPixelCount);
private:
std::vector<unsigned char> m_pImageBuffer; // buffer for 8-bit pixels
// ... etc. ...
};
Затем, когда я получил новое изображение (определенного размера переменной, но не беспокоиться об этих деталях здесь), я могу просто изменить размер вектора (при необходимости) и скопировать пиксели:
void MyClass::OnImageReceived(unsigned char *pPixels, unsigned int uPixelCount)
{
// called when a new image is available
if (m_pImageBuffer.size() != uPixelCount)
{
// resize image buffer
m_pImageBuffer.reserve(uPixelCount);
m_pImageBuffer.resize(uPixelCount, 0);
}
// copy frame to local buffer
memcpy_s(&m_pImageBuffer[0], m_pImageBuffer.size(), pPixels, uPixelCount);
// ... process image etc. ...
}
Мне это кажется прекрасным, и мне нравится тот факт, что мне не нужно беспокоиться об управлении памятью, но возникает ряд вопросов:
- Это допустимое приложение
std::vector
или есть более подходящий контейнер? - Я делаю правильную работу по производительности, вызывая
reserve
иresize
? - Всегда ли будет так, что базовая память последовательна, поэтому я могу использовать
memcpy_s
, как показано?
Любые дополнительные комментарии, критика или советы были бы очень желанными.