TURBOC 2.0 巨型动态数组佳例(兼“素数筛法”例)
#include<stdio.h>#include<alloc.h>
void main( )
{
char huge* prime;
unsigned long i,j,NUM;
printf("远堆空闲字节数=%lu\n",farcoreleft());
printf("动态数组字节数="); scanf("%lu",&NUM);
if((prime=(char huge*)farmalloc(NUM+1))==NULL)
{
printf("远堆空闲内存不足...\n");
}
else
{
prime[0]=prime[1]=0;
for(i=2; i<=NUM;i++)prime[i]=1;
for(i=2;i*i<=NUM;i++)if(prime[i])
for(j=i+i;j<=NUM;j+=i)prime[j]=0;
printf("%-8lu",2L);
for(i=3;i<=NUM;i+=2)
if(prime[i])printf("%-8lu",i);
farfree((void far*)prime);
}
}
建议使用下列编译连接命令处理上面的程序:
tcc -mc thisfile.c
因为这样做出来的程序,运行时给出的“远堆空闲字节数”是最多的。
我在某机器上的实战经验如下
编译模式 给出的“远堆空闲字节数”
-mc 594168
-ml 593864
-mh 593064
-mt 544536 (先转换成com文件再运行)
-ms 534360
-mm 534088
换句话说,compact模式下给出的堆自由空间最大、在midium模式下运行时给出的远堆自由空间最小。
还有一点必须交代清楚,就是TC 2.0似乎有个瑕疵:当你使用
tcc -mh filename.c
或者
tcc -ml filename.c
进行编译连接时,如果源程序中调用下列库函数
foreleft()、malloc()、free()
则编译连接器实际引用的是
farcoreleft()、malloc()、farfree()
注意当中那个,tcc竟然不知道应该去调用farmalloc(),而只是继续调用小模式下的那个“近堆”内存分配函数!这样一来,为了确保huge型动态数组创建成功,你就必须在代码中明确写出完整的函数名即farmalloc()--尽管按“理”说既不应该也不需要写出这种“终极的”函数名!
理想情况则应该是这样一个效果,即源代码中出现malloc()时,编译器应该根据用户所选择“模式”自动进行“匹配”:对于"-mh"、"-ml"自动调整为farmalloc()、对于"-mt"、"-ms"等自动调整为malloc()--实际相当于nearmalloc()。