大家好,今天小热关注到一个比较有意思的话题,就是关于alloc_small的问题,于是小编就整理了2个相关介绍alloc_small的解答,让我们一起看看吧。
文章目录:
一、内存管理第三讲笔记 malloc/free(一)
前言
在C语言中,`malloc`与`free`函数作为内存管理的重要工具。`malloc`负责根据所需空间大小调用操作系统API或内部小块内存管理机制,而`free`用于释放内存。操作系统层面的内存管理涉及到独特内存区域的创建和管理,如VC6和VC10中的`SBH`(Small Block Heap)机制。
VC6版本中,`SBH`负责小空间的内存管理,而VC10中这部分功能被整合到了操作系统API中,不再显式存在。
一、VC6与VC10的`malloc`比较
VC6中的`SBH`在VC10中已被整合进`HeapAlloc()`,在不同的编译器版本中,内存管理策略有所调整。
注意:`heap_init`和`ioinit`在VC6与VC10中均存在,但具体实现有所不同。
二、VC6内存分配过程
分析过程从函数调用的顺序开始:
1、`heap_init`初始化内存堆。
`_heap_init(...)`与`__sbh_heap_init()`共同作用,为`SBH`分配特定大小的头部空间,并配置区域,以供应用程序在大小超过预设阈值时使用`HeapAlloc()`。
2、计算并分配实际内存大小。
`_malloc_dbg()`进行`malloc`的调试模式调用,`_heap_alloc_dbg()`调整实际分配的内存大小,并添加调试信息。
`heap_alloc_dbg`调用`_heap_alloc_base()`获取指定大小内存的头部指针,形成链表结构。
`__sbh_alloc_block(...)`为调试器信息包装的数据添加头部和尾部cookie,并调整大小。
`__sbh_alloc_new_region()`开始实际分配内存,并管理内存区域,构建内存管理结构。
三、内存分配与管理
在实际分配内存时,内存被分为`_CrtMemBlockHeader`、`data`和`anotherGap`三个部分,其中`_CrtMemBlockHeader`包含了调试信息和链表指针,以方便内存管理。
`heap_alloc_base()`根据所需调试信息大小计算总内存需求,向上调整至16的倍数。
`__sbh_alloc_new_group()`分配内存,并管理不同大小的内存块,通过`Group`和`ListHead`结构实现内存块的高效管理。
四、内存使用与回收
内存使用时,`ioinit`等函数申请特定大小的内存,根据计算结果选择合适的内存分配策略。内存回收时,通过管理结构确保内存的合理分配和高效利用。
综上所述,`malloc`与`free`通过不同层次的内存管理机制,确保了C语言程序的内存安全与高效使用。
二、#include<alloc.h>
/* alloc.h
memory management functions and variables.
Copyright (c) Borland International 1987,1988
All Rights Reserved.
*/
#if __STDC__ ;标准C
#define _Cdecl ;定义C函数声明
#else
#define _Cdecl cdecl
#endif
#ifndef _STDDEF
#define _STDDEF ;标准定义
#ifndef _PTRDIFF_T
#define _PTRDIFF_T ;指针差
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
;根据内存模式定义指针类型
;实模式下IA-32有6种程序内存模式
;分别是巨(__HUGE__) ,大(__LARGE__),中(__MEDIUM__)
; 小(__SMALL__),微(__TINY__) ,压缩(__COMPACT__)
;对于__HUGE__,__LARGE__,__MEDIUM__ 定义长指针32位
;这是因为这3种类型数据可以存放在多个段
typedef long ptrdiff_t;
#else
typedef int ptrdiff_t;
;定义成短指针,因为数据存在一个段
#endif
#endif
#ifndef _SIZE_T
#define _SIZE_T ;定义偏移类型,无符号int
typedef unsigned size_t;
#endif
#endif
#ifndef NULL ;定义NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL 0
#else
#define NULL 0L
#endif
#endif
int _Cdecl brk (void *addr);
;扩大程序可用数据范围,具体用法不明
;指针addr之前为进程可用范围
;之后为不可用范围(包括指针所指位置)
void *_Cdecl calloc (size_t nitems, size_t size);
;分配数组空间,nitems为数组元素个数,size为元素大小
#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
unsigned long _Cdecl coreleft (void);
#else ;计算剩余可分配空间,具体用法不明
unsigned _Cdecl coreleft (void);
#endif
void _Cdecl free (void *block);
;释放 malloc 分配的内存
void *_Cdecl malloc (size_t size);
;分配连续内存空间,以八字节对齐,另多分配4个字节
void *_Cdecl realloc (void *block, size_t size);
;重新分配内存
void *_Cdecl sbrk (int incr);
;增加进程可用空间,与brk()相对应
#if !__STDC__ ;以上内存分配函数的32位形式
void far * _Cdecl farcalloc (unsigned long nunits, unsigned long unitsz);
unsigned long _Cdecl farcoreleft(void);
void _Cdecl farfree (void far *block);
void far *_Cdecl farmalloc (unsigned long nbytes);
void far *_Cdecl farrealloc (void far *oldblock, unsigned long nbytes);
#endif
到此,以上就是小编对于alloc_small的问题就介绍到这了,希望介绍关于alloc_small的2点解答对大家有用。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。