设为首页收藏本站 |天气与日历| 2025-04-20 星期日 06:23:00 乙巳(蛇)年 三月廿三 卯时 谷雨
     
切换到窄版

私人站点

 找回密码
 立即注册
搜索
查看: 158|回复: 0

内存管理二

[复制链接]

954

主题

954

帖子

3875

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3875
发表于 2022-3-10 22:17:20 | 显示全部楼层 |阅读模式
回顾:

brk/sbrk
int brk(void *p);
void * sbrk(int);
维护一个位置  brk/sbrk 改变这个位置
  • 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(控制内存的访问/使用文件映射/控制内存的共享)








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|编程站点 ( 冀ICP备2023028127号-2 )|友链申请|

GMT+8, 2025-4-20 06:23 , Processed in 0.073616 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表