C++ Day04 基础语法B 内联函数、const、AT&T汇编、大小端模式

127 阅读3分钟
1. 为什么要使用内联函数?什么时候使用内联函数?内联函数的本质是什么?
  • 为什么使用:因为函数调用需要开闭栈空间,合理使用内联函数,可以减少栈空间的开闭,提升程序性能。
  • 什么时候使用:①函数代码体积不大 ②频繁调用的函数
  • 本质是什么:编译器会把函数体直接放在调用处,从而减少开辟栈空间。
2. 内联函数和宏的相同点、不同点?
  • 相同点:都可以减少函数调用的开销
  • 不同点:对比宏,内联函数多了语法检测和函数特性,代码更容易分析和调试
3. const 的含义?以及下面代码的含义(最经典的总结是什么)?
  • const 是常量的意思,被其修饰的变量不可修改;如果修饰的是类、结构体(的指针),其成员也不可以更改。
  • 分析下面 5 个指针分别是什么含义?
int age = 20;
int height = 175;
const int *p0 = &age;   // 能编译 :p0 = &height; 不能编译:*p0 = 10;
int const *p1 = &age;   // 能编译 :p1 = &height; 不能编译:*p1 = 10;
int * const p2 = &age;  // 能编译 :*p2 = 10; 不能编译:p2 = &height;
const int * const p3 = &age;    //不能编译:p3 = &height; *p3 = 10;
int const * const p4 = &age;    //不能编译:p4 = &height; *p4 = 10;
  • 最经典的总结:const 修饰的是其右边的内容
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,操作的是地址所存放的数据