搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 嵌入式notes > C语言存储模式区别、near指针,far指针,huge指针

C语言存储模式区别、near指针,far指针,huge指针

嵌入式notes 2018-03-01

一、C语言各种存储模式的区别

-----------------------------------------------------------------------————————————————————————

存储模式              限制                    所用指针

-----------------------------------------------------------------------————————————————————————

Tiny(微)             代码、数据和栈一64KB      Near 

Small(小)           代码一64KB                Near  

                    数据和栈一64KB           Near 

Medium(中)          代码一1MB                 Far  

数据和栈一64KB            Near 

Compact(紧缩)       代码一64KB                Near  

数据和栈一1MB             Far 

Large(大)            代码一1MB                 Far 

数据和栈一1MB             Far 

Huge*(巨)            代码一1MB                 Far 

数据和栈一1MB             Far

-----------------------------------------------------------------------——————————————————————————————————————————————————————————————————

1)Tiny存储模式的限制很严(所有的代码、数据和栈都被限制在64KB中),它通常用来生成"COM"文件,在现在的高性能计算机上,它已很少被使用了。

3)如果程序有更大一些的数据要求,你可以使用Medium存储模式,它允许程序有多达1MB的可寻址数据空间,或者说如果一个程序的代码量相对较大而静态数据量相对较小,你可以用Medium存储模式来创建程序。

4)Cornpact存储模式允许程序有大量的静态数据和相对较少(64KB或更少)的代码。满足这种模式的程序很少,常常是一些转移程序,它们有大量必须存到内存中的静态转移表。在今天的商业应用环境中,它同样也不常用了。

5)对于更大的程序,你应该使用Large存储模式,它允许程序有1MB的代码和1MB的数据和栈空间。如果程序很大(需要很多模块,大量的代码和数据),那么你应该选用Large存储模式,这种存储模式常用在DOS下编写商用软件。

6)在Huge存储模式下,静态数据(如数组)可以超过64KB,这在其它存储模式下都不行。与Compact存储模式相似,Huge存储模式也很少被使用,这主要是因为它会带来显著的性能损失。由于Huge存储模式的执行效率较低,因此你应该避免使用这种模式,除非你确实需要超过64KB的一个数组或其它静态数据。Huge存储模式与Large存储模式基本相同,只是Huge存储模式允许程序有超过64KB的静态数据。

而最常使用的存储模式有Small,Medium和Large这几种。一般说来,你应该根据程序的大小选用Small,Medium或Large中的一种存储模式。与Small,Medium和Large存储模式相比,Tiny、Compact和Huge存储模式要少用得多。记住,数组和其它程序结构可通过malloc()和calloc()在程序运行时进行动态分配,它们在本质上并不必须是静态的。

二、Dos下near指针,far指针,huge指针


2、什么时候使用far指针

当使用小代码或小数据存储模式时,不能编译一个有很多代码或数据的程序。因为在64K的一个段中,不能放下所有的代码与数据。为了解决这个问题,需要指定以far函数或far指针来使用这部分的空间(64K以外的空间)。许多库函数就是显式地指定为far函数的形式。far指针通常和farmalloc()这样的内存分配函数一起使用。

因为可以有每个段都是64K的,可以寻址多个段,所以这种指针的寻址范围很大,如果你的程序代码或者数据超过了64K,就只能用FAR指针或HUGE指针来操作了。它们二者也是有区别的:

HUGE指针是经过规范过的,可以直接比较大小。不过由于要处理后进行比较,所以运算速度较慢。FAR指针不能直接比较大小,但由于只比较偏移量,所以FAR指针的运算速度较快,你可以根据需要选用。

一、近(near)指针

char_near *p=(char _near *)0xffff;

p++;

由于近指针的这个严重限制,所有在比较大或比较复杂的程序中,都无法使用。

二、远(far)指针

char far *fp=(char far *)0xb800ffff;

fp++;

if(a==b)....

if(b==c)....

if(c==d)....

if(d==e)....

if(a==c)....

if(a==d)....

第二,      当用“>”、“>=”,“<”和“<=”关系操作符对指针进行比较操作时,比较的仅仅是偏移量部分,即按无符号的16位整数进行比较。因此,对于上面这个例子,下列表达式运算的结果将都为“真”,也得出错误的结论:

if(e>d)....

if(d>c)....

if(c>b)....

if(b>a)....

if(e>a)....

二、巨(huge)指针

只有巨指针才是一般C语言教科书上所说的指针,它像远指针也占4个字节。与远指针的显著差别是:当增量或减量超过64K字节段边界时,巨指针会自动修正段基址的值。因此,巨指针不但可以寻址内存中的任一区域,而且所寻址的数据目标可以超过64K字节。例如:

char huge *hp=(char huge*)0xb800ffff;

hp++;

四、基(based)指针

前面已经说过,巨指针综合了近指针和远指针的优点。像近指针一样,基指针只占两个字

五、各类指针之间的转换

void normalize(void far **p) {

*p=(void far *)(((long)*p^0xffff000f)+ (((long)*p^0x0000fff0)<<12));

}


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《C语言存储模式区别、near指针,far指针,huge指针》的版权归原作者「嵌入式notes」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注嵌入式notes微信公众号

嵌入式notes微信公众号:gh_34bbef23b540

嵌入式notes

手机扫描上方二维码即可关注嵌入式notes微信公众号

嵌入式notes最新文章

精品公众号随机推荐