计算机二级换c语言,09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存)...

2023-11-07

09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存)

分类:计算机等级|

更新时间:2008-11-21|

来源:教育联展网

在32位机上(64位也是一样的,但是空间大很多),一个进程可以分配到4GB的虚拟内存,当然,其中2G给了内核,剩下2GB有一些分给了代码段、数据段,最后剩下的就是给我们程序员用的了,这样看来,一个应用程序若硬生生的读取2GB左右的数据是一个极限了。

不过事实并非如此,只要利用虚拟内存技术有时还是可以读取的。

先简单说说windows虚拟内存的思路:  所谓虚拟内存,就是事实上可能还没有得到实际内存的内存,如果CPU要访问一个虚拟内存,哪么操作系统得首先判断这个虚拟内存有没有获得实际内存。如果有,那大可以大大方方的读取,甚至写数据。

但若如果没有,操作系统就必须在实际内存上找到一块地方,建立起与要读取虚拟内存的映射关系,这样就可以读取了。当然若是找不到这么多实际内存,那么可以一些暂时还没用到的实际内存放到更低一级的硬盘临时空间上,腾出空间来,再建立与虚拟内存的映射关系。

当然了,比如要读取2GB的数据,在1G内存上是无论如何也没法找到足够空间建立映射关系的。我们当然不可能一次性读取2GB数据,所以引入“页”这个概念,即每次虚拟内存射到实际内存上的时候,都是按页大小映射的,这个页大小,与CPU有关,在X86上一般是4KB。

说到这,读取大型数据的思路就出来了,我们可以先分配虚拟内存,等到我们读或者写当中的一些数据的时候,再分配实际内存,由于这些都是在内存这一级操作,效率远比读写数据的时候再从硬盘取出来的高。

windows API让我们轻松做到这一点。

VirtualAlloc,可以申请到一个虚拟内存,或者实际映射到实际内存的内存。我们可以先申请虚拟内存,等到真的要读取某处数据的时候,再申请实际内存(建立映射关系)。

详细可以看MSDN,下面给出一个示例代码:  #include

#include

#include

struct Sheet //我们要读取的数据结构

{

int nSize;

BOOL bVisible;

char big[1024 * 15];

std::string strText;

};

int main()

{

SYSTEM_INFO si;

GetSystemInfo(&si);

DWORD dwPageSize = si.dwPageSize; //获得CPU读取的页大小

//把页的单位转为字节(页的单位本来是KB,而我们的数据结构是按字节算的)

DWORD dwPageAsByte = dwPageSize * 1024;

//以下dwOccupy获得一个数据结构所占的空间,由于是按页分配实际内存,这样所占空间并定是页的整数倍

DWORD dwMod = sizeof(Sheet) % dwPageAsByte;

DWORD dwOccupy = 0;

if (dwMod != 0)

{

dwOccupy = (sizeof(Sheet) / dwPageAsByte) * dwPageAsByte + dwPageAsByte;

}

else

{

dwOccupy = sizeof(Sheet);

}

//申请虚拟内存,MEM_RESERVE表示不会和实际内存建立映射关系

LPVOID lpBaseAddr = VirtualAlloc(NULL, dwOccupy * 50, MEM_RESERVE, PAGE_READWRITE);

if (lpBaseAddr == NULL)

{

return 1;

}

__try

{

DWORD dwIndex = 0;

//以下不断的输入要读取哪个数据,若此数据还有没有建立实际内存映射关系,那么建立

while(true)

{

std::cout << "input the sheet number to write: ";

std::cin >> dwIndex;

//根据输入的索引,计算出所要读取的数据结构所在地址,注意同样是按页分配的

LPVOID lpSheetAddr = (LPVOID)((DWORD)lpBaseAddr + (dwIndex - 1) * dwOccupy);

MEMORY_BASIC_INFORMATION mbi;

memset(&mbi, 0, sizeof(mbi));

//查询内存状态

if (VirtualQuery(lpSheetAddr, &mbi, sizeof(mbi)) == sizeof(mbi))

{

if (mbi.State == MEM_RESERVE)//属于reserve状态

{

//建立与实际内存的映射关系

LPVOID lpAlloc = VirtualAlloc(lpSheetAddr, dwOccupy, MEM_COMMIT, PAGE_READWRITE);

if (lpAlloc == NULL)

{

std::cout << "commit fails in reserve state\n";

}

else

{

std::cout << "commit successes in reserve state\n";

}

}

}

//建立成功,考试@大提示读/写数据

Sheet * pSheet = (Sheet*)lpSheetAddr;

pSheet->nSize = 9;

pSheet->strText = "hello world";

pSheet->bVisible = TRUE;

}

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

}

//释放内存

VirtualFree(lpBaseAddr, 0, MEM_RELEASE);

}

当然,这其中用到了一个影响效率的VirtualQuery函数,其实可以用异常处理手段提高效率的,留待以后再说。

还可以添加删除代码,一些数据不再用到的时候,可以把虚拟内存状态重新置为MEM_RESERVE,这样可以节省实际内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机二级换c语言,09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存)... 的相关文章

  • 使用MyBatis分页插件PageHelper遇到的问题

    最近在使用mybatis的PageHelper进行分页查询时 遇到了不少问题 总结一下希望能帮到别人 1 版本错误 报错如下 java lang NoSuchMethodError java util List net sf jsqlpar
  • 关于调用Callable时的一个问题分享--总是只输出最后一次数据

    问题描述 我本来想使用线程池 ExecutorService Callable实现多线程处理数据 测试过程发现 只循环2到3次时 最终输出的数据只有最后一次遍历的数据 很奇怪 遇到问题解决问题 1 首先把我的测试代码贴出来 1 1 测试代码
  • Java导出压缩文件

    在很多场景需要导出很多的文件 将其压缩成zip是一个很不错的选择 先将要压缩的文件路径和名称得到 然后用工具类将其压缩 代码逻辑清晰 使用得修改一些文件路径 实现类中导出方法中 String zipFileName 工单附件 new Sim
  • 剑指 Offer 12. 矩阵中的路径

    题解 dfs 对棋盘里的每个点都dfs一遍 看是否有合适的字符串 当找到最后一个字符位置 并且最后一个字符 并且当前字符串匹配 那么为真 注意回溯之后的标记需要改成false 因为需要回溯进行查找 class Solution public
  • Hive启停脚本

    bin bash HIVE LOG DIR HIVE HOME logs if d HIVE LOG DIR then mkdir p HIVE LOG DIR fi 检查进程是否运行正常 参数 1 为进程名 参数 2 为进程端口 func
  • Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化

    上篇文章Spring Cloud Alibaba Sentinel 初体验介绍了Sentinel 的简单使用 在使用过程中我们发现在Sentinel 控制台中配置了规则之后 随着服务的重启 配置的规则也随之消失 Sentinel 控制台控制
  • 写成生成以给定的p为参数的伯努利样本的程序,并写出由样本计算p的程序

    根据给定的参数p 编写伯努利样本的程序如下 def bernoulli sample p 定义一个变量x x 0 产生一个0 1之间的随机数 r random random 若随机数小于等于p 则x 1 if r lt p x 1 返回x
  • python判断一个字符串是不是ip地址

    文章目录 一 解决思路 二 判断代码 一 解决思路 满足什么条件的叫ip地址 1 先判断它是不是由4段数字用点号 分隔开 2 再判断每段数字的十进制是不是在0 255之间 满足以上条件就是正确的IP地址 那么解决思路就来了 1 拿到IP 先
  • 如何过掉前端Chrome的debugger反调试

    1 禁用浏览器断点 点击图中按钮 之后将不会再命中任何断点 这种方法虽然可以防止无限循环命中debugger断点 但是也存在很大的缺陷 因为对于其他代码 我们还是需要断点调试功能的 所以这个方法仅限于静态分析 2 直接使用debugger指
  • 唯品会测试工程师面试

    秋招 笔试题是后台 前端 测试同一套的题 考基础 面试 2014 09 25 一面 为什么做测试 测试遇到的最大的困难 python和java做的网站的区别 参加过什么社团活动 有没有上唯品会买过东西要你测怎么测 有哪些测试方法举例说 HR
  • 解决 深度学习docker 端口连接被对方重设

    在容器中启动 jupyter notebook 的时候 请指定 ip 为 0 0 0 0 aka 原因 docker启动的时候 我们的命令是 p 8888 8888 比如 sudo nvidia docker run it p 8888 8
  • 输入年份,判断输入的年份是否是闰年。(闰年的条件是能被 4 整除,但不能被 100 整除;或能被 400 整除。)

    public class Task 10101003 02 public static void main String args Scanner input new Scanner System in System out println
  • Charles证书-手机刷入系统信任证书

    最近面试需要 重新捡起了爬虫 在抓包的时候发现尽管按照Charles的要求去安装证书 还是会抓不到https的包 最后发现需要把用户信任证书是不够的 需要系统信任证书才行 第一步 把代理设置成Charles的代理 具体做法 Help SSL
  • 【机器学习基本理论】详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

    机器学习基本理论 详解最大似然估计 MLE 最大后验概率估计 MAP 以及贝叶斯公式的理解 https mp weixin qq com s 6H0gmMWvTExySMraroLVlQ 最大似然估计 Maximum likelihood
  • 使用teamviewer搭建内网服务器。

    目录 起因 下载并安装teamviewer 服务器安装ccproxy 客户端使用SwitchyOmega 起因 学习的时候 学习视频必须使用校内的网络才能连接观看 校外无法观看 所以使用teamviewer和proxy搭建一个方便访问的服务
  • 绝对定位的元素宽度自动撑开

    position absolute white space nowrap
  • java传输json数据用md5加密过程

    1 加密过程 客户端传输数据 包含两部分 一部分原始数据 一部分签名 签名就是对原始数据MD5加密后的字节序列 而原始数据就是普通的string字符串 2 服务器端呢 将收到的原始数据 进行MD5加密后得到字节序列 将这个字节序列与传输过来
  • UDP客户端程序(C语言)

    UDP客户端程序 与UDP服务器端程序配合使用 Visual Stdio 运行 UDP客户端 cpp 定义控制台应用程序的入口点 include stdafx h include
  • 使用libevent编写高并发HTTP server

    libevent库使得高并发响应HTTP Server的编写变得很容易 整个过程包括如下几部 初始化 创建HTTP Server 指定callback 进入事件循环 另外在回调函数中 可以获取客户端请求 request的HTTP Heade

随机推荐

  • 多线程同步之生产者---消费者模型

    额 腾讯二面的时候 被问到了这个模型 很不幸啊 不会用代码来实现 生产者消费者模型 对于多线程程序来说 不管任何编程语言 生产者和消费者模型都是最经典的 就像学习每一门编程语言一样 Hello World 都是最经典的例子 实际上 准确说应
  • Vue 在for循环中动态添加类名及style样式集合

    介绍 在vue的 for 循环中 经常会使用到动态添加类名或者样式的情况 实现给当前的选中的 div 添加不同的样式 动态添加类名 提示 所有动态添加的类名 放在表达式里都需要添加引号 进行包裹 通过 对象 的形式 使用花括号进行包裹 使用
  • 信号处理在matlab常用函数

    stem Y 将数据序列Y从x轴到数据值按照茎状形式画出 以圆圈终止 如果Y是一个矩阵 则将其每一列按照分隔方式画出 stem X Y 在X的指定点处画出数据序列Y stem filled 以实心的方式画出茎秆 stem LINESPEC
  • LeetCode:二叉树的属性(13道经典题目)

    LeetCode 二叉树的属性 13道经典题目 本文带来与二叉树的属性有关的经典题目 主要实现是C 题目 题目 101 对称二叉树 100 相同的树 572 另一棵树的子树 104 二叉树的最大深度 559 N 叉树的最大深度 111 二叉
  • C++:在Visual C++ 6.0中创建工程项目

    在Visual C 6 0中创建工程项目 在利用一个新的集成开发环境之前 首先要懂得如何创建一个工程项目 而本文接下来要讲述的就是如何在经典的C 编程环境Visual C 6 0中创建工程项目 工具 原料 电脑 Visual C 6 0 方
  • 十、【服务器】服务器软件及协议 名称中英文汇总1

    涉及到的软件和协议其实非常多 后续遇到重要的再添加更新 Level 1 Level 2 Level 3 服务器软件及协议 名称汇总 中英文 基本输入输出系统 BIOS Basic Input Output System 基板管理控制器 BM
  • 51单片机与PC串口通信程序及硬件电路图

    51单片机与PC串口通信程序及硬件电路图 2008年03月19日 星期三 21 35 include
  • Win7中出错:无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-

    安装完 Python 后 配置好 Python 目录于 Path 然后 CMD 命令下输入 python 验证是否配置成功 但是竟然出现结果跳出对话框 出错 无法启动此程序 因为计算机中丢失api ms win crt runtime 1
  • HashMap底层实现原理及面试问题

    一 HashMap的工作原理 HashMap基于hashing原理 我们通过put 和get 方法储存和获取对象 当我们将键值对传递给put 方法时 它调用键对象的hashCode 方法来计算hashcode 让后找到bucket位置来储存
  • 查看linux主机启动时间(转载)

    1 查看 proc uptime root master1565 cat proc uptime 673 83 1327 68 root master1565 date d cut f1 d proc uptime seconds ago
  • 抖音直播录制工具

    抖音无法监测开播 抖音采集工具 软件出现未响应 闪退 并且会出现一个无名主播文件夹 以前都是主播名字 再打开软件就提示 Failed to execute script main 删除无名主播文件夹 软件又可以正常打开 新添主播 又出现未响
  • 常用的软件测试工具大全

    开源测试管理工具 Bugfree Bugzilla TestLink mantis 开源功能自动化测试工具 Watir Selenium MaxQ WebInject 开源性能自动化测试工具 Jmeter OpenSTA DBMonster
  • 在unity中如何实现视频播放暂停停止重播功能

    在Unity中实现视频播放 暂停 停止和重播功能 可以通过以下步骤实现 将视频文件导入Unity项目中 并将其设置为资源 创建一个新的Unity游戏对象 并将Video Player组件添加到该对象上 将视频文件设置为Video Playe
  • vue动态修改标签页的icon、系统名称

    一 修改icon 1 修改初始化的 icon 只需要把 public favicon ico 改成我们所需要的图片即可 2 动态改变icon document querySelector link rel icon setAttribute
  • python中如何统计文本中的单词个数_python统计文本文件内单词数量的方法

    本文实例讲述了python统计文本文件内单词数量的方法 分享给大家供大家参考 具体实现方法如下 count lines sentences and words of a text file set all the counters to z
  • 大数据课程I1——Kafka的概述

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 了解Kafka的概念 掌握Kafka的配置与启动 一 简介 1 基本概念 Apache kafka 是一个分布式数据流平台 可以从如下几个层面来理解 1 我们
  • 安装office2010失败,提示因为安装了office2010早期试用版本或在安装过程中出错

    昨天下午 一个同学说他要考全国计算机二级考试 需要安装office2010进行做操作题目 但是怎么弄也不能安装上 就连上课老师也安装不了 还告诉他需要换一个系统才能够进行安装 后来她找到了我 请我帮他解决一下 我毫不犹豫的答应了 我拿到电脑
  • [H5] Canvas画布的使用详解:

    Canvas 序言 在渲染复杂的动效 把数据可视化图形显示 游戏场景等需求 都会用canvas技术 比dom操作性能更高 特点 H5新增的图形标签 通过提供的JavaScript函数绘制各种图表或利用算法实际非常华丽的动效 在以前是用Fla
  • 解决AttributeError: 'set' object has no attribute 'items'错误

    出现这个问题 原因可能是定义的header有问题 header key value 如果是直接在请求数据中复制 很有可能会忽略键和值的冒号
  • 计算机二级换c语言,09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存)...

    09年计算机二级C语言辅导 C技巧 内存分配 更换策略 不要为难内存 分类 计算机等级 更新时间 2008 11 21 来源 教育联展网 在32位机上 64位也是一样的 但是空间大很多 一个进程可以分配到4GB的虚拟内存 当然 其中2G给了