回顾:
brk/sbrk
int brk(void *p);
void * sbrk(int);
维护一个位置 brk/sbrk 改变这个位置
补充: 全新的类型
永远记住:C的基本类型就是:整数:(1.2.4),小数(4,8) unsigned signed
所以的全新类型都是使用typedef 重新定义.
新的类型的C的原型.
类型重定义好处:

一. 映射虚拟内存
没有任何额外维护数据的内存分配.
mmap(分配)/unmap(释放)
函数说明:
[C] 纯文本查看 复制代码 void *mmap(
void *start, //指定映射的虚拟地址 如果是0 系统来指定开始位置
size_t length,//映射空间大小 pagesize倍数
int prot,//映射权限 PROT_NONE | PROT_READ PROT_WRITE PROT_EXEC
int flags,//映射方式
int fd,//文件描述符号
offset_t off//文件映射的开始位置(必须是pagesize的倍数)
);

映射方式:
只有文件映射最后两个参数有效
MAP_ANONYMOUS //内存映射方式,不指定就是文件映射.必须指定文件描述符
MAP_SHARED MAP_PRIVATE(二选一)[C++] 纯文本查看 复制代码 #include <unistd.h>
#include <sys/mman.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{ //映射内存
char* p = mmap(
NULL,
getpagesize(),
PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_SHARED,
0, 0
);
* p = 20;
printf("%p\t%d\n", p,*p);
//释放内存
munmap(p, 4096);
return(0);
}
注意:vs2022中 MAP_ANONYMOUS 未指定标识符 的解决办法
项目属性_配置属性_c/c++_所有选项_C语言标准
将C语言标准设置为 C11 (GNU Dialect) (-std=gnu11)
总结:
选择什么样的内存管理方法?
智能指针(指针池)
- STL
- NEW
- malloc(类型和类型.小而多的数据)
- brk/sbrk(同类型的大块数据,动态移动指针)
- mmap/munmap(控制内存的访问/使用文件映射/控制内存的共享)

|