PC端C++软件, 开启大地址,让32位程序使用4G内存

原文链接:https://blog.csdn.net/xiezhongyuan07/article/details/103703675

我在以前的文章中分析过软件的内存模型(链接点击这里),从中我们可以知道,程序运行起来以后,它将有自己独立的虚拟地址空间。这个空间的大小与操作系统的位数有关。目前使用C++开发的PC端软件一般都是开发32位的。那么32位的软件,最大寻址空间也就是4GB。其中很重要的一部分是给系统内核使用的内核空间。在32位的windows操作系统中,高地址的2GB空间就是给内核使用的内核空间,用户程序空间只有2GB;而32位的linux内核空间只有1GB大小,也就是用户空间有3GB大小。我们也引用以前的图:
在这里插入图片描述

其中,我们用户自己的空间其实只有2G左右。但是在实际过程中,我们很可能遇到这样的问题,申请内存不够,导致程序运行失败,更严重的直接崩溃了。
在我们实际应用中,我们还真遇到了这样的问题。我们有这样一个需求,就是对图片进行内存级别的翻转,这时候如果图片较大,内存反转也就需要很多的连续内存空间。很多时候,程序就这样崩溃了。
一直以为解决方案就是压缩图片,或者升级为64位的程序。偶然的时机,看到同事的文章,就是讨论如何让32位程序使用4G内存。觉得特别有意义,这里也算是记录一下。

我们在使用VS开发的过程中,一直忽略了项目配置的一个属性,就是 LARGEADDRESSWARE。这个就是解决问题的关键点。

1.对于 VS项目:
右键->属性->配置属性->链接器->系统->启用大地址->是(/LARGEADDRESSWARE) 进行开启大地址:
在这里插入图片描述

2.对于 QT 项目:
在配置文件.pro中添加下面的编译选项,进行开启大地址:

QMAKE_LFLAGS_WINDOWS += /LARGEADDRESSAWARE

3.其实不管使用什么IDE编译的程序,都可以使用VS的editbin工具打开大地址选项。
1.打开VS命令行工具,cd到exe的目录下:

editbin /largeaddressaware xxx.exe

4.接下来我们怎么验证一下当前程序是否启用了大地址呢?
这时候,我们可以借用VS命令行工具,editbin命令来进行检测。
1.首先打开VS命令行工具:
在这里插入图片描述

2.进入生成的可执行文件的目录
3.使用dumpbin命令进行检测:

dumpbin /headers xxx.exe

我们先看一下没有启动大地址的程序是什么样子的:
在这里插入图片描述

主要是红框里面的内容,用来标识。上面的是没有启用大地址的内容。
我们按照上面提到的方式,启用大地址之后看一下结果:
在这里插入图片描述

我们可以看到信息增加了一行:“Application can handle large (>2GB) address”。也就是程序可以操控大于2GB的地址。这也就达到了我们开启大地址的结果。

32位的程序开启了大地址,可以降低由于程序申请大内存失败导致的崩溃。有效提高了软件的稳定性。
————————————————
版权声明:本文为CSDN博主「漫步繁华街」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiezhongyuan07/article/details/103703675

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值