【问题标题】:How to declare a huge constant array如何声明一个巨大的常量数组
【发布时间】:2016-11-28 14:13:30
【问题描述】:

这是我的最终目标:

我希望能够以任何可能的颜色深度生成给定尺寸的所有可用图像。

从某种意义上说,这并不复杂,我主要需要对表示图像的数组/矩阵的每个像素进行迭代,然后再次对给定像素的每个可能值进行迭代。

在现实生活中...不可能全部查看,因为即使是单色图像也有太多的可能性,而对于存储来说,也是一样的,即使是小尺寸的图像也会产生令人印象深刻的效果文件量大,硬盘容易饱和。

所以我这样做主要是为了好玩,因为我很快就能访问一个集群并想在上面尝试这个旧项目。但旧项目使用 SFML,效率不高(另外,终端中的 SFML 也不是一个好主意)

现在的问题:

由于我在每次迭代中大量使用像素的每个不同值,我想将它设置为一个全局常量,该常量将包含一个的每个可能值。所以它就像一个 16M 的 unsigned char[3] 数组。这提供了类似 50MB 的 RAM 仅用于它,所以不是太大而无法管理,最重要的是,一组不必动态生成的常量值和一个不错的(我认为?)增益时间和效率,因为数据是不断使用的。

问题是这个数组很大,只是写它会占用很大的空间(~640MB),我想知道这个文件的大小是否有问题,当我在调用它的同时尝试编译应用程序时,我收到 out of memory allocating xxxx bytes 的错误,有没有更好的方法来设置这个数组?还是这个想法没有我想象的那么好,有更好的方法来做我想做的事?

在 lauch 时生成数组的内容是我的第二个想法,但它花费了这么多时间,这并不有趣,我更喜欢它花在真正的图像生成上。

【问题讨论】:

  • 也许你应该问问自己:“我真的需要这么大的数组,还是有更好的方法?”
  • 检查mmap。它允许将现有文件的内容映射到内存。您可以将值保存在 64MB 文件中,并在程序启动时将其映射到内存。
  • @JohnnyMopp 在应用程序的执行过程中,我多次获得这些值中的每一个,我不需要拥有它,并且可以在需要时从一个内部选择它们或更多循环或类似的东西,但为了提高效率,如果它已经在内存中,那对我来说甚至更好
  • 这听起来像是典型的XY Problem。
  • 似乎您的构建机器内存不足并崩溃了 gcc。尝试不同的编译器/计算机/操作系统?另外你不应该在标题中定义它,在标题中声明它并在其他地方的 .c 文件中定义它。

标签: c arrays constants


【解决方案1】:

您不需要这样的数组,尤其是当您似乎想在pixel_matrix[i] 中保留i 的最低有效三个字节时。

从您发布的片段中,pixel_matrix[i] 的值可以生成为:

pixel_matrix[i][0] = (i >> 16) & 0xFF;
pixel_matrix[i][1] = (i >> 8) & 0xFF;
pixel_matrix[i][2] = i & 0xFF;

上述公式使pixel_matrix 的存储变得无用。

【讨论】:

  • 在(一或三个)宏或内联函数中实现公式,您可以使用pixel_matrix(i, 1) 或pixel_GREEN(i)。
猜你喜欢
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多