结构体类型

《转》__block修饰符

烂漫一生 提交于 2020-02-05 22:05:09
我们知道在Block使用中,Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,我们需要给它附加上 __block 修饰符。 __block 另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上 __block 修饰符。 为什么不使用__block就不能在Block内部修改外部的局部变量? 我们把以下代码通过 clang -rewrite-objc 源代码文件名 重写: int main(int argc, const char * argv[]) { @autoreleasepool { int val = 10; void (^block)(void) = ^{ NSLog(@"%d", val); }; block(); } return 0; } 得到如下代码: struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; int val; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _val, int flags=0) : val(_val) { impl.isa = &

iOS开发之block解析

故事扮演 提交于 2020-02-05 22:04:57
1. block的本质是一个Objective-C的对象,为什么这么说? 在Objective-C中,runtime会在执行时依据对象的isa指针的指向,来度额定这个对象的类型,也能够觉得一个对象,它具有isa指针,就是一个OC对象 2. 你怎么知道block有isa指针呢,我们能够通过clang命令将来看block的实现 //測试代码 int main(int argc, const char * argv[]) { @autoreleasepool { void(^blk)(void)=^{ NSLog(@"hello lx"); }; } return 0; } 转化后:block语法被编译器转化成了以下的结构 struct __main_block_impl_0 { struct __block_impl impl;//block实现的相关信息 struct __main_block_desc_0* Desc;//block的描写叙述信息 __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } };

结构体和类

只谈情不闲聊 提交于 2020-02-05 08:04:21
结构是值类型,但在语法上常常当做类来处理 struct typeNum { public string a="hello"; public string b="world"; } 如果仅需要一个小的数据结构,可以考虑用结构,因为结构在性能上比类略佳。 结构不支持继承,在使用前必须先初始化结构是会影响性能的值类型,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。 正面的影响是为结构分配内存时,速度非常快,因 为它们将内联或者保存在栈中。在结构超出了作用域被删除时,速度也很快。负面影响是,只要把结构作为参数来传递或者把一个结构赋予另一一个结构如 A-B,其 中A和 B是结构),结构的所有内容就被复制,而对于类,则只复制引用。 这样就会有性能损失,根据结构的大小,性能损失也不同。 类和结构体的不同点:   1.关键字不同 一个是class,一个是struct   2.类型不同,一个是引用类型,一个是值类型(存储:一个堆区,一个栈区)。关于值类型和引用类型以及堆与栈详细可见   3.成员不同,结构体没有默认的构造函数(可以添加)和没有析构函数,不可以使用abstract,protected,sealed修饰   4.Struct变量使用完之后就自动解除内存分配,Class实例有垃圾回收机制来保证内存的回收处理   5.继承性。结构不可以继承自另一个结构或被继承

图示/白话 container_of处理流程

有些话、适合烂在心里 提交于 2020-02-05 05:06:08
container_of()宏定义的执行,可以通过结构体成员的地址而得到结构体的首地址,它需要三个参数,第一个参数是一个结构体成员的地址,第二个参数是结构体类型,第三个参数是结构体的成员,其推算的总思路是,获得一个结构体成员的地址,和这个结构体成员相对于首地址的偏移,然后使用结构体成员的地址,减去成员对首地址的偏移,即可得到结构体的首地址。 如此,需要解决两个问题,一是如何得到一个结构体成员的地址,二是如何算出这个成员相对于首地址的偏移。 对于第二个问题,使用了0地址,先把0地址强制转换成指定的结构体类型,即0地址是指定的结构体类型,那么相对于0地址的成员地址就是相对于0地址的偏移地址,因此可以得到成员偏移的长度。offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)就是实现这个功能的宏定义。 对于第一个问题,首先要确定这个结构体成员的类型,采用typeof(结构体成员)的方式获得,然后使用获得的结构体成员的类型定义一个指针,让这个指针指向这个成员的地址,即可获得这个成员的地址,即相当于对这个结构体成员执行了取地址的操作,即typeof( ((type *)0)->member ) *__mptr = (ptr); 的含义。 当这两个条件都达到了,就可以通过相减而获得了结构体的首地址了。 其中,typeof(

9.Go语言基础之结构体

有些话、适合烂在心里 提交于 2020-02-04 20:55:20
Go语言中没有类的概念,也不支持“类”的继承等面向对象的概念。 Go语言中通过结构体的内嵌再配合接口,比面向对象具有更高的扩展性和灵活性。 1.类型别名和自定义类型 1.1自定义类型 在Go语言中有一些基本的数据类型,如string,整型,浮点型,布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。 自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。 //将MyInt定义为int类型 type MyInt int 通过Type关键字的定义,MyInt就是一种新的类型,它具有int的特性。 1.2类型别名 类型别名是Go1.9版本添加的新功能。 类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。就像我们的英文名,乳名,但这些名字都指的是一个人。 type TypeAlias = type 我们之前见过的rune和byte都是类型别名,他们的定义如下: type byte = uint8 type rune = int32 1.3类型定义和类型别名的区别 类型别名与类型定义,表面上看只有一个等号的差异,我们可以通过下面的代码来查看他们的区别。 package main import "fmt" type NewInt int type MyInt = int func main(

container_of宏深度解析

走远了吗. 提交于 2020-02-04 01:24:00
作用: 由结构体中某个元素的指针,推出整个结构体变量的指针。 原型: #define container_of(ptr,type,member) {const typeof(((type*)0)->member)* _myptr=(ptr); (type*)((char*)_myptr-offsetof(type,member));}) 变量分析: ptr指向结构体元素member元素的指针;type为结构体类型;member为结构体中的某个元素;typeof为C语言的关键字,用来由变量得到变量的类型,eg;typeof(a)得到变量a的类型。 typeof(((type*)0)->member)* _myptr=(ptr)类似于(int)* p=(ptr)。 宏解析: 先用typeof得到member元素的类型,定义为一个指针( _myptr);然后用这个指针减去该元素相对于结构体首地址的偏移量,就得到整个结构体变量的首地址了,再把这个地址强制类型转换为type*即可(得到指针)。 举例: # include <stdio.h> struct mystruct { char a ; int b ; short c } ; # define container_of(ptr,type,member) { const typeof ( ( ( type * ) 0 ) ->

Go语言中的结构体

有些话、适合烂在心里 提交于 2020-02-04 00:48:39
Go语言结构体 struct里面可以包含多个字段(属性) struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以嵌套 struct中的所有字段在内存是连续的 结构体是用户单独定义的类型,不能和其他类型进行强制转换 struct 没有构造函数 ,一般可以使用工厂模式来解决这个问题 工厂模式也就是定义一个全局函数,传入一些参数,返回一个结构体 结构体中字段可以没有名字,即 匿名字段 此时如果匿名字段是一个结构,即讲解实现了 继承 struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化 package main import ( "encoding/json" "fmt" ) type Student struct { Name string `json:"student_name"` Age int `json:"age"` Score int `json:"score"` } func main ( ) { var stu Student = Student { Name : "stu01" , Age : 18 , Score : 80 , } // 把这个结构体打包 data , err := json . Marshal ( stu ) if err != nil { fmt

Runtime-iOS运行时基础篇

孤街浪徒 提交于 2020-02-04 00:16:54
转自:https://www.jianshu.com/p/d4b55dae9a0d   本文主要整理了Runtime的相关知识。对于一个iOS开发者来说,掌握Runtime的重要性早已不言而喻。OC能够作为一门优秀的动态特性语言,在其背后默默工作着的就是Runtime。在网上也看过很多资料,最终我还是希望在一些关键的知识点上能够融入自己的理解,从简单的问题出发,一步一步理解和学以致用。 iOS运行时Runtime.png 相关文章:iOS运行时Runtime应用 目录: 一、怎么理解OC是动态语言,Runtime又是什么? 二、理解消息机制的基本原理 三、与Runtime交互的三种方式 四、分析Runtime中的数据结构 五、深入理解Rutime消息发送原理 六、多继承的实现思路:Runtime 七、最后总结 一、怎么理解OC是动态语言,Runtime又是什么? 静态语言 :如C语言,编译阶段就要决定调用哪个函数,如果函数未实现就会编译报错。 动态语言 :如OC语言,编译阶段并不能决定真正调用哪个函数,只要函数声明过即使没有实现也不会报错。 我们常说OC是一门动态语言,就是因为它总是把一些决定性的工作从编译阶段推迟到运行时阶段。OC代码的运行不仅需要编译器,还需要运行时系统(Runtime Sytem)来执行编译后的代码。 Runtime是一套底层纯C语言API

PE文件结构体-IMAGE_DATA_DIRECTORY

懵懂的女人 提交于 2020-02-02 13:31:58
IMAGE_OPTIONAL_HEADER结构体最后一个成员是数组结构,大小为16,每个元素都是一个IMAGE_DATA_DIRECTORY结构体 typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; /**指向某个数据的相对虚拟地址 RAV 偏移0x00**/ DWORD Size; /**某个数据块的大小 偏移0x04**/ } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; 在这个数据目录结构体中只有两个成员 VirtualAddress 和 Size ,这两个成员的含义比较简单,VirtualAddress指定了数据块的相对虚拟地址(RVA)。Size则指定了该数据块的大小,有时并不是该类型数据的总大小,可能只是该类型数据一个数据项的大小。这两个成员(主要是VirtualAddress)成为了定位各种表的关键,所以一定要知道每个数组元素所指向的数据块类型,以下表格就是它的对应关系: 来源: https://www.cnblogs.com/a-s-m/p/12251728.html

结构体 和 类 的区别

喜夏-厌秋 提交于 2020-02-02 09:31:06
1.class 是引用类型, struct 是值类型 2.定义类用 class,定义结构体用 struct 3.结构体中,不能对字段或者属性进行初始化 4.class有默认的无参数的构造函数,但如果显示的定义了一个构造函数,编译器就不会再自动生成隐式的无参数的构造函数了;而struct,无论你是否显示的定义了构造函数,隐式的无参数的构造函数都一致存在 5.struct 不能显示的定义无参数的构造函数 6.在struct中,如果显示定定义了有参数的构造函数,那么必须给所有的字段赋值 7.struct 不能继承结构或者类,但可以实现接口.class 可以继承 类,实现接口,但是不能继承 struct 8.struct 不能定义析构函数,class 可以 9.结构体不能用 abstract,sealed 修饰 来源: https://www.cnblogs.com/refuge/p/8553742.html