C语言近程型(near)和远程型(far)的区别是什么?
DOS用一种分段结构来寻址计算机的内存,每一个物理存储位置都有一个可以用段一偏移量方式来访问的相关地址。例如,下面就是一个典型的段式地址:
A000:1234
冒号左边的部分代表段地址(A000),冒号右边的部分代表相对于段地址的偏移量。DOS下的每个程序都是按这种方式访问内存的——尽管段一偏移量寻址方法的机理对大多数C程序员来说是隐蔽的。
当你的程序被执行时,一个存放在数据段(DS)寄存器中的数据段地址将被赋给你的程序。这个缺省的数据段地址指向一个64KB的内存空间,这个空间通常就
被叫做近程型数据段。在这个近程型数据段空间中,你会找到程序的栈、静态数据和近程堆。近程堆用来为程序启动时所需的全局变量和其它数据元素分配内存,在
这个空间中分配的任何数据都被叫做近程型数据。例如,下面的程序在程序启动时从近程堆中分配了32KB的近程型数据:
/ * Note :Program uses the Medium memory model...* /
# include <stdio. h>
# include <alloc. h>
# include <string. h>
# include <stdlib. h>
# include <dos. h>
void main(void) ;
void main(void)
{
char * near_data;
near_data= (char * )malloc((32 * 1024) * sizeof(char)) ;
if (near data= = (char * )NULL)
{
printf("Whoopsie ! Malloc failed! \n") ;
exit(l) ;
}
strcpy (near_data,
"This string is going to be. stored in the near heap") ;
printf("Address of near_data : %P\n", ,&near_data) ;
free (near_data) ;
}
在上例中,near_data是一个字符指针,程序分配给它一个32KB的内存块。在缺省情况下,这个32KB的内存块是从近程堆中分配的,并且相应的16位地址将被存放在字符指针near_data中。
现在,你已经知道什么是近程型数据了,但你可能还不大明白什么是远程型数据,很简单,远程型数据就是位于缺省数据段(第一个64KB数据段)以外的数据。下例中的程序从远程型数据区(通常也叫做远程堆)中分配了32KB的空间:
/ * Note:Program uses the Medium memory model... * /
# include <stdio. h>
# include <alloc. h>
# include <string. h>
# include <stdlib. h>
#include <dos. h>
void main(void) ;
void main(void)
{
char far * far_data;
far_data= (char far * )farmalloc((32 * 1024) * sizeof(char)) ;
if (far data= = (char far*)NULL)
{
printf ("Whoopsie ! Far malloc failed ! \n") ;
exit (1) ;
}
fstrcpy(far data,
"This string is going to be stored in the far heap");
printf("Address of far_data : %Fp\n",&far_data) ;
farfree (far_data) ;
}
在这个例子中,远程型字符指针被赋予了一个32位地址,该地址对应于远程堆中一块32KB的可用内存。注意,为了明确地从远程堆中分配内存,必须使用一个
far指针,因此上例的字符指针定义中加入了远程型修饰符(far)。此外,你还要注意,从远程堆中分配内存的一些函数
(fareoreleft(),farmalloe(),farfree())和从近程堆中分配内存的函数是不同的。
远程堆中的可用内存通常比近程堆中的多得多,因为近程堆被限制在64KB之内。如果你在你的计算机上编译并运行前面的两个例子,你会发现第一个例子(从近
程堆中分配内存)大约有63KB的可用内存,而第二个例子(从远程堆中分配内存)大约有400KB到600KB(依赖于你的计算机配置)的可用内存。因
此,如果你的程序需要大量的内存来存储数据,你就应该使用远程堆而不是近程堆。
不管使用哪一种存储模式(Tiny存储模式除外),你都可以用near和far修饰符以及相应的近程型和远程型函数来明确地从近程堆和远程堆中分配内存。合理地使用近程型和远程型数据,将有助于提高程序的运行效率,减少程序用尽内存的危险。
注意,因为DOS使用的是段地址结构寻址机制,所以近程型和远程型数据的概念是运行DOS的PC机所独有的。其它操作系统,例如UNIX和Wndows NT,使用的是平面地址机制,没有近程型或远程型限制。
C语言近程型(near)和远程型(far)的区别是什么?的更多相关文章
- (转)C语言16进制输出字符型变量问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- C语言中以十六进制输出字符型变量会出现'ffffff"的问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串
磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...
- 小白日记49:kali渗透测试之Web渗透-XSS(三)-存储型XSS、DOM型XSS、神器BEFF
存储型XSS与DOM型XSS [XSS原理] 存储型XSS 1.可长期存储于服务器端 2.每次用户访问都会被执行js脚本,攻击者只需侦听指定端口 #攻击利用方法大体等于反射型xss利用 ##多出现在留 ...
- Python基础:数值(布尔型、整型、长整型、浮点型、复数)
一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...
- Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)
提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...
- Python中从SQL型数据库读写dataframe型数据
Python的pandas包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,因此经常将sql数据库里的数据直接读取为dataframe,分析操作以后再将dataframe存到sq ...
- java使用格式String型转成Date型
public class TimeTwo { public static void main(String[] args) throws ParseException{ String s = &quo ...
- Atitit 3种类型的公司:运营驱动型;产品驱动型; 技术驱动型。
Atitit 3种类型的公司:运营驱动型:产品驱动型: 技术驱动型. 领导驱动,产品驱动,运营驱动还是工程师驱动 3种类型的公司: 一种是运营驱动型: 一种是产品驱动型: 一种技术驱动型. 运营驱动 ...
随机推荐
- js弹出window.open窗口
<html> <head> <SCRIPT LANGUAGE="JavaScript"> function openwin() {OpenWin ...
- ngApp指令,也就是ng-app属性
翻译:https://docs.angularjs.org/api/ng/directive/ngApp 使用这个指令去 自动引导 一个AngularJS 应用程序. ngApp 指令规定了html ...
- cocos2dx遇到的坑2
记录下在cocos2dx 2.x时代遇到的问题 1.cocos2dx retain 在onenter时,在onexit时 release 2.先结束定时器再退出界面 3.在不同帧里数据是有可能不一 ...
- Wpf border 容易弄混的两个属性
代码如下: <Border Margin=" > <Button Content="dafkafjk"></Button> </ ...
- Message Delivery Semantics
4.6 Message Delivery Semantics Now that we understand a little about how producers and consumers wor ...
- 【C#】事件(Event)和代理/委托(Delegate)
代理(Delegate)的例子 delegate void MyDelegate(string str,int index); // 声明代理 class Test { public static v ...
- 数据库——SQL中EXISTS怎么用2(转)
数据库sql语句的exists总结 sql exists in 学习 先来比较下语法: --deals=交易表,areas=地域表,例如香港:我们的目的:查看有交易的地域 select * from ...
- Phalcon学习-model
Model:表与表之间的关系:hasOne 一对一( $fields, $referenceModel, $referencedFields : 当前表中的字段, 对应关系模型, 对应关系模型中表的字 ...
- hadoop的调试
折腾hadoop的调试很久了,一直都没折腾对,查过很多资料,但是都没试出来,最终在不断地尝试当中调试出来了,所以想把这个过程记录下来,和大家分享一下. 调试分为两部分,MapReduce的调试和源码的 ...
- PHP并发IO编程之路
并发IO问题一直是服务器端编程中的技术难题,从最早的同步阻塞直接Fork进程,到Worker进程池/线程池,到现在的异步IO.协程.PHP程序员因为有强大的LAMP框架,对这类底层方面的知识知之甚少, ...