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

来源:互联网 发布:淘宝客服沟通表情包 编辑:程序博客网 时间:2024/05/18 02:34
C++内存模型和名称空间
    
    一、单独编译
1、头文件中常包含的内容:
函数原型,使用#define或const定义的符号常量,结构声明,类声明,模板声明,内联函数。
2、unix系统中编译多个c++程序的步骤:
1)编译命令:如 cc file1.cpp file2.cpp
2)预处理器将包含的文件与源代码文件合并。生成临时文件temp1.cpp  temp2.cpp.
3)编译器创建每个源代码文件的目标代码文件:file1.o file2.o
4)连接程序将目标代码文件、库文件和启动代码合并,生成可执行文件a.out

二、存储持续性、作用域和链接性

1、存储持续性。
1)在函数中声明的变量,包括函数参数,存储持续性是自动的。在代码块开始执行时创建,代码块结束时消失。
2)静态持续性。在函数定义外的变量或用static定义的变量。在整个程序运行中都存在。
3)线程持续性。用thread_local声明的额,声明周期与线程一样长。‘
4)动态持续性。用new分配的内存一直存在,直到用delete释放或程序结束。
//register,static,extern,threa_local,mutable为说明符
//const,volatile为限定符

#include "iostream"
#include "stdafx.h"

int aa;    //静态持续变量,外部链接性,其他文件可访问,生命周期与程序一致
static int saa;//静态持续变量,内部链接性,其他文件不可访问,生命周期与程序一致
const int caa=100;//常量,静态持续变量,内部链接性,其他文件不可访问,生命周期与程序一致
//通常把cosnt int caa=100;放在头文件中,其他文件引用了改头文件,就可访问了。
extern int m;//extern 为引用声明,引用m在其他地方的定义
extern const int states=19;//此常量具有外部链接性。
struct data
{
char name[30];
mutable int acc;//结构变量或类变量为const,acc的值也能被修改。
};


int main(int argc, char * argv[])
{
volatile int *mn;//告诉编译器,mn的值即使没对内存单元进行修改,也可能发生变化,如指针指向某个硬件的位置,因此不要对mn进行优化。
//thread_local  y;y的持续性随线程


const data dd;
dd.acc=100;//可修改mutable说明符修饰的acc


register int x;//指定将x存入寄存器中,访问变量的速度提高.
int a; //自动存储持续性,随代码块一起消失,无链接性
static int sa;//静态持续变量,代码块消失后还存在
const int ca=100;//局部常量,作用域为代码块,随代码块一起消失,无链接性
if(true)
{
int b; //自动存储持续性,随代码块一起消失,无链接性
static int sb;//静态持续变量,代码块消失后还存在,无链接性,其他代码块不能使用
const int cb=100;//局部常量,作用域为代码块,随代码块一起消失,无链接性
}
//std::cout << sb<< std::endl;不可使用sb


int* p=new int(98);//用new关键字分配的内存不受作用于域和链接性规则控制,由delete释放。
delete(p);
return 0;
}
void function()//函数默认存储性都为自动静态的,链接性为外部的。
{
int d; //自动存储持续性,随代码块一起消失,无链接性
static int sd;//静态持续变量,代码块消失后还存在,无链接性,其他代码块不能使用
const int cd=100;//局部常量,作用域为代码块,随代码块一起消失,无链接性
}


static void function2()//static使得函数的链接性为内部的
{
}
extern void function3()//extren指明函数在其他文件中被定义的。
{
}
extern "C" void f(); //使用C语言链接性(不同的编译器可能将函数名翻译成不同的名字。)
extern "C++" void f2();//使用c++链接性,默认使用c++链接性
三、名称空间
下面这种用法不推荐:因为一般来说,使用using 声明比using 编译指令更安全!
#include "iostream'
using namespace std;
int main()
{
}
这种方法略好:
#include "iostream'
using namespace std;
int main()
{
using namespace std;
}
最好使用这种,用什么就引用什么:
#include "iostream'
using std::cin;
using std::cout;
using std::endl;
int main()
{
int x;cin>>x;cout << x << endl;
}
自定义名称空间:
namespace myth
{
int x;
double y;
struct Hill {...}
}
使用时:using namespace myth;









0 0
原创粉丝点击