首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

swift底层探索 01 - 类初始化&类结构swift底层探索 01 - 类初始化&类结构

探索swift可以通过:源码调试,Sil文件,xcode断点调试这些方式来进行探索,除Sil文件这种方式其他的都会在本文中出现。OC底层探索01-找到底层探索的钥匙会有解释。...探索路径同样是参考oc的探索路径,先从类开始。 类初始化 1. 使用Xcodel断点调试 ? 创建一个简单的类,开启汇编断点 ?...在进行类创建,源码调试的时候发现swift的类结构是这样的。和oc比起来是有一些不同的。我们换种方式看看. 2. lldb ?...指针可以强转则表示内部结构是相同的,我们可以转换角度去查看ClassMetadata....只有kind有点不一致,其实也可以看做是isa,都是指向元类 元类结构图 ? swift类结构.png

87330

Swift 中的反射 Mirror

对于非customMirror的统一使用Mirror(internalReflecting:)进行初始化。 关于customMirror的补充,摘抄自 swiftGG Mirror 的工作原理。...我们知道Swift是一门静态语言,那么在底层是如何实现的获取对应的属性值的呢?又或者说Swift的反射特性是如何实现的呢?下面我们通过对Mirror底层源码的探索来寻找答案。...当Swift调用_getChildCount时,C++会用包含Swift值指针的value,包含类型参数type,包含类型响应的泛型的T的函数参数来调用此函数。...AccessFunctionPtr是该类型元数据访问函数的指针 Fields是一个指向该类型的字段描述符的指针 3.3.6 TargetContextDescriptor 接下来我们再看看TargetTypeContextDescriptor...和属性个数创建一个buffer数组指针 接下来我们就可以从数组中取出每个属性的偏移值 然后取出结构体实例p的内存地址 然后按照buffer数组中的偏移值进行偏移,重绑定为属性的类型 最后就可以打印出属性值了

5.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Apple 操作系统可执行文件 Mach-O

    通过学习 Mach-O,可以了解应用程序是如何加载到系统的,如何执行的。还能了解符号查找,函数调用堆栈符号化等。更重要的是能够了解如何设计数据结构,这对于日后开发生涯的收益是长期的。...对于 Mach-O,你一定不陌生,但是对于它内部逻辑你一定会好奇,比如它是怎么构建出来的,组织方式如何,怎么加载的,如何工作,谁让它工作的,怎样导入和导出符号的。...那么 Swift 语言代码构建的 Mach-O 是怎样的呢? 使用我做启动优化时用 Swift 写的工具 MethodTraceAnalyze 看下内容有什么。...在 TEXT Segment 的 text Section 里会创建一个调用帧堆栈,进行函数调用,callq printf 函数前会用到 L.str(%rip),L.str 标签会指向字符串,leaq...节点导出信息后,类型信息类型使用0x3对标志进行位掩码获得。

    2.9K10

    【C++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )

    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 得出结论 , C 语言的 隐式类型转换 , 不能进行 指针类型的转换 ; 代码示例 : #include...message : 与指向的类型无关; // 强制转换要求 reinterpret_cast、C 样式强制转换或函数样式强制转换 p2 = p1; // 控制台暂停 , 按任意键继续向后执行...- C++ 重新解释类型转换 reinterpret_cast ( 转换成功 ) 使用 重新解释类型转换 reinterpret_cast , 将 char* 类型指针 强制 重新解释称 int* 类型的指针...; // 使用 C++ 重新解释类型转换 reinterpret_cast // 将 char* 类型指针 强制 重新解释称 int* 类型的指针 p2 = reinterpret_cast的指针 p2 = reinterpret_cast(p1); // cout 会按照变量类型 对变量进行输出 // 输出 char* 类型指针 与 输出 int* 类型指针 输出结果不同

    60410

    【C++从小白到大牛】C++的隐式和显示类型转换基础知识讲解

    ,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。...4.1static_cast static_cast对应之前的隐式类型转换,以前的隐式类型转换也能玩,但是建议使用static_cast 但它不能用于两个不相关的类型进行转换 int main() {...下面代码中使用static_cast会报错,因为整形转换成指针是强制类型转换,而static_cast对应的是隐式类型转换,所以我们就要使用reinterpret_cast进行强制类型转换 int main...编译器默认将const属性的值放在寄存器里面,这里在内存里面确实将a改成了3,但是在寄存器里面仍然是2,监视窗口是从内存的角度看的,但是编译器是从寄存器里面取的a,因此结果一个是2,一个是3 如何解决呢...,转回子类,是安全的 // pa指向父类对象,转回子类,是不安全的,存在越界的风险问题 // 不安全 //B* pb = (B*)pa; // pa指向子类对象,转回子类,正常转换 /

    13510

    【C++】类型转换 ④ ( 子类 和 父类 之间的类型转换 - 动态类型转换 dynamic_cast )

    | 指针类型数据转换 ) 分析了 指针数据类型的转换 , 在 C 语言环境下 , 可以使用显示强制类型转换 , 在 C++ 环境中只能使用 重新解释类型转换 reinterpret_cast ; 本篇博客中..., 分析 C++ 环境下 使用 各种方式 进行 父类 和 子类 类型之间的转换 , 推荐使用 动态类型转换 dynamic_cast ; 一、子类 和 父类 之间的类型转换 - 动态类型转换 dynamic_cast...其中进行了 隐式类型转换 ; Son son; // 创建父类指针 , 直接让父类指针指向子类对象 // 不会报错 , 但是这么做有一定的风险 Father* pFather = NULL;..., 避免出现更大的错误 ; 下面的代码中 , 使用取地址运算符 &son 获取 的 Son* 类型的 指针 , 将其使用 静态类型转换 static_cast 转为 Father* 类型的指针 , 在...C++ 编译器编译阶段 , 会对类型进行检测 , 如果通过检测 , 则可以编译成功 , 如果类型错误 , 则会出现编译时报错的情况 ; Son son; // 创建父类指针 , 直接让父类指针指向子类对象

    59110

    C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

    在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。...如果没有virtual方法进行下行转换(指针或引用)会直接报错 const_cast 常量指针被转化成非常量的指针,并且仍然指向原来的对象; 常量引用被转换成非常量的引用,并且仍然指向原来的对象; const_cast...const int a=10; int *p=const_cast(&a); //p和a指向同一块内存地址 *p = 100; //修改*p,但a=10,*p=100 reinterpret_cast...(重解释转换)几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;随意的转换编译都会通过,但是不安全的转换运行时会异常 错误的使用reinterpret_cast很容易导致程序的不安全,只有将转换后的类型值转换回到其原始类型...,这样才是正确使用reinterpret_cast方式。

    3.6K10

    适合具备 C 语言基础的 C++ 入门教程(八)

    ,相比于之前那张图,这张图增加了类的信息这一属性,图示如下: [image-20210220212322874] 也就是说类中存在一个指针,这个指针不仅指向了虚函数表,而且指向了类信息,通过指针指向的类信息...而且通过上述的打印信息,我们可以知道,类中指针指向的类信息不仅包含其所述的类而且包含其继承关系这个信息,不然也就不会打印出This human is chinese了。...上述的是将指针进行动态转换的一个例子,那么如果是使用引用呢,如何进行转换,代码如下所示: void test_eating(Human& h) { Englishman& pe = dynamic_cast...:指针转换时,如果转换不成功,进行判断就可以避免系统崩溃,但是引用不行,如果引用转换不成功,引用不能够指向一个不存在的实体,那么就必然导致系统崩溃。...进行上行转换(把子类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。

    37220

    static_cast, dynamic_cast, reinterpret_cast, const_cast区别

    ,所以x相当于父类中的i,y相当于父类中的j,*x相当于*i,但i是float型变量(初始化为100),不是地址,所以出错,如果程序员正是鲁莽地对这个地址指向的内存进行写入操作,那将可能会破坏系统程序,...值得一说的是,不安全的转换不一定会导致程序出错,比如一些窄化转换在很多场合都会被频繁地使用,前提是程序员足够小心以防止数据溢出;下行转换关键看其“本质”是什么,比如一个父类指针指向子类,再将这个父类指针转成子类指针...从提示信息里可以看到,编译器说如果需要这种强制转换,要使用reinterpret_cast(稍候会说)或者C风格的两种转换。...因为指向对象的本质是子类,转换的结果使子类指针指向子类,天经地义;第二个转换是不安全的,因为指向对象的本质是父类,“指鹿为马”或指向不存在的空间很可能发生!...,且在下行转换时要求基类是多态的,如果发现下行转换不安全,dynamic_cast返回一个null指针,dynamic_cast总是认为void*之间的转换是安全的;reinterpret_cast可以对无关类指针进行转换

    85820

    适合具备 C 语言基础的 C++ 教程(八)

    image-20210220212322874 也就是说类中存在一个指针,这个指针不仅指向了虚函数表,而且指向了类信息,通过指针指向的类信息,我们可以知道当前这个对象是属于哪个类的,而且也能够知道当前这个类的继承信息...,换言之,在使用 dynamic_cast进行类型转换的时候,类必须具有虚函数。...上述的是将指针进行动态转换的一个例子,那么如果是使用引用呢,如何进行转换,代码如下所示: void test_eating(Human& h) { Englishman& pe = dynamic_cast...进行判断就可以避免系统崩溃,但是引用不行,如果引用转换不成功,引用不能够指向一个不存在的实体,那么就必然导致系统崩溃。...进行上行转换(把子类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。

    40320

    C++的四种强制转换

    比如一个库函数导出的是double型数据,而我们使用该数据的函数的参数要求是整型,于是我们就需要对其进行转换。反之亦然。 整型和指针相互转换。...无论指针在被创建后如何转换,其指向的依旧是初始时new出来的对象——可以见得A区域中的指针都指向了Parent类对象(Parent Pointer),而B区域中的指针都指向了Child类的对象(Child...根据我们之前介绍的C++对象模型的知识,我们可以知道pChild指针仍然指向的是一个Parent对象。...所以很多人建议,如果在能明确转换安全的场景下,不要使用dynamic_cast方法进行转换,而是使用static_cast,以免进行一些不必要的运行时计算。...如果能明确转换是安全的,建议使用static_cast方法(不使用reinterpret_cast是因为它还没体现出C++的特性)。

    2.3K30

    C++中的四种类型转换运算符

    但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。...reinterpret_cast 关键字reinterpret 是“重新解释”的意思,顾名思义,reinterpret_cast 这种转换仅仅是对二进制位的重新解释,不会借助已有的转换规则对数据进行调整...对于情况②,pd 指向的是整型变量 n,并没有指向一个 Derived 类的对象,在使用 dynamic_cast 进行类型转换时也没有检查这一点,而是将 pd 的值直接赋给了 pb(这里并不需要调整偏移量...”起来,从而形成一个继承链(Inheritance Chain),也就是如下图所示的样子:当使用 dynamic_cast 对指针进行类型转换时,程序会先找到该指针指向的对象,再根据对象找到当前类(指针指向的对象所属的类...本例中的情况②,pa 指向的对象是 D 类型的,pa、pb、pc 都是 D 的基类的指针,所以它们都可以指向 D 类型的对象,dynamic_cast 只是让不同的基类指针指向同一个派生类对象罢了。

    29920

    【c++】类型转换

    属性,这时候就可以通过使用指针来修改a的值了。...如果父类的指针(或引用)指向的是一个子类对象,那么将其转换为子类的指针(或引用)则是安全的,没有问题 使用C强制类型转换向下转型是不安全的,因为此时无论父类的指针(或引用)指向的是父类对象还是子类对象都会进行转换...使用dynamic_cast向下转型是安全的,如果父类的指针(或引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针...:用于相近类型的类型之间进行转化,如int与double,编译器隐式执行的任何类型都可用static_cast reinterpret_cast:用于两个不相关类型之间的转换 const_cast:...用于删除变量的const属性,可用进行修改 dynamic_cast:用于安全地将父类的指针(引用)转换成子类的指针(引用)

    21720

    js引擎v8源码分析之Handle(基于v8 0.1.5)

    Handle是使用v8的时候很重要的一个概念和类。他本质是堆对象的封装。我们通过Handle管理真正的对象,而不是直接操作对象。Handle在v8中有两个实现。一个是对外使用的一个是内部使用的。...,就是对用户定义的对象指针进行封装。...this是指向当前对象的指针,*this是当前对象,**this是返回val_的值,看重载运算符*的实现 *that是val_的值 */ template ...,即val_是null if (that.IsEmpty()) return Handle(); // *that得到指向handle管理的对象的指针,转成T类型的对象,转成底层对象是类型...再来例假ToLocal函数的逻辑。 ? 在这里插入图片描述 我们对着图来理解ToLocal,我们知道obj.location()返回的是指针,指向保存了对象地址的内存地址。

    1.1K10

    C++:16---强制类型转换和类型转换

    type是转换的目标类型 避免强制类型转换 强制类型转换干扰了正常的类型检查,所以强烈建议程序员避免使用强制类型转换 这个建议对于reinterpret_cast尤其使用,因为此类类型转换总是充满了风险...(cp); 三、reinterpret_cast 功能:通常为运算对象的位模式提供较低层次上的重新解释 例如将一个pointer-to-int转换成一个int 使用reinterpret_cast...要想安全地使用reinterpret_cast必须对设计的类型和编译器实现转换的过程都非常了解, 演示案例 例如有下面的转换 int *ip;char *pc = reinterpret_cast指针类型的dynamic_cast 假设Base含有虚函数,且Derived是Base的公有派生类 如果有一个指向Base的指针bp,则我们可以在运行时将它转换成指向Derived的指针。...,失败返回0 if (Derived *dp = dynamic_cast(bp)) { //使用dp指向的Derived对象 } else { //使用bp指向的Base

    2K20

    C++高级主题系列篇

    2)reinterpret_cast reinterpret_cast 用于: 各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。...const string* 4) dynamic_cast 用 reinterpret_cast 可以将多态基类(包含虚函数的基类)的指针强制转换为派生类的指针,但不检查转换后的指针是否确实指向一个派生类对象...C++ 的解决办法是:dynamic_cast 在进行引用的强制转换时,如果发现转换不安全,就会拋出一个异常,通过处理异常,就能发现不安全的转换 3.智能指针 实现原理: 只要将 new 运算符返回的指针...该 shared_ptr 对象能像指针 p —样使用,即假设托管 p 的 shared_ptr 对象叫作 ptr,那么 *ptr 就是 p 指向的对象。...将指向普通局部变量、全局变量的指针交给 shared_ptr 托管,编译时不会有问题,但程序运行时会出错,因为不能析构一个并没有指向动态分配的内存空间的指针。

    46920

    C++继承、虚函数、RTTI、友元类、异常处理

    SuperClass * s = new SubClass(); delete s; //SuperClass destructor 对于new出来的堆对象进行delete删除时,只调用了指针类型对应的析构函数...我们先看看以前的强制类型转换 long a = 10l; int * b = (int *) (&a); 这样可以将long类型指针强制转为int类型指针,但是这种转化方式是直接更改编译器对该内存空间的读取方式...),可以则传递该对象地址/转化后的引用,否则返回空指针(对于引用类型则是抛出异常) ,要向下转化要求传入参数的类型对应的类中需要有虚函数,否则编译出错,因为虚方法表里包含了类型信息type_info,向下转型需要使用...并且如果向下转型是错误的,也不会报错,static_cast与强制转化类似,将当前引用/指向的内存空间作为转化后的类型来用,这会导致一些不可知的错误,如读取从成员变量所对应的空间是别的用途或者未初始化的...reinterpret_cast与static_cast类似,也是没有检查的转化,唯一区别是,reinterpret_cast是按照二进制来解释,也就是说,你甚至可以把对象类型cast为整形(因为按照二进制来解释

    80510

    C++中四种类型转换以及const_cast是否能改变常量的问题

    (cast away the constness) const_cast一般用于指针或者引用 使用const_cast去除const限定的目的不是为了修改它的内容 使用const_cast去除const...int *ip char *pc = reinterpret_cast(ip); // 程序员需要记得pc所指向的真实对象是int型,并非字符串。...// 如果将pc当作字符指针进行操作,可能会造成运行时错误 // 如int len = strlen(pc); 多重继承时reinterpret_cast不安全。...dynamic_cast(expr) 执行“安全向下”转型操作,也就是说支持运行时识别指针或所指向的对象,这是唯一个无法用旧式语来进行的转型操作。...,如果程序员不注意而去修改了它会报错,现在我们利用const_cast去除了常量性,然后通过指针和引用对其进行了修改,所以通过指针打印或者引用传参的时候就能看出其内存确实变化了,但为了保护val这个变量本来的

    1.4K100

    C++补充知识&C++11及其特性

    (变量和其对应的地址对不上了,该变量指向的那个地址所存的内容被覆盖了)-个人理解) 若返回静态变量或全局变量 可以成为其他引用的初始值。 即可作为右值使用,也可以作为左值使用。...失败返回null,成功返回正常cast后的对象指针。 ( 看该父类是否真正指向该子类(因为有多个子类。))...在去掉常量限定符之前,保证指针所指向的内存可被修改,不能修改则会引起异常。...类型转换使用建议 static_cast静态类型转换,编译的时c++编译器会做编译时的类型检查;隐式转换;基本类型转换,父子类之间合理转换 若不同类型之间,进行强制类型转换,用reinterpret_cast...因C++编译器在编译检查一般都能通过;C语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast() 进行强制类型解释**。

    40510

    C++ const_cast static_cast dynamic_cast reinterpret_cast

    ,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的多态性跟程序运行时的状态也有关系, 所以不能完全的使用传统的转换方式来替代。...从这个方面来看,似乎dynamic_cast又和reinterpret_cast是一致的,但实际上,它们还是存在着很大的差别。...reinterpret_cast运算符是用来处理无关类型之间的转换;它会产生一个新的值,这个值会有与原始参数(expressoin)有完全相同的比特位。...从指针类型到一个足够大的整数类型 从整数类型或者枚举类型到指针类型 从一个指向函数的指针到另一个不同类型的指向函数的指针 从一个指向对象的指针到另一个不同类型的指向对象的指针 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针...从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针 void reinterpretcast() { Parent *b = new(std::nothrow) Parent;

    51671
    领券