C++学习随笔之六:内存管理和命名空间

1.单独编译:跟C语言一样,C++也允许甚至鼓励程序员将组件函数放在独立的文件中。

2.程序结构:包括三部分:
    头文件:包含结构声明和使用这些结构的函数的声明
    源代码文件:包含与结构有关的函数的代码
    源代码文件:包含调用与结构相关的函数的代码
  头文件常包含的内容如下:
    (1)函数原型
    (2)使用#define或const定义的符号常量
    (3)结构声明
    (4)类声明
    (5)模板声明
    (6)内联声明
3.include头文件 尖括号和双引号的区别:采用尖括号,则C++编译器将在存储标准头文件主机系统的文件系统中查找;如果采用双引号,则编译器将首先查找当前工作目录或源代码目录(或其他目录,这取决于编译器),若没有在那里找到头文件,则再在标准位置查找。
3.存储持续性、作用域和链接性:
    自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。他们在程序开始执行其所属的函数或代码块时被创建,在执行完函数    
    或代码块时,他们使用的内存被自动释放。
    静态存储持续性:在函数定义外定义的变量或是用static定义的变量的存储持续性都为静态的。它们在整个程序运行中都存在。
    动态存储持续性:用new操作符分配的内存将一直存在,直到用delete将其释放或者程序结束为止。这种内存的存储持续性为动态的。又称为自由存储。
    作用域:描述文件在多大范围内可见。
    链接性:描述了名称如何在不同内存间共享。链接性为外部的名称可在文件间共享,链接性为内部的名称只能由一个文件中的函数共享。自动变量的名称没
    有链接性,因为它们不能共享。
    寄存器变量:用register声明的局部变量.寄存器变量存储在cpu寄存器中,所以不能用取址操作符&对其进行取址操作。当然也是没有链接性的(因为没有    
    (使用内存)。
    静态持续变量:初始化时,如果没有显示的对其初始化,则编译器把它设置为0。
    (1)要想创建链接性为外部的静态持续变量,必须在代码块外面声明它
    (2)要想创建链接性为内部的静态持续变量,必须在在代码块外面声明它,并使用static限定符
    (3)要想创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static限定符
    代码示例:
     ...
    int global = 100;            //static duration ,external linkage
    static onefile = 50;        //static duration,internal linkage
    int main()
    {
        ...
        ...
    }
    void func(int n)
    {
        static int count =0;    //static duration,no linkage
        int limit=0;
        ...
    }

    所有的静态持续变量都有以下两个初始化特征:
    (1)未初始化的变量的所有位都设置为0
    (2)只能使用常量表达式来初始化静态变量
   5种变量存储方式表格如下:
    

4.说明符和限定符:
    存储说明符(storage class specifier):包括:auto、register、static、extern和mutable。
    mutable关键字表明,即使结构或类变量为const,其某个成员也可以被修改。例如:
    struct data
    {
        char name[30];
        mutable int accesses;
        ...
    }
    const data veep = {"caizhiming",0,...};
    strcpy(veep.name,"caizhiming2");//not allowed,这个是不允许的
    veep.accesses++; // allowed,这个是运行被修改的。
    cv-限定符(const-qualifier):包括:const和volatile
    volatile关键字表明,即使程序代码没有对内存单元进行修改,其值也可能发生变化,即表示该变量是易变的。
5.布局new操作符:它让你指定要使用的位置。程序员可能使用这种特性来其内存管理规程或处理需要通过特定地址进行访问的硬件。
    要使用new布局特性,首先需要包含头文件new,它提供这种版本的new操作符的原型;然后将new操作符用于提供所需地址的参数。除需地址指定参数
    外,句法与常规new操作符相同。
    代码示例:
    #include<new>
    struct chaff
    {
        char dross[20];
        int slag;
    };
    char buffer1[50];
    char buffer2[500];
    int main()
    {
        chaf *p1,*p2;
        int *p3,*p4;
        //常规new操作符
        p1=new chaff;
        p3=new int[20];
        //布局new操作符
        p2=new (buffer1)chaff;
        p3=new (buffer2) int[20];
    }
原文地址:https://www.cnblogs.com/JczmDeveloper/p/2964805.html