为内存中位图声明缓冲区

Declare a buffer for an in-memory Bitmap

本文关键字:声明 缓冲区 位图 内存      更新时间:2023-10-16

我正在设计一个图形库,它仅适用于存储在内存中的位图

由于位图是二维的(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()在堆上分配内存来存储位图。这两种方法之间没有明显的区别,并且都分配了"可以随机访问的内存块"。