资讯详情

c ++

📅 2026/10/11 6:26:54 | 华诺云谱 👁 阅读
c ++
1.设计类型与定义类型struct class 设计类型并非定义类型***设计类型不分配内存编译器看到这段代码只是在符号表里记下一笔“以后有一种类型叫Student”。不会在内存中划出一块区域来存放数据因为根本还没有数据产生。描述结构告诉编译器这种类型由哪些成员组成占用多少字节成员如何排列。可以重复使用一张图纸类型设计只需要画一次但可以按照它盖无数栋房子定义无数个变量。别名这个过程在 C 标准中更准确的叫法是“类型声明Type Declaration”。***定义类型分配内存编译器看到Student xiaoming;就会去查刚才设计的Student图纸然后真的在内存比如栈区里挖出一块足够放下name和age的空间并把这块空间命名为xiaoming。产生实体这时候图纸变成了真正的房子你可以往里面放数据了比如xiaoming.age 18;。占用资源每定义一个变量就会消耗一份内存。别名这个过程在 C 标准中叫“变量定义Variable Definition”。struct和class在设计类型上有什么区别1.默认的访问权限structpublic classprivate2.默认的继承权限 structpublic classprivateclass完整的面向对象类型能封装数据与行为、控制访问、支持继承与多态struct没有行为、没有封装、没有继承2.define和const的区别#define预处理阶段的文本替换没有类型不安全难调试但效率极高因为直接替换成数字。const编译阶段的只读变量有类型安全可调试在 C 中通常也能享受编译期优化。3.stdout和stderrstdout标准输出流用于程序的正常输出,有缓冲stderr标准错误输出流用于程序的错误信息和诊断信息无缓冲4.寄存器四个通用寄存器X86 32位寄存器宽度 X64 64位X86典型寄存器EAX EBX ECX EDX ESP EBP ESI EDI EIPX64对X86的扩展寄存器前面加RRAX RBX RCX RDX,新增R8~R15八个通用寄存器5.汇编基础指令1.数据搬运指令作用事例mov原操作数复制给目的操作数mov eaxebxlea把内存地址而非地址里的数据加载到寄存器lea eax, [ebx4]push数据压栈push eaxpop数据出栈pop eax****lea eax[ebx4]:给ebx寄存器里的数值加4赋给eax不去访问内存在lea指令里方括号[]失去了“访问内存”的含义变成了纯粹的“数学算式”。mov eax[ebx]去ebx这个数据地址读取数据给eaxmov eaxebx复制ebx的值给eax2.算术运算指令作用示例ADD加法add eax, ebx→eax eax ebxSUB减法sub eax, ebx→eax eax - ebxINC自增 1inc eax→eax eax 1DEC自减 1dec eax→eax eax - 1MUL无符号乘法mul ebx→EDX:EAX EAX * EBXIMUL有符号乘法imul ebxDIV无符号除法div ebx→EAX EDX:EAX / EBXIDIV有符号除法idiv ebxNEG取负求补neg eax→eax -eax3.逻辑运算与位运算指令作用示例AND按位与(两个位都是 1结果才是 1)and eax, 0xFF保留低 8 位OR按位或(有一个位是 1结果就是 1)or eax, 0x01置最低位为1XOR按位异或(相同则为 0不同则为 1)xor eax, eax清零比 mov 快NOT按位取反not eaxSHL逻辑左移shl eax, 1相当于乘 2SHR逻辑右移shr eax, 1相当于无符号除 2SAR算术右移sar eax, 1保留符号位TEST按位与但不保存结果只影响标志位test eax, eax判断 eax 是否为 04.跳转指令作用示例JMP无条件跳转jmp labelJZ / JE为零/相等时跳转jz labelJNZ / JNE不为零/不相等时跳转jnz labelJG / JNLE有符号大于时跳转jg labelJL / JNGE有符号小于时跳转jl labelJA / JNBE无符号大于时跳转ja labelJB / JNAE无符号小于时跳转jb labelLOOP循环ECX 减 1不为 0 则跳转loop label5.函数调用栈帧管理栈帧就是“一个函数在执行时在栈上所占用的那一块专属内存区域”指令作用底层动作call调用函数压入返回地址跳转leave清理栈帧mov esp, ebp; pop ebpret函数返回弹出返回地址到 EIPmy_func: push ebp ; 保存调用者的栈基址 mov ebp, esp ; 设置当前函数的栈基址 sub esp, 0x20 ; 为局部变量分配 32 字节空间 ; ... 函数体代码 ... ; ... 把返回值放到 EAX ... leave ; 清理栈帧等价于 mov esp, ebp; pop ebp ret ; 返回弹出返回地址到 EIP执行流程调用者执行call my_func压入返回地址跳转到my_func。被调用者执行push ebp/mov ebp, esp建立自己的栈帧。执行函数体。被调用者执行leave恢复ESP和EBP。被调用者执行ret弹出返回地址跳回调用者6.esp eipebp寄存器eip指令指针指向下一条要执行的指令地址esp栈顶指针指向当前函数栈帧的顶部ebp栈基址指针指向当前函数栈帧的底部EBP在函数执行期间保持不变作为参照点7.左值右值亡值左值可取地址的值右值不可取地址的值一般也是不可修改的值亡值函数调用表达式计算中有效 具名为左值 不具名为右值//ipaddtostr strtoipadd //ipv4和ipv6的差别 掩码 //printf fprintf打到标准输出流 sprintf存到字符串中返回字符串长度 区别 //scanf fscanf从屏幕获取 sscanf解析字符串的值 区别 //内置类型设计类型栈系统自己管理堆程序员自己管理申请字节谁快多几倍为什么快cc实参给形参赋值从右向左形参后面的先入栈fork父子进程是怎么切换的 函数调用完怎么返回到原位置的 线程之间保护怎么切换的什么时候用进程好什么时候用线程好 现场保护和现场恢复怎么实现的什么是内核态是什么用户态内联函数不需要现场保护和现场恢复不用占用栈空间 加快函数调用速度缺点是展开函数 主函数膨胀用空间换时间优先级低 函数过长或递归函数使用inline不会在调用 点展开宏定义预编译和inline函数编译时进行扩展的区别宏定义的参数不是计算完再赋值为啥叫变元宏指令会有副作用静态链接库 动态链接库clinux后缀名inline函数声明和实现都放头文件不是inline函数就分离声明在头文件实现在源文件
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑