为内存中位图声明缓冲区
Declare a buffer for an in-memory Bitmap
我正在设计一个图形库,它仅适用于存储在内存中的位图。
由于位图是二维的(x 和 y 或列和行),所以我可以使用二维数组。
//PIXEL_BIT is a user defined type to store RGB values of a single pixel
PIXEL_BIT buffer[1366][768];
根据我的理解,C++ 不适用于二维数组。特别是在动态二维阵列方面。所以我相信,二维数组用作缓冲区(或内存位图)并不那么酷。
声明缓冲区的另一种方法是:
PIXEL_BIT *buffer = new PIXEL_BIT[1366 * 768];
我认为这种方法更有效。所以我的问题是,如果要在内存中存储位图,您将使用哪种缓冲区?在内存中存储位图的最佳方法是什么(我认为可以随机访问的内存块)?
[编辑]我确实了解堆和堆栈是什么。你可能应该看到这个问题:如何使用 new 在 C++ 中声明 2D 数组?
二维
数组创建一个指向纯数组的指针数组。这将导致内存管理和/或此类阵列的流式传输出现一些复杂性。我更喜欢第二种方式,创建一维数组,并使用一些宏或内联函数来访问元素。事实上,最好创建一个结构,该结构具有指定缓冲区"宽度"和"高度"的成员。
struct PIXEL_BIT_MAP {
PIXEL_BIT *buffer;
size_t height;
size_t width;
}
以下是制作 2D 数组的两种简单方法。您可以将后者包装在一个不错的类中,因此您不必每次都提供索引计算。我认为第二个更快,因为所有数据都在内存中附近。
vector<vector<T>> myvec(Y, vector<T>(X));
myvec[y][x] = ...;
vector<T> myvec(X * Y);
myvec(y * X + x) = ...;
第一种方法(PIXEL_BIT buffer[1366][768];
)在堆栈上分配内存,这意味着在当前函数返回后,该内存块变得不可用。
您应该使用new
运算符或malloc()
在堆上分配内存来存储位图。这两种方法之间没有明显的区别,并且都分配了"可以随机访问的内存块"。
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++字符*缓冲区的大小
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- 错误:使用未声明的标识符"缓冲区"C++
- 如何在C#struct中声明和使用固定尺寸的char缓冲区
- 为内存中位图声明缓冲区
- 缓冲区和变量Element未声明(首次在函数中使用)
- ISR中使用的循环缓冲区(声明为volatile)会出错.为什么?如何解决此问题
- 如何声明适当的缓冲区大小
- 谷歌协议缓冲区.c++错误:' google '没有被声明
- 在c++中声明一个缓冲区数组