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

标签 c++ std stdvector

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

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

然后,我不是在 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/

相关文章:

c++ - 为具有一些指针和许多数据成员的类设计复制构造函数的任何好的技术

c++ - 将 C++ 字符串转换为 NSString

c++ - C++ 的最小 XML 库?

c++ - std::generate - 如何使用随机数生成器?

c++ - 数组赋值仅适用于 C++ 中的中间变量

c++ - 迭代 C++ 容器时是否可以定义 'step' 大小?

c++ - 由于私有(private)继承而无法访问迭代器

C++11 std::function 和 std::reference 包装器用于排序 std::set

c++ - 转换 vector 地址以复制数据

c++ - 当我尝试定义这个 vector< pair< int , pair<int, int>>> vp(n)