1

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

由于位图是二维的(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];

我认为这种方法更有效。所以我的问题是,如果你要在内存中存储位图,你会使用什么样的缓冲区?将位图存储在内存中的最佳方法是什么(我认为可以随机访问一块内存)

[编辑] 我确实了解堆和堆栈是什么。您可能应该看到这个问题: How do I declare a 2d array in C++ using new?

4

3 回答 3

0

二维数组创建一个指向普通数组的指针数组。这将在内存管理和/或此类数组的流式传输中引起一些复杂性。我更喜欢第二种方式,创建一维数组,并使用一些宏或内联函数来访问元素。事实上,最好创建一个结构,它有成员来指定缓冲区的“宽度”和“高度”。

struct PIXEL_BIT_MAP {
PIXEL_BIT *buffer;
size_t height;
size_t width;
}
于 2013-09-30T08:26:55.300 回答
0

第一种方式 ( PIXEL_BIT buffer[1366][768];) 在堆栈上分配内存,这意味着在当前函数返回后,该内存块变得不可用。

您应该在堆上分配内存来存储位图,使用new运算符或malloc(). 这两种方式没有明显区别,都是分配“一块可以随机访问的内存”。

于 2013-09-30T08:27:42.100 回答
0

这是制作二维数组的两种简单方法。您可以将后者包装在一个不错的类中,因此您不必每次都提供索引计算。我认为第二个更快,因为所有数据都在内存附近。

vector<vector<T>> myvec(Y, vector<T>(X));
myvec[y][x] = ...;

vector<T> myvec(X * Y);
myvec(y * X + x) = ...;
于 2013-09-30T09:35:44.397 回答