一、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()在程序运行时进行动态分配,它们在本质上并不必须是静态的。
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微信公众号:gh_34bbef23b540
手机扫描上方二维码即可关注嵌入式notes微信公众号