c primer plus 内存模型和命名空间1

1.合理的程序分类
1)头文件:包含结构声明和使用这些结构的函数原型;
2)源代码文件:包含与结构有关的函数的代码;
3)源代码文件:包含调用上述函数的代码。

tip:1)头文件中通常包含 函数原型、#define或const定义的符号常量、结构声明、类声明、模板声明、内联函数。
2)包含自写的头文件时,使用“coordin.h”,而不是。因为文件名包含在尖括号时,c++将在存储标准文件的主机系统的文件系统中查找;但如果文件名包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录,这会影响时间快慢。

2.好图:unix系统中的程序组合步骤
在这里插入图片描述
总结:*1 unix命令:CC file1.cpp file2.cpp;
*2 预处理器处理头文件;*3 编译器创建目标文件(temp1.cpp->file1.o); *4链接程序将目标代码.o文件、库代码和启动代码合并生成可执行文件a.out。

3.避免头文件多次定义

#ifndef TRY_H_
#define TRY_H_
......
#endif

4.确保所有对象文件或者库都是由一个编译器生成的。

5.存储性,作用域与链接
1)自动存储持续性
见如下代码:

#include<iostream>
using namespace std;
void oil(int x);
int main()
{
	int texas = 31;
	int year = 2011;
	cout << "&texas: " << &texas << endl;
	cout << "&years: " << &year << endl;
	
	oil(texas);
	cout << "&texas: " << &texas << endl;
	cout << "&years: " << &year << endl;
}

void oil(int x)
{
	int texas = 5;
	cout << "&texas2: " << &texas << endl;
	{
		int texas = 113;
		cout << "&texas3: " << &texas << endl;
	}
}

函数中定义的变量
存储持续性:自动,函数结束时自动释放内存
作用域:局部
链接性:无
tip:如果在函数中添加作用域,定义同名变量,之前定义的变量会被隐藏,等到该作用域结束后变量会重新变得可见。

2)静态持续变量
存储持续性:静态(固定分配内存,不会在作用域结束撤销)

全局变量

作用域:整个文件 链接性: 外部
由于c++的单定义规则,即变量只能有一次定义,所以除了一次定义外,其它只能是声明。区别就是,定义会给变量分配存储空间,而声明不会。

//file01.cpp 
extern int cats = 20; //定义,因为cats被初始化了
//file02.cpp
extern int cats; //声明,因为没有初始化

如果在程序的函数中再次定义 int cats = 30;
那么在该函数的作用域中,cats=30会隐藏之前的全局变量cats,但可以使用::cats来访问之前定义的全局变量。

局部变量

作用域:该文件 链接性:内部
static将定义的同名变量限定在单文件中,并且该静态变量将隐藏常规外部变量。

//file01.cpp 
int errors = 20; //定义,因为cats被初始化了
//file02.cpp
static int errors = 5; //声明,因为没有初始化
cout << errors;

最后输出是5。

静态局部变量

作用域:该文件 链接性:无链接性

#include<iostream>
using namespace std;
void strinput(const char* str);
int main()
{
	int texas = 3;
	char input[10];
	while (texas--) {
		cout << "please enter" << (texas+1) << endl;
		cin.get(input, 10);
		cin.ignore(numeric_limits<streamsize>::max(), '\n');
		strinput(input);
	}
}

void strinput(const char* str)
{
	int count = 0;
	static int total = 0;
	while (*str++)
	{
		count++;
	}
	total += count;
	cout << count << " : " << total<<endl;
}

在这里插入图片描述
根据显示可以看到被定义为函数内部静态变量的total,即使在函数结束之后也会保存之前的值,等函数下次调用的时候使用。

tip:在使用cin.get(input,10)输入整行的时候,一种处理换行符的方法:
cin.ignore(numeric_limits::max(), ‘\n’);

6.说明符和限定符

说明符

auto:自动推断类型; register:显示指出变量是自动存储的;
static;extern;thread_local 线程;

cv-限定符

const :const在定义全局变量的时候和static是一样的效果,将链接性变为内部链接。
volatile: 即使程序代码没有对内存单元进行修改,其值也可能发生变化。避免程序进行将变量放入寄存器这种优化,直接从内存中提取。

mutable
在这里插入图片描述
如图,虽然定义的变量veep是const,不可修改的,但是由于accesses是mutable,所以仍然可以将accesses++。

7.语言链接性
C中,一个名称对应一个函数,如spiff翻译为_spiff。
C++中,由于有重载函数,可能将spiff(int)翻译为_spiff_i,spiff(double,double)翻译为_spiff_d_d。

可以用extern “C”void spiff(int);在C++文件中使用C语言链接性,这样可以保证某些C库的正常使用。

8.动态分配内存
定义: void *operator new(std::size_t);
void operator new ;
一个是分配数,一个分配数组。
在这里插入图片描述
定位new
1) p2 = new(buffer1) chaff
就是从buffer1中分配内存给chaff。
通常来说直接new chaff将在堆上直接创建内存空间,如果指定buffer
1就是按buffer1数组的首地址存储,可以使用
new(buffer+N
sizeof(double))来存储空间。

2)定位new不可使用delete。
3)定位new必须接受两个参数,字节数和地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rookiexxj01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值