gpt4 book ai didi

c++ - 使用 std::vector 作为简单缓冲区是一种好习惯吗?

转载 作者:IT老高 更新时间:2023-10-28 14:00:38 32 4
gpt4 key购买 nike

我有一个应用程序正在对一些图像进行一些处理。

鉴于我知道宽度/高度/格式等(我知道),并且正在考虑定义一个缓冲区来存储像素数据:

然后,我不是在 unsigned char* 上使用 newdelete [] 并单独记录缓冲区大小,而是我正在考虑使用 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. ...
}

这对我来说似乎很好,我喜欢我不必担心内存管理这一事实,但它提出了一些问题:

  1. 这是 std::vector 的有效应用还是有更合适的容器?
  2. 我通过调用 reserve and resize 在性能方面做得对吗?
  3. 总是会不会是底层内存是连续的,所以我可以使用 memcpy_s 如图所示?

非常欢迎任何其他评论、批评或建议。

最佳答案

  1. 当然,这会很好。如果您的类依赖于特定的对齐方式,您需要担心的一件事是确保缓冲区正确对齐;在这种情况下,您可能希望使用数据类型本身的 vector (如 float)。
  2. 不,这里不需要预留; resize 将根据需要自动增加容量,方式完全相同。
  3. 在 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com