我有一个C++应用程序,可在运行时生成原始位图图像,并将其插入临时std::vector并在每次写入时动态分配内存,然后将其用于在程序存在之前将这些图像写入文件。当前位图大小为1280x720 。帧650 +-3帧后出现“分配错误”错误。我很清楚这是因为RAM内存不足。这是因为如果我缩小尺寸(假设为300x200),可以存储所有950帧,这很奇怪,因为我的机器有16gb的RAM。此外,在任务管理器中,我看到RAM显示屏仍然有很多可用(深绿色)空间(最多只能使用5gb)。我只能在Windows 7 64位16gb RAM Intel I7 CPU上运行,我正在VS2012中调试程序,是否有可能OS将动态分配限制为任意大小?我解除了限制吗?

数据类型是字节(无符号字符)。是的,正如下面答案中提到的那样,我编译为32位。

最佳答案

1280 x 720 x 3(字节/像素)= 2764800字节/图像= 2.64 MB/图像(我在这里假设有24个bpp图像)

2.64 MB/图像x 650张图像= 1713.87 MB,确实接近可怕的2 GB边界。这让我知道您正在64位操作系统上运行,但是您的应用程序被编译为32位应用程序,没有/LARGEADDRESSAWARE链接器标志,因此它只有2 GB的虚拟地址空间可用1。

为了轻松利用计算机上可用的物理RAM,您可以将程序编译为64位应用程序(因此,渲染与虚拟地址空间限制基本无关)。其他方法要复杂得多(通常它们需要自己管理内存的“滑动窗口”)。

另一个选择是使用/LARGEADDRESSAWARE链接器标志编译应用程序,但是实际上,您将在使用/3GB内核选项启动的32位系统或64位系统上分别获得更多的内存(分别增加1 GB和2 GB);同样,鉴于可以设置地址的高位,那么您在使用指针时必须要小心(减法和比较可能很棘手)。

  • 实际上,32位指针可以寻址完整的4 GB虚拟地址空间,但是默认情况下,上半部分是为系统保留的。
  • 09-20 14:58