栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

OC/C++ 学习记录随笔

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OC/C++ 学习记录随笔

编译步骤:

hello.c -> 预编译 -> hello.i -> 编译 -> hello.s -> 汇编 -> hello.o -> 链接 -> 可执行文件
  1. 预编译会对 预编译伪指令(一般以 # 打头,且前面只能出现空白字符)进行处理后 生成中间文件作为编译器的输入。

    • #include (头文件的所有内容都会最终合并到某一个或几个源文件中,将所有头文件递归展开后形成的源文件叫做编译单元)
    • #define (一般是用对应文本替换)#define 只是简单替换,不做语法检查。(检查留个编译器进行)
    • #ifdef
    • #pragma
    • 构串操作符(# ##), #(变量 生成 字符串), ##(字符串生成变量)
    • __LINE__ __FILE__ 等
    • 删除所有注释
  2. 分别对最小编译单元进行编译(以单个头文件所递归包含的所有文件)

  • 语法分析:
  • 语义分析:
  • 中间代码生成
  1. 汇编:待写入
  2. 链接:对各个编译单元进行整合,并且链接动态库
  • 用户程序调用库(头文件和二进制库组成的库中)接口。连接器会从库中提取相应代码,并和用户程序连接生成可执行文件或动态连接库文件。

运行时: 待写入

长表达式拆分需要在低优先级处拆分为多行,运算符放在新行之首(以示凸出)
  if (aaaaaaa > bbbbbbbbbbbb)
  && (ccccccccc > ddddddddd)
  && (eeeeeeeee > fffffffff)
{
  pass
}
推荐 以行为为中心 的版式(ADT/UDT)即将public成员写在前面

不推荐 以数据为中心 的版式, 即将private 写在前面

c++ 对 c的最根本改变就是把函数放到了结构当中,从而产生了C++类 动态特性 VS 静态特性
  • 静态特性: 程序在编译期就能确定下来的就能确定
  • 动态特性: 不是静态特性
  • 动态特性是面向对象语言最强大的功能之一, 因为支持可扩展性, 而可扩展性是程序最重要的目标之一。
动态特性:
  • C++:C++虚函数(多态确定调用哪个基类的方法)、 抽象基类(纯虚函数的基类)、 动态绑定、 运行时多态

    • 抽象基类:主要用于接口与实现分离,是彻底的封装,创建子类的实例,用基类的对象地址去对外暴露访问。(只发行头文件和二进制文件,保密)(tip: 基类的析构必须是虚析构,否则不能析构子类)
    • 基类: 析构函数 必须为虚函数,不然如果子类转基类后,析构不会进入子类的析构函数
    • 多态类: 每一个具有虚函数的类叫多态类(虚函数是自己加的或者继承的)。 具体看# 虚函数表Vtable和 Vptr 一节

    不要用数组来直接存放多态对象,而是存放基类指针或者基类的智能指针。 因为存放直接多态对象,会导致每次数组下标查找的是+sizeof(基类的)内存,导致第二个及以后的地址错位。

  • OC: 动态类型(id)、多态绑定([obj msgSend])、 多态加载(图片2x3x替换,动态加方法和变量)

虚函数表Vtable和 Vptr
  • 每一个多态类都有一个或多个 vtable 和 vptr。
  • 每一个多态类都有一个虚函数表(vtable),存放着这个类所有的虚函数地址及该类的信息。
  • vptr隐含的指针成员(指向当前类的虚函数表)。
  • 派生类vtable中所对应的虚函数的位置和基类的位置一样,当前新增的虚函数加到vtable的最后。(这样保持派生类的vtable布局的兼容)
  • vtable 和 vptr 必须在init方法的最开始隐式创建并vptr指向vtable。
  • 基类调用虚函数的伪代码:(*(p->_vptr[slotNum]))(p, arg-list); p:基类指针, vptr: 指p指向的对象的隐含指针, slotNum: 调用的虚函数在vtable中的编号(编译时就确定下来的)

OC Alloc Init New
  • alloc 开辟内存,绑定指针isa
  • init return(id)self,工厂构造方法,工厂设计,给开发者初始化数据提供重写入口
内存检测
  • 僵尸对象zombie object :已经被系统回收的内存,但是没有置空, 随时可能被其他申请和覆盖.
  • 内存,进程分别有虚拟页面,在去访问物理内存。只有活跃内存加载到物理内存。ios每页为16k,mac和linux为4k
  • 虚拟内存,解决了安全问题和内存不够用,因为不能直接访问,而且不会全部加载
  • 缺页异常,页面置换, ios软件被杀死,点开重启
对象class的内存映像分布
  • 成员变量: 用户内存区(包括OC的isa, C++的_vptr)
  • 方法(函数): 包括static函数, 代码段(待写入 判断是不是)
  • 其他static变量: 程序静态数据区
    因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针
struct sizeof

存储变量时地址要求对齐,编译器在编译程序时会遵循两条原则:

  • 规则一:结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
  • 规则二:结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
struct stru1
{
  char b;  //start address is 0
  short s;  //start address is 2 注意这里是2 不是1(根据规则一)
  int a;  //start address is 0
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/396163.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号