Chinaunix首页 | 论坛 | 博客
  • 博客访问: 580800
  • 博文数量: 192
  • 博客积分: 3780
  • 博客等级: 中校
  • 技术积分: 1487
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-26 10:11
文章存档

2012年(6)

2011年(160)

2010年(26)

分类: C/C++

2011-09-09 17:29:24

近堆 远堆分配
2009-11-18 14:59

应该是near 和 far指针的问题。
产生原因是这样的:如果动态创建的数据量比较大,用一个数据段(一般是64K,此时段指针不变,偏移量指针在16bit内变化)放不下的时候,需要重新开辟一个数据段供存放更多的数据,此时称原来的堆部分为近堆,改变段地址后的新的数据段所在的堆部分称为远堆

PC机得存储器地址是由段地址和偏移地址组合而成,每一段不能超过64k字节地址,因而统一个段内的地址存取,用偏移地址就可以实现,因段地址寄存器所存的段地址是不变。当用指针时,只16未就够了,这一类就是near指针。当要在另一个段内取数据,就要跨越段,既要指明存取段的段地址和偏移地址,这时段地址寄存器所存段地址要改变,在使用指针指向另一个段内地址时,就要用32位表示,就是far指针了。

由于dos是16位的操作系统,故程序代码受到segment的限制,near指针最多只能指向64k以内的代码或数据。而far则可以跨段寻址,如果我没记错的话好像还有huge类型的远指针。但是由于watcom,djgpp等dos下的编译器,以及所有windows下的编译器都是32位的顾没有 64k的限制,指针也就不分远近了

farmalloc
  函数名: farmalloc
  功 能: 从远堆中分配存储块
  用 法: void far *farmalloc(unsigned long size);
  程序例:
  #include
  #include
  #include
  #include
  int main(void)
  {
  char far *fptr;
  char *str = "Hello";
  /* allocate memory for the far pointer */
  fptr = farmalloc(10);
  /* copy "Hello" into allocated memory */
  /*
  Note: movedata is used because we might
  be in a small data model, in which case
  a normal string copy routine can not be
  used since it assumes the pointer size
  is near.
  */
  movedata(FP_SEG(str), FP_OFF(str),
  FP_SEG(fptr), FP_OFF(fptr),
  strlen(str) + 1);
  /* display string (note the F modifier) */
  printf("Far string is: %Fs\n", fptr);
  /* free the memory */
  farfree(fptr);
  return 0;
  }

应该是near 和 far指针的问题。
产生原因是这样的:如果动态创建的数据量比较大,用一个数据段(一般是64K,此时段指针不变,偏移量指针在16bit内变化)放不下的时候,需要重新开辟一个数据段供存放更多的数据,此时称原来的堆部分为近堆,改变段地址后的新的数据段所在的堆部分称为远堆

PC机得存储器地址是由段地址和偏移地址组合而成,每一段不能超过64k字节地址,因而统一个段内的地址存取,用偏移地址就可以实现,因段地址寄存器所存的段地址是不变。当用指针时,只16未就够了,这一类就是near指针。当要在另一个段内取数据,就要跨越段,既要指明存取段的段地址和偏移地址,这时段地址寄存器所存段地址要改变,在使用指针指向另一个段内地址时,就要用32位表示,就是far指针了。

由于dos是16位的操作系统,故程序代码受到segment的限制,near指针最多只能指向64k以内的代码或数据。而far则可以跨段寻址,如果我没记错的话好像还有huge类型的远指针。但是由于watcom,djgpp等dos下的编译器,以及所有windows下的编译器都是32位的顾没有 64k的限制,指针也就不分远近了

farmalloc
  函数名: farmalloc
  功 能: 从远堆中分配存储块
  用 法: void far *farmalloc(unsigned long size);
  程序例:
  #include
  #include
  #include
  #include
  int main(void)
  {
  char far *fptr;
  char *str = "Hello";
  /* allocate memory for the far pointer */
  fptr = farmalloc(10);
  /* copy "Hello" into allocated memory */
  /*
  Note: movedata is used because we might
  be in a small data model, in which case
  a normal string copy routine can not be
  used since it assumes the pointer size
  is near.
  */
  movedata(FP_SEG(str), FP_OFF(str),
  FP_SEG(fptr), FP_OFF(fptr),
  strlen(str) + 1);
  /* display string (note the F modifier) */
  printf("Far string is: %Fs\n", fptr);
  /* free the memory */
  farfree(fptr);
  return 0;
  }
阅读(1100) | 评论(0) | 转发(0) |
0

上一篇:可视化步进电机控制系统

下一篇:TCP协议

给主人留下些什么吧!~~