【问题标题】:Declare a buffer for an in-memory Bitmap为内存中的位图声明一个缓冲区
【发布时间】:2013-10-06 00:50:23
【问题描述】:

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

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

【问题讨论】:

  • C++ 在哪些方面不能很好地处理数组?我会尝试两者:测量运行时间并比较
  • @jev 我的意思是二维数组不适合这种情况,我说一维数组比二维数组更有效。由于计算机内存是线性的,而二维数组只是一种抽象,因此使用二维数组不会比使用一维数组更有效。

标签: c++ c arrays data-structures buffer


【解决方案1】:

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

struct PIXEL_BIT_MAP {
PIXEL_BIT *buffer;
size_t height;
size_t width;
}

【讨论】:

  • 是的,二维数组是指向数组的指针数组。这正是我的想法。
  • @wirm “二维数组创建一个指向普通数组的指针数组。”。不一定正确,PIXEL_BIT buffer[1366][768]; 创建 数组数组。不涉及指针。
  • @user694733 首先,数组是一个指针,除非它是静态分配的,这不是我们的情况。如果我们创建二维动态数组,那么它将是PIXEL_BIT **array;
  • @wirm OP 发布的两个代码行都没有任何指针数组。只有指针在他的第二行PIXEL_BIT *bufferArray is not a pointer..
【解决方案2】:

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

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

vector<T> myvec(X * Y);
myvec(y * X + x) = ...;

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • @DavidSebastian 您可能不想在该答案中使用动态二维数组。最好将整个位图存储在一块连续的内存中,而不是逐行存储。您不会失去任何性能或功能。
    猜你喜欢
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2016-08-01
    相关资源
    最近更新 更多