我正在开发一个需要将原始图像数据写入内存缓冲区的程序。目前我的实现如下:
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
已经出来了。应该可以使用std::vector<unsigned char>
重新定义屏幕,如下所示:
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());
答案 0 :(得分:1)
std :: vector基本上是一个C风格的数组,它只管理块的分配。如果初始化向量的大小,则它会分配一次大小,然后您可以只访问内部数组缓冲区并直接弄乱数据(如果需要),或者可以使用重载的括号运算符。最后,我不相信你这样做会失去任何明显的表现。这取决于你看起来不错的东西。
关于你的第二个问题,为了避免并发症,你可能最好坚持第一次迭代。但是,如果你的Pixel结构只是三个无符号字符,那么它的内存方式与3 uchar的数组格式相同,所以没有什么区别,你仍然可以通过char迭代整个内存块char并放入它回到图像中,反之亦然。