[转]
tc六种内存模式:tiny、small、medium、compact、large和huge,其中tiny、small和medium由于数据段不能超过64k,叫小数据模式,compact、large和huge的数据段可以超过64k,叫大数据模式;类似地,tiny、small和compact叫小代码模式,medium、large和huge叫大代码模式。
小数据模式和大数据模式的数据段分为静态存储区、堆、栈和远堆四部分,静态存储区的排列顺序是一样的,都跟在代码段后面,但堆和栈排列顺序是不一样的。小数据模式数据段的排列方式是(由低到高地址)静态存储区、堆、栈、远堆,大数据模式则是静态存储区、栈、堆(包含远堆)。
大数据模式中的数据段可以超过64k的意思并非你可以任意定义一个对象超过64k,而是组成数据段的静态存储区、栈和堆空间的总和可以超过64k。
三种大数据模式的栈大小均不能超过64k,原因是受到实模式的限制,一个段大小最大只能是64k,这意味着,所有自动对象所占内存空间的总和最大不能超过64k,否则就栈溢出了;
compact和large模式的静态存储区不能超过64k,而huge则可以,这里所说的可以,并非指你就可以通过huge模式定义一个大于64k的静态数组,而是指静态存储区的总和可以大于64k,但组成静态存储区的每个编译单元(也就是一个文件)不能超过64k,举个例,如果你需要定义一个数组static char a[70000l],这是不行的,你得把这个数组分成两部分,分别放在不同的编译单元里,例如a.c里面放static char a[35000l],而b.c放static char a[35000l]。
但是我非得定义一个大于64k的数组,怎么办啊?可以通过远堆进行定义,条件是:
1。使用大数据模式;
2。使用farmalloc函数分配;
3。使用huge巨型指针,不能用far指针,因为far指针的段值部分是不变的,而huge指针是规范化的,段值部分可以改变。