学习笔记

C++PrimerPlus内存模型和名称空间
Publish: 2018/7/23   

单独编译

组织程序的策略

头文件管理

在同一个文件中只能将同一个头文件包含一次。如何避免多次包含同一个文件?

#ifndef COORDIN_H_//COORDIN是文件名,规范命名格式
#define COORDIN_H_

#endif

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

存储持续性

C++11采用4种不同的方案来存储数据,区别是数据保留在内存中的时间

作用域和链接
自动存储持续性

自动变量和栈
栈式LIFO(后进先出)的,即最后加入到栈中的变量首先被弹出
程序使用两个指针来跟踪栈,一个指针指向栈底——栈的开始位置,另一个指针指向栈顶——下一个可用内存单元

寄存器变量
register int count_fast;
register是由C语言引入的,它建议编译器使用CPU寄存器来存储自动变量,旨在提高访问变量的速度,但在C++11,这种提示作用失去了,只是显示地指出变量是自动的

静态持续变量

静态存储持续性变量提供了3种链接性

——5种变量存储方式——

存储描述 持 续 性 作 用 域 链 接 性 如何声明
自动 自动 代码块 在代码块中
寄存器 自动 代码块 在代码块中,使用关键字register
静态,无链接性 静态 代码块 在代码块中,使用关键字static
静态,外部链接性 静态 文件 外部 不在任何函数内
静态,内部链接性 静态 文件 内部 不在任何函数内,使用关键字static
静态持续性、外部链接性

链接性为外部的变量简称外部变量,它们的存储持续性为静态,作用域为整个文件

“单定义规则”:变量只能有一次定义,C++提供了两种变量声明

//file01.cpp
int dogs=20;

//file02.cpp
extern int dogs;

C++提供了作用域解析运算符::,放在变量名前,表示使用变量的全局版本::dogs

说明符和限定符

存储说明符:

struct data
{
    char name[30];
    mutable int accesses;
};
const data veep={"Clodde",0};
strcpy(veep.name,"Joye");//not allowed
veep.accesses++;         //allowed

cv-限定符

函数和链接性
语言链接性

可以使用函数原型来指出要使用的约定

extern "C" void spiff(int);   //use C protocol for name look-up
extern void spiff(int);       //use C++ protocol for name look-up
extern "C++" void spiff(int); //use C++ protocol for name look-up
动态分配
void * operator new(std::size_t);
void operator delete(void *);

void * operator new[](std::size_t);
void operator delete[](void *);

常规分配内存与指定内存的区别

调用接收两个参数的new()函数

int *pi=new int;             //invokes new(sizeof(int))
int *p2=new(buffer) int;     //invokes new(sizeof(int),buffer)
int *p3=new(buffer) int[40]; //invokes new(40*sizeof(int),buffer)

定位new函数不可替换,但可重载,第一个参数是std:size_t,指定了请求的字节数

名称空间

提供声明名称的区域,一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西
使用关键字namespace创建名称空间

namespace Jack{
    double pail;
    void fetch();
}
Jack::fetch();//通过作用域解析运算符::访问给定名称空间中的名称

using声明和using编译指令

嵌套名称空间

using编译指令是可传递的

name space elements
{
    namespace fire
    {
        int flame;
    }
}

namespace myth
{
    using Jill::fetch;
    using namespace elements;
    using std::cout;
}

std::cin>>myth::fetch;
//如果没有冲突的局部变量
using namespace myth;
cin>>fetch;
未命名名称空间
namespace 
{
    int ice;
}

该名称空间中声明的名称的潜在作用域为:从声明点到该声明区域末尾,可替代链接性为内部的静态变量

使用名称空间指导原则



← Java并发编程实战-9活跃性、性能与测试_避免活跃性危险 Java并发编程实战-5基础知识_小结_并发技巧清单 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel