回顾: brk/sbrk int brk(void *p); 改变绝对位置。 void *sbrk(int); 相对改变位置。 维护一个位置。brk/sbrk改变这个位置 补充:全新的类型 c的基本类型就:整数(1,2,4),小数(4,8) 所有全新类型都是使用typedef重新定义,新的类型的c的原型 类型重
回顾:
brk/sbrk
int brk(void *p); 改变绝对位置。
void *sbrk(int); 相对改变位置。
维护一个位置。brk/sbrk改变这个位置
补充:全新的类型
c的基本类型就:整数(1,2,4),小数(4,8)
所有全新类型都是使用typedef重新定义,新的类型的c的原型
类型重定义的好处:
1 维护方便
2 移植
3 容易理解
一 映射虚拟内存
没有任何额外维护数据的内存分配
mmap(分配)/unmap(释放)
1 函数说明
void *mmap(
void *addr, // 指定映射的虚拟地址 0由系统指定位置
size_t length, // 映射空间大小 pagesize倍数
int prot, // 映射权限 PROT_NONE PROT_READ PROT_WRITE PROT_EXEC
int flags, //映射方式 内存映射:匿名映射。 文件映射:映射到某个文件 只有文件映射最后两个参数才有效
int fd, //文件描述符号
off_t offset); // 文件中的映射开始位置 (必须是pagesize的倍数)
MAP_ANONYMOUS
MAP_SHARD MAP_PRIVATE(二选一)
2 案例
#include <unistd.h> #include <sys> #include <stdlib.h> #include <stdio.h> int main() { int *p = mmap( NULL, getpagesize(), PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED, 0,0); *p = 20; *(p+1) = 30; *(p+2) = 30; printf("%d\n",p[2]); munmap(p, 4096); return 0; } </stdio.h></stdlib.h></sys></unistd.h>
3 总结
选择什么样的内存管理办法?
智能指针(指针池)
STL
new
malloc(小而多数据)
brk/sbrk(同类型大块数据,动态移动指针)
mmap/munmap(控制内存访问/使用文件映射/控制内存共享)
4 应用
二 编译工具与动态库
1、gcc
-o 输出文件名
-O -O0 -O1 -O2 -O3 编译优化
-g -g0 -g1 -g2 -g3 产生调试信息
-Wall 显示所有警告 -Werror 把警告当错误
-w 关闭警告
-c 只编译不链接
-E 预编译
-S 汇编
-D 在命令行定义宏
在代码中定义宏,在命令行定义宏
-x 指定编译语言类型
-std = C89
-std = C99
编译过程: -E -c -S 自动调用连接器
连接器 ld
补充:.c .cpp .h .hpp .o .a .so .i 预编译文件 .s 汇编文件
三、静态库的编译
1、编译过程(*.a achieve)
编译成目标文件
-static
gcc -c -static 代码文件.c
归档成静态库
ar 工具 -r -t 静态库文件 被归档文件
nm工具(查看函数符号表) 静态库或者动态库或者目标文件或者执行文件
gcc 代码 静态库
使用静态库完成如下程序:
输入菱形半径,打印菱形 输入整数封装成IOTool 菱形的打印封装成Graphics
#include <stdio.h> int inputInt(const char * info) { int r; printf("%s", info); scanf("%d", &r); return r; }</stdio.h>
#include <stdio.h> void diamond(int r) { int x, y; for(y = 0; y <br> <img src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20131210191558218%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjAxMDA4Nw%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FCenter&refer=http%3A%2F%2Fblog.csdn.net%2Fu012010087%2Farticle%2Fdetails%2F17245485" alt="内存管理(2)(某培训机构视频笔记)" ><br> <img src="/inc/test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20131210192123046%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjAxMDA4Nw%3D%3D%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FCenter&refer=http%3A%2F%2Fblog.csdn.net%2Fu012010087%2Farticle%2Fdetails%2F17245485" alt="内存管理(2)(某培训机构视频笔记)" ><br> <p> 四、动态库的编译<br> </p> </stdio.h>