我有一个应用程序正在对一些图像进行一些处理。
鉴于我知道宽度/高度/格式等(我知道),并且正在考虑定义一个缓冲区来存储像素数据:
然后,我不是在 unsigned char*
上使用 new
和 delete []
并单独记录缓冲区大小,而是我正在考虑使用 std::vector
来简化事情。
所以我会像这样声明我的类(class):
#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. ...
};
然后,当我收到一张新图片(大小可变 - 但不必担心这里的这些细节)时,我可以调整 vector 的大小(如有必要)并复制像素:
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
andresize
在性能方面做得对吗? - 总是会不会是底层内存是连续的,所以我可以使用
memcpy_s
如图所示?
非常欢迎任何其他评论、批评或建议。
最佳答案
- 当然,这会很好。如果您的类依赖于特定的对齐方式,您需要担心的一件事是确保缓冲区正确对齐;在这种情况下,您可能希望使用数据类型本身的 vector (如
float
)。 - 不,这里不需要预留; resize 将根据需要自动增加容量,方式完全相同。
- 在 C++03 之前,技术上不是(但实际上是)。从 C++03 开始,是的。
不过,memcpy_s
并不是这里的惯用方法。请改用 std::copy
。请记住,指针是迭代器。
从 C++17 开始,std::byte
是不透明类型存储的惯用单元,例如您在此处使用的。当然,char
仍然可以工作,但允许使用 byte
不允许的不安全用法(如 char
!)。
关于c++ - 使用 std::vector 作为简单缓冲区是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19542545/