C++内存模型和名称空间
参考书籍:C++ Primer Plus
现在是学java的,c++只用过c部分和stl写算法,不过学校面向对象设计要用C++,看书时发现C++中的static和java中含义相差很多,做一下学习记录。
单独编译
头文件
用于包含结构声明和使用这些结构的函数原型。头文件中常包含的内容:
- 函数原型。
#define 或const 声明的常量- 结构声明,类声明。
- 模板声明
- 内联函数
示例
头文件:
//my_head.h
#ifndef MY_HEAD_
#define MY_HEAD_
#include<iostream>
#include<string>
struct Person
{
std::string sex;
int age;
};
void PersonToString (Person person);
#endif
/*
关于#ifndef MY_HEAD_
#define MY_HEAD_
#endif
用于避免重复包含头文件,编译器首次遇到该文件没有定义MY_HEAD_,进行编译,再次遇到MY_HEAD_已定义,则会跳到#endif之后。
*/
测试文件:
test1.cc
#include "my_head.h"
#include<iostream>
void PersonToString (Person person) {
std::cout<<person.age<<" "<<person.sex<<'\n';
}
test2.cc
#include "my_head.h"
int main() {
Person person;
std::cin>>person.age>>person.sex;
PersonToString(person);
}
编译运行:
g++ ./test1.cc ./test2.cc -o test
./test
存储持续性,作用域,链接性
持续存储性
C++中一般使用4种不同的方案存储数据,这些方案的区别在于数据保留在内存中的时间。
1.自动存储持续性:
? 在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。它们在程序开始执行其所属的函数或者代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放。
C++中有两种存储持续性为自动的变量:自动变量、寄存器变量(不常用)。
2.静态存储持续性变量:
? 在函数定义外的变量和使用关键字static定义的变量。它们在程序整个运行过程中都存在。C++中有3中存储持续性为静态的变量。静态无链接性、静态内部链接性、静态外部链接性。
3.动态存储持续性:
? 用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或者程序结束为止。这种内存的存储持续性为动态,有时候被称为自由存储或者堆。
4.线程存储持续性(C++11)
使用thread_local 声明的变量生命周期和所属线程一致。
作用域
全局在整个文件有效,局部在代码块内有效等。
链接性
内部链接性:只能在同一文件内使用
外部链接性:可以在不同文件中使用
存储描述 | 持续性 | 作用域 | 链接性 | 如何声明 |
---|
自动 | 自动 | 代码块 | 无 | 在代码块中 | 静态,无链接性 | 静态 | 代码块 | 无 | 在代码块中,使用关键字satic | 静态,外部链接性 | 静态 | 文件 | 外部 | 不在任何函数内 | 静态,内部链接性 | 静态 | 文件 | 内部 | 不在任何函数内,使用关键字static |
杂记
关于extern与头文件
https://www.runoob.com/w3cnote/extern-head-h-different.html
|