C++随手记-编译与内存相关-创新互联
一、编译与内存相关
A、编译与链接
网页标题:C++随手记-编译与内存相关-创新互联
浏览地址:http://pwwzsj.com/article/dpdisj.html
1、编译过程:
创新互联致力于做网站、成都网站制作,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择创新互联,就选择了安全、稳定、美观的网站建设服务!- 编译预处理:引入头文件、去注释、处理所有的条件编译指令、宏替换等
- 编译:词法分析、语法分析、语义分析、汇编代码生成,并对程序进行优化,最终将
.cpp
文件翻译成.s
的汇编代码 - 汇编:将
.s
翻译成机器指令.o
文件 - 链接:一个程序可能由多个源文件组成,此时存在多个
.o
文件。A文件的函数调用B文件的变量,就需要链接成一个整体。
2、静态链接和动态链接
- 静态链接:代码在生成可执行文件时,将该程序所需要的全部外部调用函数拷贝到最终可执行文件中,该程序被执行时,运行所需要的全部代码都会被装入到进程虚拟地址空间。静态链接库一般以
.a
文件,可以将多个.o
文件连接成一个静态链接库。 - 动态链接:
1、作用域
- 全局变量:全局作用域。只需定义一次,其他文件想要使用需要
extern
关键字再次声明。 - 静态全局变量:文件作用域。不能被
extern
修饰,即使两个文件定义了同名的静态全局变量,他们也是不同变量 - 局部变量:局部作用域。以
{}
为作用域,对作用域外不可见。函数执行结束后,变量被撤销,占用的空间也被收回 - 静态局部变量:局部作用与。只被初始化一次,一直到程序运行结束都存在,但只对作用域内可见
1、CPU在读取内存时不是以字节为单位,而是以机器字长为单位,实际机器字长由CPU总线宽度决定。比如32位CPU,机器字长4字节,数据总线宽度32位,如果该CPU地址总线宽度也是32位,则其可以方位的地址空间为[0,0xFFFFFFFF]
。内存对齐可以:
- 减少CPU访问内存的次数,加大CPU访问内存的吞吐量。
- 某些特定硬件设备只能存取对齐数据,比如CPU中的SIMD,要求内存严格对齐
2、内存对齐的原则
- 结构体变量首地址能够被其最宽的基本类型成员的长度和对齐基数二者中的较小者整除
- 结构体中的static成员变量不占用结构体的空间。因为静态成员变量在程序初始化时就已经在静态存储区分配完成,所有该结构体实例中的静态成员都指向同一个内存区域。
struct st{
char a;
int b;
static double c; // 静态成员
}
cout<< sizeof(st)<< endl; // 8
- 结构体每个成员相对于结构体首地址的偏移量都是该成员大小与对齐基数的较小者的整数倍,如有需要,编译器会在成员间加上填充字节
- 结构体的总大小为结构体中最宽的基本类型成员长度和对齐基数二者中的较小者的整数倍,如有需要,编译器会在最末尾的成员之后加上填充字节
3、指定程序对齐
#pragma pack (x) // 以x的字节单位对齐
struct st{
.......
}
#pragma pack()
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页标题:C++随手记-编译与内存相关-创新互联
浏览地址:http://pwwzsj.com/article/dpdisj.html