结构体类型

OC-Block的本质

给你一囗甜甜゛ 提交于 2020-01-28 05:19:15
1.block的本质 block其实就是封装了函数调用以及环境变量调用的对象。 2.block的定义 return_type (^blockName)(parameters) 3.block的本质结构 新建工程,在main.m中添加如下的代码: int age = 10; void (^blockame)(void) = ^{ NSLog(@"logBlock = %d", age); }; blockame(); 用命令行将main.m转成c++的语言,如下: xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m 生成的main.cpp打开,查看如下: 从上图可以看出,c++把block转成了__main_block_impl_0 这种结构体。 C++命名block是有格式的,格式如下:__XXX类名_block定义所在的方法名_block_impl_0 ,与block相关的结构体命名大致都类似 。 __main_block_impl_0 结构体定义如下: 其中, __main_block_impl_0 这个结构体有三个属性:__block_impl结构体类型的 impl、__main_block_desc_0结构类型的desc,还有外部获取到的变量 age。从定义中可知:把fp赋值给了impl的FuncPtr

值类型和引用类型的深层理解

陌路散爱 提交于 2020-01-27 09:14:40
引言 山重水复疑无路,柳暗花明又一村,越探究越接近事物的本质。最近在学习原型模式(Prototype)时,发现原型模式本质就是对一个类原始数据的克隆,但在学习深拷贝和浅拷贝时又发现与值类型和引用类型有着千丝万缕的联系。回想好久都没有温习基础,于是就整理了值类型和引用类型的随笔,本文内容比较基础,对于想继续深入研究的同学可以查看IL更深入探究。 1.值类型(ValueType) 值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。 值类型的变量直接存储数据,分配在托管栈中。变量会在创建它们的方法返回时自动释放,例如在一个方法中声明Char型的变量name=’C’,当实例化它的方法结束时,name变量在栈上占用的内存就会自动释放 C#的所有值类型均隐式派生自System.ValueType。 结构体:struct(直接派生于System.ValueType)。 数值类型:整型,sbyte(System.SByte的别 名),short(System.Int16),int(System.Int32),long(System.Int64),byte(System.Byte),ushort(System.UInt16),uint(System.UInt32),ulong(System.UInt64),char(System.Char)。 浮点型:float

C语言基础----结构体

我与影子孤独终老i 提交于 2020-01-27 08:12:55
结构体 结构体 结构体的作用 结构体的定义和使用 结构体的定义方式 引用结构体变量中的成员 typedef的定义和使用 内存对齐 结构体总大小为最大对齐数的整数倍 位域 枚举 联合 结构体 结构体的作用 数组: 具有相同类型的数据的集合 结构体: 存储不同类型的数据项 单一的数据类型无法满足特定的需求,数据类型的集合体:结构体 出现了 结构体的定义和使用 结构体的定义方式 结构体 是一种 自定义数据类型 struct 用来定义一个类型 结构体的 定义方式 : struct 结构体名字 { //成员变量 }; 定义结构体后再定义变量 //例1: struct stu { int id //学号 char name[20]; //名字 }; struct stu stu1,*pStu,arr[10]; //定义变量 在定义结构体的同时定义变量 //例2: struct stu { int id; //学号 char name[20]; //名字 }stu1,*pStu,arr[10]; //定义变量 引用结构体变量中的成员 点运算符 访问结构体的成员变量 . //对例2的结构体变量进行访问 stu1.id=1001; strcpy(stu1.name,"小明同学"); arr[1].id=1002; strcpy(arr[1].name,"梦凡老师"); 箭头运算符 访问结构体成员变量

thrift简单示例 (基于C++)

旧时模样 提交于 2020-01-27 02:43:37
这个thrift的简单示例, 来源于官网 (http://thrift.apache.org/tutorial/cpp), 因为我觉得官网的例子已经很简单了, 所以没有写新的示例, 关于安装的教程, 可以参考https://www.cnblogs.com/albizzia/p/10838646.html, 关于thrift文件的语法, 可以参考: https://www.cnblogs.com/albizzia/p/10838646.html. thrift文件 首先给出shared.thrift文件的定义: /** * 这个Thrift文件包含一些共享定义 */ namespace cpp shared struct SharedStruct { 1: i32 key 2: string value } service SharedService { SharedStruct getStruct(1: i32 key) } 然后给出tutorial.thrift的定义: /** * Thrift引用其他thrift文件, 这些文件可以从当前目录中找到, 或者使用-I的编译器参数指示. * 引入的thrift文件中的对象, 使用被引入thrift文件的名字作为前缀, 例如shared.SharedStruct. */include "shared.thrift"namespace

性能优化之二:结构体类型的性能优化

时间秒杀一切 提交于 2020-01-26 22:18:47
C#里结构体是值类型,其局部变量的空间分配在栈上。很多同学喜欢用它,是因为它的存储密度高、分配和回收成本非常低。 但是前几天在查热点的时候,却碰到结构体的性能非常慢,甚至远低于把同样数据结构做成的引用类型。下文对这个问题做了些简化,方便大家理解。 代码分析 优化前的源代码示例: //结构体声明 public struct Point2D { public int X { get; set; } public int Y { get; set; } } var target = new Point2D() { X = 99, Y = 100 }; //热点语句,points 是一个有几百万元素的链表: foreach(var item in point2Ds) { if (item.Equals(target)) return target; } 优化方法很简单,就是在Point2D的结构体声明中,加一个手写的Equals方法: //优化后: public struct Point2D { public int X { get; set; } public int Y { get; set; } public bool Equals(Point2D obj) { return obj.X == this.X && obj.Y == this.Y; } } 性能测试

x264阅读记录-1

*爱你&永不变心* 提交于 2020-01-26 17:41:48
x264阅读记录-1 采用x264版本是x264-snapshot-20060316-2245。 1. main函数 x264的main函数位于x264.c中,下面是main函数调用情况: (1)_setmode函数和_fileno函数 这两个函数是微软提供的两个库函数。 _setmode函数位于io.h文件中,主要作用是设置特定模式匹配的文件。http://msdn.microsoft.com/zh-cn/library/vstudio/tw4k6df8.aspx _fileno函数位于stdio.h文件中,用于获取文件流所对应的描述符。http://msdn.microsoft.com/zh-cn/library/vstudio/zs6wbdhx.aspx 下面的语句主要实现的是将Windows下默认的Text模式,按需要设置为BINARY模式, _setmode ( _fileno ( stdin ), _O_BINARY ); 还有一点,这个语句位于预编译命令中,其中涉及到一个宏 _MSC_VER。这个宏是VC编译环境的预定义宏,主要是计算为编译器的主版本号和次版本号元素。 专业数字为句点分隔的版本号的第一个元素,并且该次版本号是第二个元素。 因此,如果Visual C++编译器的版本号为15.00.20706.01,_MSC_VER 宏计算结果为1500。在 Visual

Linux网络驱动整理

大城市里の小女人 提交于 2020-01-26 00:54:26
网络设备是 完成用户数据包在网络媒介上发送和接收的设备 ,它将上层协议传递下来的数据包以 特定的媒介访问控制方式 进行发送,并将接收到的数据包传递给上层协议。应用程序使用 套接字(socket) 完成与网络设备的接口。 Linux网络设备驱动的结构 Linux 系统对网络设备驱动的驱动体系从上到下划分为4个层次,依次为为 网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层和网络设备与媒介层 ,4层的作用如下: 网络协议接口层 向 网络层协议提供统一的数据包收发接口 ,不论上层协议为 ARP 还是 IP,都通过 dev_queue_init()函数发送数据 ,并通过 netif_rx()函数接收数据 。这一层的存在使得上层协议独立于具体的设备。 网络设备接口层 向 协议接口层提供统一的用于描述具体网络设备属性和操作的结构体net_device ,该结构体是设备驱动功能层中各函数的容器。实际上,网络设备接口层从宏观上规划了具体操作硬件的设备驱动功能层的结构。 设备驱动功能层 各函数是 网络设备接口层 net_device 数据结构的具体成员 ,是驱使网络设备硬件完成相应动作的程序,它通过 hard_start_xmit()函数启动发送操作 ,并通过网络设备上的 中断触发接收操作 网络设备与媒介层 是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介

初探Method Swizzling

為{幸葍}努か 提交于 2020-01-26 00:25:58
Method Swizzling: 即方法交换。 先来学点Objective-C的运行时来热热身。 一、在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段。编译器会将消息发送转换成对objc_msgSend方法的调用。 objc_msgSend方法含两个必要参数:receiver、方法名(即:selector),如: [receiver message]; 将被转换为:objc_msgSend(receiver, selector); objc_msgSend方法也能hold住message的参数,如: objc_msgSend(receiver, selector, arg1, arg2, …); objc_msgSend方法会做按照顺序进行以下操作,以完成动态绑定: 查找selector所指代的程序(方法的真正实现即方法的名字)。因为不同类对同一方法有不同的实现,所以对方法的真正实现的查找依赖于receiver的类 调用该实现,并将一系列参数传递过去 将该实现的返回值作为自己的返回值,返回之 二、Object-c 运行时允许你修改selector(method name)到implementation(the method code itself)的映射。 在运行时,OC 的方法被称为一种叫 Method 的结构体,这种 objc

PE文件结构-导入表详解

吃可爱长大的小学妹 提交于 2020-01-25 07:37:43
当PE文件运行时,PE文件将被系统加载进入内存中,此时Windows加载器会定位所有的导入的函数或者将定位到的内容填写到可执行文件的某个位置供使用,这个定位是需要借助于可执行文件的导入表来实现的。导入表中存放了所使用的DLL模块名称及导入函数的名称或者函数序列。 在PE文件中定位到PE头部的可选头的位置,可选头IMAGE_OPTIONAL_HEADER中最后一个成员: IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; IMAGE_DATA_DIRECTORY的结构如下: typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; //该目录的虚拟地址 DWORD Size; //该目录的大小 } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; 最后一个成员为数组,数组中不同的索引值对应不同的数据目录 所以定位到数据目录中的第二个目录,该目录包含导入表的相对虚拟地址,根据相对于基地址的偏移量找到导入表的首地址,导入表是一个 IMAGE_IMPORT_DESCRIPTOR类型的数组,被导入的每一个DLL都对应数组中的一个IMAGE_IMPORT_DESCRIPTOR结构体

C#跟Lua如何超高性能传递数据

拈花ヽ惹草 提交于 2020-01-25 02:42:45
前言 在 UWA学堂 上线那天,我买了 招文勇 这篇Lua交互的课程,19块还算值,但是前段时间太忙,一直没空研究,他的demo是基于xlua的,今天终于花了大半天时间在tolua下跑起来了,记录一下我的理解 性能,仍然是Lua中与C#混用的大坑 Lua跟C#交互的性能问题是老生常谈的了,c#跟lua数据交互是通过lua虚拟栈,进行压栈、出栈来传递的,一次调用就需要执行很多指令,性能会随着调用次数的频繁,函数参数的增多而变差。直接操作内存的方式,可以在c#端修改lua内存, 省去了操作虚拟栈,函数调用的大把指令,性能也就很高效了 腾讯的UnLua(给虚幻4用的)中也有类似的直接操作内存的交互方式,看来这种方式会渐渐成为主流,毕竟性能摆在这呢 Lua跟C#高效共享大量数据的一种方法 原理其实很简单,在c#端定义好lua table的结构体,必须在内存中对齐lua端的table,然后在c#端拿到lua table的指针,读写这块内存,就能读写这个lua table了。 是不是觉得非常简单,哈哈哈哈。感觉自己马上就能弄出来了 想要实现这套东西,还得搞懂几个问题,下面开始一一讲解 Lua Table结构体是什么样的? 想在c#端写一个lua table结构体,那就先看看lua端这个结构体是怎么实现的吧。在tolua下,我们使用的是luajit,jit的源码跟lua是不一样的