1. 为什么要使用内联函数?什么时候使用内联函数?内联函数的本质是什么?
- 为什么使用:因为函数调用需要开闭栈空间,合理使用内联函数,可以减少栈空间的开闭,提升程序性能。
- 什么时候使用:①函数代码体积不大 ②频繁调用的函数
- 本质是什么:
编译器
会把函数体
直接放在调用处
,从而减少开辟栈空间。
2. 内联函数和宏的相同点、不同点?
- 相同点:都可以减少函数调用的开销
- 不同点:对比宏,内联函数多了语法检测和函数特性,代码更容易分析和调试
3. const 的含义?以及下面代码的含义(最经典的总结是什么)?
const
是常量的意思,被其修饰的变量不可修改;如果修饰的是类、结构体(的指针),其成员也不可以更改。
- 分析下面 5 个指针分别是什么含义?
int age = 20
int height = 175
const int *p0 = &age
int const *p1 = &age
int * const p2 = &age
const int * const p3 = &age
int const * const p4 = &age
4. 为什么通常情况下 release的包
会比 debug模式的包
小呢?
- release 模式下会对代码进行优化,比如 ①对简单的方法进行内联操作,减少函数调用,从而减少栈空间的开闭,也会减少汇编指令数目 ② 还有一些简单的计算,编译器会算好了,直接写入代码中,而不是等到
5. AT&T 常用寄存器有哪些?(了解即可)
%rax, %rbx, %rcx, %rdx, %rsi, %rdi, %rbp, %rsp
%r8, %r9, %r10, %r11, %r12, %r13, %r14, %r15
6. 上述常用寄存器中,哪个做为函数的返回值?哪个指向栈顶?哪些用于存放函数参数
- %rax 做为函数的返回值(同 8086 汇编的 ax)
- %rsp 指向栈顶(同 8086 汇编的 ss:sp)
- %rdi, %rsi, %rdx, %rcx, %r8, %r9 等寄存器用于存放函数参数
7. AT&T 表示字节数的单位?
- b:b=byte,8bit
- s:s=short,16bit
- l:l=long,32bit
- q:q=quad,64bit
8. 内存地址的最小单位是什么?
9. 给定一个内存地址 0x1122,如果占四个字节,是往高地址吞并吗?
- 是往高地址吞并:0x1122,0x1123,0x1124,0x1125
10. CPU 大小端模式中的比较常见的是哪种?牢记的口诀是什么?每个字节对应16进制
和2进制
分别多少位?(这个还没完全记住,笨啊)
- 现在 CPU 基本上都是
小端模式
- 口诀:
高高低低
;高字节放高地址,低字节放低地址。
- 16进制:2 位;二进制:8 位;
11. lea 和 mov 两个汇编指令的区别?
- lea:load effective address,操作的是地址
- mov:move,操作的是地址所存放的数据