用于图像表示的c++容器性能
C++ container performance for image representation
我正在编写一个需要将原始图像数据写入内存缓冲区的程序。目前我的实现是这样的:
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的数组相同,所以没有什么区别,你仍然可以一个字符一个字符地遍历整个内存块并将其放回图像中,反之亦然。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- 不同的类或结构初始化方法之间的性能差异是什么?