博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++的内存模型和名称空间
阅读量:6857 次
发布时间:2019-06-26

本文共 1974 字,大约阅读时间需要 6 分钟。

hot3.png

C++的内存模型和名称空间

内存模型

1.存储连续性:变量在内存中的保留的时间长度

     自动存储连续性(自动变量)

          在函数定义中声明的变量。它们在其所属的函数或代码块中创建,在执行完函数或代码块后释放空间。

     静态存储连续性(静态变量)

          在函数定义外和使用关键字static定义的变量。它们在程序整个运行过程中都存在,并且自动初始化为0。

     动态存储连续性(动态变量)

          使用new关键字创建的变量。他们直到使用delete运算符才释放空间。

2.作用域:描述名称在文件的可见范围

     自动变量的作用域是局部的,只在定义自动变量的函数中或代码块中被访问。

     静态变量的作用域:取决于它如何被定义。

     函数作用域:在定义函数的名称空间或类中被访问。   

     类作用域:在类中定义的变量,它们的作用域是整个类。

     名称空间作用域:在名称空间定义的变量,它们的作用域在整个名称空间。

3.链接性:描述名称如何在不同单元间共享

     外部链接性:可在文件间共享。

     内部链接性:只能在定义它的文件或函数中被共享。

变量的链接性

     1.自动变量没有链接性

     2.静态变量的链接性

 int global = 10;               // 外部链接性      static int one_file = 50;   // 内部链接性      void funct1(int n){               static int count = 0;  // 无链接性(作用域局部,只能在函数或代码块中被访问,但一直保留在内存中,只在启动时初始化一次.)          i     nt llama = 0;}

     静态变量外部链接性的使用

     如果要在别的文件使用外部链接性的静态变量,则需要在本文件中使用引用声明(extern关键字)。

     file01.cpp

extern int cats = 20;        // 定义外部变量int dogs = 22;int fileas;

     file02.cpp

extern int cats;             // 引用声明外部变量extern int dogs;

     静态变量内部链接性的使用

     file01.cpp

int num = 10;               // 外部链接性

     file02.cpp

static int num = 20;     // 没有名称冲突,因为这里的num是内部链接性,只能在file02.cpp供该文件中的函数使用

     const变量的链接性

     file01.cpp

const int aaa = 100;       // const变量的链接性是内部的

     file02.cpp

extern const int aaa = 50; // 覆盖默认的内部链接性,成为外部的
函数的链接性

     默认情况下,函数的链接性为外部的。如果添加了static则该函数的链接性为内部。

     内联函数可以定义在头文件中,在头文件中定义的函数自动为内联.


名称空间(namespace)

     为了解决各类库中名字冲突而诞生的。通过定义一种新的声明区域来创建命名的名称空间。

namespace Jack{    // 声明区域    string name;    int age;    string getName(){        return name;    }    struct Hill {};    ....}Jack::name = "jack";          // 访问

using声明和using编译指令

1.using声明使特定的标识符可用.

using Jack::age;

2.using编译指令使整个名称空间可用.

using namespace Jack;

3.避免与全局变量名称冲突

char fetch;namespace Jill{     double fetch;}int main(){     using Jill::fetch;     cin>>fetch;               // Jill::fetch     cin>>::fetch;             // char}

嵌套名称空间

namespace A1{     namespace A2{          string hello;     }}A1::A2::hello="";

未命名的名称空间

1.它可以作为链接性为内部的静态变量的替代品

2.不能显示的使用using编译指令或声明

3.不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。

转载于:https://my.oschina.net/Ccx371161810/blog/423025

你可能感兴趣的文章
性能调优之sar
查看>>
apache 日志中记录代理IP以及真实客户端IP
查看>>
寻找数组中第二大的数_代码实现
查看>>
MySQL5.7-winx64的zip包安装过程
查看>>
windows 7安装时提示gpt分区无法安装windows系统
查看>>
GPT分区不能安装Linux/Redhat 5.x的解决方法
查看>>
我的友情链接
查看>>
运行WordCount报错:java.lang.OutOfMemoryError: Java heap space
查看>>
2条ce1链路捆绑成一条4M的链路,做负载均衡
查看>>
我的友情链接
查看>>
Hadoop序列化与Java序列化
查看>>
三款主流云笔记软件比较
查看>>
梯形的面积可以通过几何画板来计算吗
查看>>
对于异步的理解
查看>>
JQuer的简单应用
查看>>
国产开源敏捷工具-fKanban
查看>>
01:数据结构和算法
查看>>
《人月神话》读后感1
查看>>
华为实习日记——第三十一天
查看>>
centos7/RHEL7下快速搭建DNS域名解析服务器
查看>>