我有一个应用程序正在对某些图像执行一些处理。
鉴于我知道宽度/高度/格式等(我知道),并且只想定义一个缓冲区来存储像素数据:
然后,我没有在 an 上使用new
and并单独记录缓冲区大小,而是考虑使用.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
通过调用and , 我在性能方面做对了resize
吗?- 底层内存是否总是连续的,所以我可以
memcpy_s
如图所示使用?
非常欢迎任何额外的评论、批评或建议。