.data存放已初始化但初始化不为0的数据
.bss存放未初始化或初始化为0的数据
强弱符号
强符号:已初始化的全局变量
弱符号:未初始化的全局变量
规则:
1、两强符号——重定义错误
2、一强一弱,选强符号
3、两弱符号,针对编译器不同选择不同
函数堆栈调用:
move 移值 lea 移地址
四个寄存器:eax ebx ecx edx
ebp 栈底指针寄存器 esp 栈顶指针寄存器 pc 下一行指令寄存器
栈:函数活动所需要的空间 ; 栈帧:一个函数所需要的空间
1、被调用函数用完成后退回到调用方栈帧的原因
进入被调用栈后,压入了调用方ebp的值
2、被调用函数调用完成后怎么知道沿下一行指令继续执行
函数的调用时压入下一行指令地址
3、形参有无开辟内存,谁开辟的
形参有开辟内存,调用方开辟且清理的
调用约定:1、函数的符号生成 2、入栈顺序 3、形参的开辟和清理方式
c的标准调用约定 __cdecl 调用方开辟调用方清理
windows的标准调用约定__stdcall 调用方开辟 被调用方清理
快速调用约定:__fastcall 前两个实参 调用不开辟形参内存,第三个参数起__stdcall调用
c++类成员方法的调用约定:__thiscall
函数的默认值:
1、自右向左依次赋值,自左向右匹配
2、默认值不能重复赋值
3、一般给在声明上
函数的重载三要素:
1、同名
2、形参不同:(1)形参类型不同(2)形参的个数不同(3)形参的顺序不同
3、同作用域
inline函数:在函数的调用点直接展开代码
inline函数和普通函数的区别:
普通函数有开栈和清栈 ,inline函数无清栈开栈
inline函数占据空间庞大,以空间换时间
执行开销<调用开销 可以用inline函数
执行开销>调用开销 不建议用inline函数
inline函数和宏的区别:
inline:编译 有类型检查和安全检查
宏:预编译 无类型检查与安全检查
inline函数的注意事项:
1、inline函数一般写在头文件下
2、inline函数只在relese版本下生效
3、给编译器的一个建议,是否展开由编译器决定
4、inline是基于实现的不是基于声明的