首頁  >  文章  >  資料庫  >  内存管理(2)(某培训机构视频笔记)

内存管理(2)(某培训机构视频笔记)

WBOY
WBOY原創
2016-06-07 15:38:411288瀏覽

回顾: 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>
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn