码迷,mamicode.com
首页 > 编程语言 > 详细

【C++Primer Chapter9】 内存模型和名称空间(2)

时间:2020-06-07 15:09:49      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:gre   chapter   har   strcpy   另一个   能力   函数调用   pre   style   

1. 存储说明符和cv-限定符

  • auto  
  • register
  • static
  • extern
  • mutable
  • const
  • volatile

2. auto 自动变量。

3. register 寄存器变量。

4. static 静态变量,用于作用域为整个文件的声明时,表示内部连接性;用于局部声明时,便是局部变量的存储持续性为静态的。

5. extern 表明是引用声明,引用其他地方定义的变量。

6. mutable 指出即使结构体(或类)变量为 const,被关键词 mutable 修饰的成员也可以被修改。

struct data{
    char name[30];
    mutable int accesses;
};
const data veep = {"Claybourne Clodde", 0};
strcpy(veep.name, "Joye Joux");  //invalid
veep.acesses++;  //valid

7. const 内存被初始化后,程序便不能对其进行修改。

//NOTE1:const 修饰的全局变量的链接性为内部的。(即,在C++看来,全局const定义就像使用了static存储说明符)

//file1
#include <iostream>
using namespace std;

const int a = 10;  //内部链接性

void show();
int main(){
    cout << a << " " << &a << endl;
    show();
    return 0;
}

//file2 
#include <iostream>
using namespace std;

const int a = 20;  //内部链接性

void show(){
    cout << a << " " << &a << endl;
}

/*OUTPUT
10 0x4b902c
20 0x4b9024
*/

//NOTE2:若希望某个常量的链接性为外部的,则可以使用关键字 extern 覆盖默认的内部链接性,这种情况下所有使用该常量的文件都要使用 extern 来引用声明它,只能在其中一个文件初始化该变量,且之后该变量不可修改。

//file1
#include <iostream>
using namespace std;

extern const int a = 10; //外部链接性

void show();
int main(){
    cout << a << " " << &a << endl;
    show();
    return 0;
}

//file2 
#include <iostream>
using namespace std;

extern const int a;  //外部链接性
//extern const int a = 20; invalid initialize

void show(){
    cout << a << " " << &a << endl;
}

/*OUTPUT
10 0x4b9028
10 0x4b9028
*/

8. volatile 即使程序代码没有对内存单元进行修改,其值也可能发生变化。该关键字的作用是为了改善编译器的优化能力。

 A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided.

 //NOTE1:volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统,硬件或者其他线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。

//NOTE2:一个参数可以同时被关键字 const 和 volatile 修饰。 const修饰只是表明不能被程序修改,但是可以被硬件修改,因此也可以在需要时用 volatile 修饰。

//NOTE3:

下面是volatile变量的几个例子:

1) 并行设备的硬件寄存器(如:状态寄存器)

2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3) 多线程应用中被几个任务共享的变量

9. 函数的链接性

所有函数的存储持续性都自动为静态的。默认情况下函数的链接性为外部的。可以显式使用extern关键字修饰函数表明该函数是在另一个文件中定义的。

可以使用关键字 static 将函数的链接性改为内部的。函数原型和定义中都需要static修饰。

10. 语言链接性

由于C++函数可以重载,C++编译器会执行名称矫正或名称修饰。连接程序寻找与C++函数调用匹配的函数时使用的方法与C语言不同。可以在函数原型中指出要是用的约定:

extern "C" void func(int);
extern "C++" void func2(int);
extern void func3(int); //默认使用C++约定查找名称

名称空间

 

【C++Primer Chapter9】 内存模型和名称空间(2)

标签:gre   chapter   har   strcpy   另一个   能力   函数调用   pre   style   

原文地址:https://www.cnblogs.com/tristatl/p/13060395.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!