zoukankan      html  css  js  c++  java
  • 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   
  • 相关阅读:
    This counter can increment, decrement or skip ahead by an arbitrary amount
    LUT4/MUXF5/MUXF6 logic : Multiplexer 8:1
    synthesisable VHDL for a fixed ratio frequency divider
    Bucket Brigade FIFO SRL16E ( VHDL )
    srl16e fifo verilog
    DualPort Block RAM with Two Write Ports and Bytewide Write Enable in ReadFirst Mode
    Parametrilayze based on SRL16 shift register FIFO
    stm32 spi sdcard fatfs
    SPI bus master for System09 (2)
    SQLSERVER中的自旋锁
  • 原文地址:https://www.cnblogs.com/justkong/p/8776353.html
Copyright © 2011-2022 走看看