• C++内存模型


    1、存储持续性

    C++使用四种不同方案来存储数据,它们的区别在于数据在内存中保留的时间,也叫做存储持续性

    (1)自动存储持续性

      在函数定义中声明的变量,包括函数参数。

    (2)静态存储持续性

      在函数定义外和使用关键字static定义的变量。它们在程序整个运行过程中都存在。

    (3)线程存储持续性

      在C++11中,如果使用关键字thread_local声明变量,则变量生命期和所属线程一样长。

    (4)动态存储持续性

      使用new运算符分配内存的数据。

    2、作用域和链接性

    作用域描述了名称在文件的多大范围内可见。包括函数定义或者代码块内可见、当前文件内可见和整个程序可见。链接性描述了名称如何在不同单元间共享。链接性为外部的名称可在文件间共享,链接性为内部的名称只能在当前文件中共享。自动变量的名称没有链接性,因为它们不能共享。作用域和链接性的意思一样。

    3、静态存储持续性变量的作用域和链接性

    静态存储持续性地变量在程序运行过程中在内存中都存在,静态变量默认被初始化为0,包括三种作用域和链接性

    (1)外部链接性(作用域为整个程序)

    在函数或者代码块外面声明的变量,也称为外部变量

    (2)内部链接性(作用域为当前文件)

    在函数或者代码块外面声明,并且使用static限定符的变量

    (3)无链接性(作用域为当前函数或者代码块)

    在函数或者代码块内部声明,并且使用static限定符的变量

    4、单定义规则

    同一个变量,只能有一次定义和初始化。C++提供了两种变量声明,一种为定义声明(defining declaration),简称定义,它为变量分配存储空间;一种为引用声明(referencing declaration),简称声明,它不给变量分配存储空间。引用声明使用关键字extern。外部链接性变量可以在头文件中进行声明,在源文件中进行定义和初始化,其他文件只要引用该头文件即可以访问该变量。内部链接性变量一般在源文件中定义变量,但是在头文件中定义变量也不影响,因为它的作用域为当前文件,如果两个源文件都引用该头文件,那么在两个文件中都将分别定义一个变量,分配两块内存。

    5、const外部变量

    默认情况下全局变量的链接性为外部的,加上const修饰符后,链接性为内部的。如果希望const修饰的常量链接性为外部的,则使用extern来修饰,例如extern const int i = 10。和外部变量不同,外部常量定义和声明必须都加extern修饰符。

    6、函数和链接性

    函数的存储持续性为静态的,链接性默认为外部的。可以在源文件中定义函数,在头文件中使用extern声明函数,当然extern可以省略。需要在函数定义和声明添加static关键字将函数的链接性变为内部的。非内联函数默认也要满足单定义规则,内联函数不受这一约束。

    7、语言的链接性

    链接程序要求每个函数都有不同的符号名。在C语言中,一个名称只对应一个函数,很容易实现。一般C语言编译器可能将fun这样的函数翻译为_fun。这种方法被称为C语言链接性。C++语言因为重载的使用,一个名称可以对应多个函数。C++编译器需要执行名称矫正或者名称修饰,为重载函数生成不同的符号名。例如,可能将fun(int)转换为_fun_i,将fun(double,double)转换为_fun_d_d,这种方法被称为C++语言链接性。如果在C++语言中使用C语言编译的库,则因为语言链接性不同,链接器无法寻找正确的函数符号,需要指定链接器按照C语言链接性去寻找函数符号。例如:

    extern "C" void fun(int);

    一般如果编译的C库不仅供C程序调用,也供C++程序使用,可以在C库头文件中添加如下代码

    #ifdef __cplusplus       //如果采用了C++,如下代码使用C编译器
        extern "C" {            //在C语言中添加extern "C"会报错,因为这是C++语言的语法
    #endif
    /*C语言头文件*/
    #ifdef __cplusplus      //结束使用C编译器
        }
    #endif   
  • 相关阅读:
    分位数(quantiles)、Z-score 与 F-score
    学术研究中的 NLP
    学术研究中的 NLP
    国内外免费电子书(数学、算法、图像、深度学习、机器学习)
    国内外免费电子书(数学、算法、图像、深度学习、机器学习)
    中英文对照 —— 缩略词
    内核编译及模块相关命令使用
    UVA 156 (13.08.04)
    hdu3117之矩阵快速幂
    系统运维技巧(三)——利用dd命令临时增加交换分区
  • 原文地址:https://www.cnblogs.com/justkong/p/8776353.html
Copyright © 2020-2023  润新知