C++学习(二)内存模型和名称空间

1.头文件管理

在同一文件中只能将同一头文件包含一次,解决此问题可使用(#ifndef
#endif).
编译:把源文件中的源代码翻译成机器语言,保存到目标文件中。如果编译通过,就会把CPP转换成OBJ文件。

2.C++(c++1)内存模型:

C分为四个区:堆,栈,静态全局变量区,常量区

C++内存分为5个区域(堆栈全常代 ):

堆 heap :
由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete)。如果程序员没有释放掉,在程序结束时OS会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露”

栈 stack :
是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变量、函数参数。
存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,这些数据也就自动释放了。

全局/静态存储区 (.bss段和.data段) :
全局和静态变量被分配到同一块内存中。在C语言中,未初始化的放在.bss段中,初始化的放在.data段中;在C++里则不区分了。

常量存储区 (.rodata段) :
存放常量,不允许修改(通过非正当手段也可以修改)

代码区 (.text段) :
存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)

四个存储方案:
(解释下 )链接性:默认情况下,函数的链接性是外部的,即可以在 文件间共享;如果使用关键字static将函数的链接性设置为内部,使之只能在一个文件使用。

(1)自动存储持续性:
即可理解为平常在函数内定义的变量,就是我们称之为局部变量。定义在函数中,或者定义在块(就是用{ }内)中的变量,作用域为局部,没有链接性。
它的生命周期只限于函数内或者块内,随着在函数内定义变量,此变量获得内存,他的生命周期从这里开始,直到函数调用结束,变量释放内存,而消亡。
(2)静态存储持续性:
静态存储持续性分为外部链接性,内部链接性,无链接性三种。外部链接性,就是平时我们定义的全局变。定义在所有函数前面,且没有static,作用域(可在其他文件中使用这个变量,另一个文件使用,需用extern关键字声明它)。内部链接性,也是定义在所有函数的前面(只能在当前这个文件中使用),但是有static。无链接性 在函数中或者块中定义,作用域也是限于这个范围,但是他有别与局部变量,他不会随着函数调用的,变量的内存释放。所以静态存储的变量在整个程序执行期间一直存在。
(3)线程存储持续性:随着多核处理器的发展,这些cpu可同时处理多个任务,这让程序能够将计算放在并行处理的不同线程中。变量使用关键字thread_local声明,则生命周期与所属线程一样长。
(4)动态存储持续性:使用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止,(自由存储区或堆来存储数据)。

double *p1,*p2;
p1=new double[N];
p2=new double[N];

3.名称空间

namespace Jack
{
double pail;
void fetch;
int pail;
struct well{};

}

namespace Jill
{
double buck(double n){};
void fetch;
int pail;
struct Hill{};

}
  • 访问给定名称空间的名称

     Jack::pail=12.4;
     Jack::fetch();
    
  • 使用using声明和using 编译命令

     using Jack::fetch;//using 声明
    

	using声明使一个名称可用,而using编译指令使所有的名称都可用。using编译指令由名称空间名和它前面的关键字using namespace组成,它使名称空间中的所有名称都可用。而不需要作用域解析符:

	using namespace jack;//using 编译

在全局声明区域中使用using编译指令,将使该名称空间的名称全局可用。

  • 但是使用using声明的话,增加名称冲突的可能性

     using Jack::pail;
     using Jill::pail;
     pail=4;//错误
    

    事实上,编译器不允许同时使用两个using声明,因为会导致二义性。

猜你喜欢

转载自blog.csdn.net/qq_32900237/article/details/88787907
今日推荐