用于图像表示的c++容器性能

C++ container performance for image representation

本文关键字:性能 c++ 图像 表示 用于      更新时间:2023-10-16

我正在编写一个需要将原始图像数据写入内存缓冲区的程序。目前我的实现是这样的:

std::unique_ptr<unsigned char[]> _Screen;
...
_Screen.reset(new unsigned char[width * height * 3]);
std::fill(_Screen.get(), _Screen.get() + (width * height), 0);
...
_Screen[(j * _ScreenWidth + i) * 3] = red;
_Screen[(j * _ScreenWidth + i) * 3 + 1] = green;
_Screen[(j * _ScreenWidth + i) * 3 + 2] = blue;
如果可能的话,我真的想在这里使用一些STL容器。直到运行时我才知道屏幕的大小,所以std::array是out的。应该可以使用std::vector<unsigned char>重新定义screen,如下所示:
std::vector<unsigned char> _Screen
...
_Screen.resize(width * height * 3);

但我想知道元素访问是否会比使用c风格数组慢?(我假设重新分配会比较慢,但这对于这个应用程序来说是可以的)。

我也想知道这样做是否更有意义:

struct Pixel
{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};
...
std::vector<Pixel> _Screen;
...
_Screen.resize(width * height);
...
_Screen[(j * _ScreenWidth + i)].red = red;
_Screen[(j * _ScreenWidth + i)].green = green;
_Screen[(j * _ScreenWidth + i)].blue = blue;    

但是我最终需要转换为单个unsigned char数组,所以虽然这在我的计算过程中更好地代表了数据,但我不确定这有多难。使用struct方法是否会更慢,稍后使用以下内容转换为unsigned char是否安全:

unsigned char *screen = reinterpret_cast<unsigned char *>(_Screen.data());

std::vector基本上已经是一个C风格的数组,它只是管理块的分配。如果你初始化vector的大小,那么它只分配一次大小,然后你可以访问内部数组缓冲区,如果你愿意,直接对数据进行处理,或者你可以使用重载括号操作符。最后,我不相信这样做会让你失去任何明显的性能。这取决于你觉得什么好。

至于你的第二个问题,你可能最好坚持第一次迭代,以避免复杂化。然而,如果你的Pixel结构体只是三个无符号字符,内存方面,它的格式与3个uchar的数组相同,所以没有什么区别,你仍然可以一个字符一个字符地遍历整个内存块并将其放回图像中,反之亦然。