不同系统中有什么不同如linux/windows/dos
能给了源代码吗?谢谢
10 个解决方案
#1
在 VC 中单步调试跟踪就清楚了。我只知道 Win32 是用的
HeapCreate 和 HeapAlloc 分配内存,HeapFree 和 HeapDestory 清理
HeapCreate 和 HeapAlloc 分配内存,HeapFree 和 HeapDestory 清理
#2
ODS中是调用int 21H 的内存分配功能号来分配的.
#3
我刚看完英文版的《the c programming language》(花了两个月,呵呵),现学现卖。
在该书的第185-189页,有详细的说明,在unix下的实现。
/*内存块的数据结构*/
typedef long Align /*for allignment to long boundary*/
union header /* block header */
{
struct
{
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
}
Align x; /* force alignment of blocks*/
};
typedef union header Header;
在该书的第185-189页,有详细的说明,在unix下的实现。
/*内存块的数据结构*/
typedef long Align /*for allignment to long boundary*/
union header /* block header */
{
struct
{
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
}
Align x; /* force alignment of blocks*/
};
typedef union header Header;
#4
static Header base; /* empty list to get started*/
static Header *freep = NULL; /*start of free list*/
/* malloc :general-purpose storage allocator*/
void *malloc(unsigned nbytes)
{
Header *p,*prevp;
Header *morecore*(unsigned); /*另一个函数的声明,其作用是向操作系统申请内存
代码见下一贴*/
unsigned nunits; /*内存单元的个数*/
nunits = (nbytes+sizeof(Header)-1)/sizeof(Header)+1;
if ((prevp=freep) == NULL) /*no free list*/
{
base.s.ptr = freep = prevp = &base;
base.s.size = 0;
}
for(p=prevp->s.ptr; ;prevp = p, p=p-s.ptr) /*注意循环条件为空*/
{
if(p->s.size >= nunits) /* big enough*/
{
if(p->s.size == nunits) /*exactly equal*/
{
prevp->s.ptr = p->s.ptr;
}
else
{
p->s.size -= nunits;
p += p->s.size;
p->s.size = units;
}
freep = prevp;
rerturn (void*)(p+1);
} /*end of first if*/
if(p == freep) /*wrapped around free list*/
{
if((p==morecoe(units)) == NULL)
return NULL; /*none left*/
}
}/*end of for*/
}/*end of malloc*/
static Header *freep = NULL; /*start of free list*/
/* malloc :general-purpose storage allocator*/
void *malloc(unsigned nbytes)
{
Header *p,*prevp;
Header *morecore*(unsigned); /*另一个函数的声明,其作用是向操作系统申请内存
代码见下一贴*/
unsigned nunits; /*内存单元的个数*/
nunits = (nbytes+sizeof(Header)-1)/sizeof(Header)+1;
if ((prevp=freep) == NULL) /*no free list*/
{
base.s.ptr = freep = prevp = &base;
base.s.size = 0;
}
for(p=prevp->s.ptr; ;prevp = p, p=p-s.ptr) /*注意循环条件为空*/
{
if(p->s.size >= nunits) /* big enough*/
{
if(p->s.size == nunits) /*exactly equal*/
{
prevp->s.ptr = p->s.ptr;
}
else
{
p->s.size -= nunits;
p += p->s.size;
p->s.size = units;
}
freep = prevp;
rerturn (void*)(p+1);
} /*end of first if*/
if(p == freep) /*wrapped around free list*/
{
if((p==morecoe(units)) == NULL)
return NULL; /*none left*/
}
}/*end of for*/
}/*end of malloc*/
#5
morecore的代码:
#define NALLOC /*minimun units to request*/
/*morecore ask system for more memory*/
static Header* morecore(unsigned nu)
{
char *cp,*sbrk(int);
Header *up;
if(nu<NALLOC)
{
nu = NALLOC;
}
cp =sbrk(nu *sizeof(Header));
if(cp == (char*)-1) /*no space at all*/
{
return NULL:
}
up = (Header*) cp;
up->s.size = nu;
free(void *)(up+1));
return freep;
}
sbrk(int n)是系统调用,功能是"return a pointer to n more bytes of storage"
#define NALLOC /*minimun units to request*/
/*morecore ask system for more memory*/
static Header* morecore(unsigned nu)
{
char *cp,*sbrk(int);
Header *up;
if(nu<NALLOC)
{
nu = NALLOC;
}
cp =sbrk(nu *sizeof(Header));
if(cp == (char*)-1) /*no space at all*/
{
return NULL:
}
up = (Header*) cp;
up->s.size = nu;
free(void *)(up+1));
return freep;
}
sbrk(int n)是系统调用,功能是"return a pointer to n more bytes of storage"
#6
学习之。
#7
pf pf,学习
#8
UNIX 系统调用 sbrk (n) 返回的指针指向的空间包含 n 个额外的字节。如果没有空间,那么 sbrk 返回 -1。 ... -1 必须强制转换成 char 类型,以便与返回值相比较。
——摘自 The C Programming Language 中文版,P160,呵呵
也就是说,UNIX 的分配内存函数是 sbrk(n)。
个人以为 Win32 的 HeapCreate/HeapAlloc 双重缓冲更方便,呵呵。不要 malloc 维护一个内存池了。
——摘自 The C Programming Language 中文版,P160,呵呵
也就是说,UNIX 的分配内存函数是 sbrk(n)。
个人以为 Win32 的 HeapCreate/HeapAlloc 双重缓冲更方便,呵呵。不要 malloc 维护一个内存池了。
#9
to 完美废人
你那有sbrk的源代码吗?麻烦贴出来好吗,大家一起学习。谢谢!
你那有sbrk的源代码吗?麻烦贴出来好吗,大家一起学习。谢谢!
#10
interrupt(0x21);
就行了吧~~~
就行了吧~~~
#1
在 VC 中单步调试跟踪就清楚了。我只知道 Win32 是用的
HeapCreate 和 HeapAlloc 分配内存,HeapFree 和 HeapDestory 清理
HeapCreate 和 HeapAlloc 分配内存,HeapFree 和 HeapDestory 清理
#2
ODS中是调用int 21H 的内存分配功能号来分配的.
#3
我刚看完英文版的《the c programming language》(花了两个月,呵呵),现学现卖。
在该书的第185-189页,有详细的说明,在unix下的实现。
/*内存块的数据结构*/
typedef long Align /*for allignment to long boundary*/
union header /* block header */
{
struct
{
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
}
Align x; /* force alignment of blocks*/
};
typedef union header Header;
在该书的第185-189页,有详细的说明,在unix下的实现。
/*内存块的数据结构*/
typedef long Align /*for allignment to long boundary*/
union header /* block header */
{
struct
{
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
}
Align x; /* force alignment of blocks*/
};
typedef union header Header;
#4
static Header base; /* empty list to get started*/
static Header *freep = NULL; /*start of free list*/
/* malloc :general-purpose storage allocator*/
void *malloc(unsigned nbytes)
{
Header *p,*prevp;
Header *morecore*(unsigned); /*另一个函数的声明,其作用是向操作系统申请内存
代码见下一贴*/
unsigned nunits; /*内存单元的个数*/
nunits = (nbytes+sizeof(Header)-1)/sizeof(Header)+1;
if ((prevp=freep) == NULL) /*no free list*/
{
base.s.ptr = freep = prevp = &base;
base.s.size = 0;
}
for(p=prevp->s.ptr; ;prevp = p, p=p-s.ptr) /*注意循环条件为空*/
{
if(p->s.size >= nunits) /* big enough*/
{
if(p->s.size == nunits) /*exactly equal*/
{
prevp->s.ptr = p->s.ptr;
}
else
{
p->s.size -= nunits;
p += p->s.size;
p->s.size = units;
}
freep = prevp;
rerturn (void*)(p+1);
} /*end of first if*/
if(p == freep) /*wrapped around free list*/
{
if((p==morecoe(units)) == NULL)
return NULL; /*none left*/
}
}/*end of for*/
}/*end of malloc*/
static Header *freep = NULL; /*start of free list*/
/* malloc :general-purpose storage allocator*/
void *malloc(unsigned nbytes)
{
Header *p,*prevp;
Header *morecore*(unsigned); /*另一个函数的声明,其作用是向操作系统申请内存
代码见下一贴*/
unsigned nunits; /*内存单元的个数*/
nunits = (nbytes+sizeof(Header)-1)/sizeof(Header)+1;
if ((prevp=freep) == NULL) /*no free list*/
{
base.s.ptr = freep = prevp = &base;
base.s.size = 0;
}
for(p=prevp->s.ptr; ;prevp = p, p=p-s.ptr) /*注意循环条件为空*/
{
if(p->s.size >= nunits) /* big enough*/
{
if(p->s.size == nunits) /*exactly equal*/
{
prevp->s.ptr = p->s.ptr;
}
else
{
p->s.size -= nunits;
p += p->s.size;
p->s.size = units;
}
freep = prevp;
rerturn (void*)(p+1);
} /*end of first if*/
if(p == freep) /*wrapped around free list*/
{
if((p==morecoe(units)) == NULL)
return NULL; /*none left*/
}
}/*end of for*/
}/*end of malloc*/
#5
morecore的代码:
#define NALLOC /*minimun units to request*/
/*morecore ask system for more memory*/
static Header* morecore(unsigned nu)
{
char *cp,*sbrk(int);
Header *up;
if(nu<NALLOC)
{
nu = NALLOC;
}
cp =sbrk(nu *sizeof(Header));
if(cp == (char*)-1) /*no space at all*/
{
return NULL:
}
up = (Header*) cp;
up->s.size = nu;
free(void *)(up+1));
return freep;
}
sbrk(int n)是系统调用,功能是"return a pointer to n more bytes of storage"
#define NALLOC /*minimun units to request*/
/*morecore ask system for more memory*/
static Header* morecore(unsigned nu)
{
char *cp,*sbrk(int);
Header *up;
if(nu<NALLOC)
{
nu = NALLOC;
}
cp =sbrk(nu *sizeof(Header));
if(cp == (char*)-1) /*no space at all*/
{
return NULL:
}
up = (Header*) cp;
up->s.size = nu;
free(void *)(up+1));
return freep;
}
sbrk(int n)是系统调用,功能是"return a pointer to n more bytes of storage"
#6
学习之。
#7
pf pf,学习
#8
UNIX 系统调用 sbrk (n) 返回的指针指向的空间包含 n 个额外的字节。如果没有空间,那么 sbrk 返回 -1。 ... -1 必须强制转换成 char 类型,以便与返回值相比较。
——摘自 The C Programming Language 中文版,P160,呵呵
也就是说,UNIX 的分配内存函数是 sbrk(n)。
个人以为 Win32 的 HeapCreate/HeapAlloc 双重缓冲更方便,呵呵。不要 malloc 维护一个内存池了。
——摘自 The C Programming Language 中文版,P160,呵呵
也就是说,UNIX 的分配内存函数是 sbrk(n)。
个人以为 Win32 的 HeapCreate/HeapAlloc 双重缓冲更方便,呵呵。不要 malloc 维护一个内存池了。
#9
to 完美废人
你那有sbrk的源代码吗?麻烦贴出来好吗,大家一起学习。谢谢!
你那有sbrk的源代码吗?麻烦贴出来好吗,大家一起学习。谢谢!
#10
interrupt(0x21);
就行了吧~~~
就行了吧~~~