当前位置: 首页 > news >正文

庆阳网站设计 贝壳下拉网站结构分析怎么做

庆阳网站设计 贝壳下拉,网站结构分析怎么做,厦门市建设局网站住房保障2018,外贸局是做什么的工作iOS学习前言sideTableSlideTablesSideTableBufSideTable前言 我们在上一篇中#xff0c;简单的介绍了weak的实现原理。其中弱引用表就是存储在SideTable中的#xff0c;这里我们来学习了解一下SideTable sideTable sideTable主要用于存储和管理对象的额外信息#xff0c;… iOS学习前言sideTableSlideTablesSideTableBufSideTable前言 我们在上一篇中简单的介绍了weak的实现原理。其中弱引用表就是存储在SideTable中的这里我们来学习了解一下SideTable sideTable sideTable主要用于存储和管理对象的额外信息特别是弱引用相关的数据。该表的设计和使用时OC运行时实现弱引用的基础使得ARC能够正确的处理弱引用的生命周期。 SlideTables 定义 static StripedMapSideTable SideTables() {return *reinterpret_castStripedMapSideTable*(SideTableBuf); }SideTables的实质类型时StripedMap。在StripedMap类中有StripeCount定义存储sidetable的最大数量。所以每个SideTable可以对应多个对象而每个对象对应一个sideTable。 SideTableBuf // We cannot use a C static initializer to initialize SideTables because // libc calls us before our C initializers run. We also dont want a global // pointer to this struct because of the extra indirection. // Do it the hard way.alignas(StripedMapSideTable) static uint8_t SideTableBuf[sizeof(StripedMapSideTable)];SideTables 在 C 的 initializers 函数之前被调用所以不能使用 C 初始化函数来初始化 SideTables而 SideTables 本质就是 SideTableBuf不能使用全局指针来指向这个结构体因为涉及到重定向问题 而SideTableBuf本质上就是一个长度为Sizeof(StripedMap)的char类型的数组所以有 SideTableBuf 本质上就是一个大小为和 StripedMapSideTable 对象一致的内存块 这也是为什么 SideTableBuf 可以用来表示 StripedMapSideTable 对象。本质上而言SideTableBuf 就是指一个 StripedMapSideTable对象 StripedMap SideTable StripedMap是一个模板类该类中有一个array成员用来存储PaddedT对象并且其中对于[]符号的重载定义中会返回这个PaddedT的value成员这个value就是我们传入的T泛型成员也就是Side Table对象。在array的下标中这里使用了indexForPointer方法通过位运算计算下标实现了静态的Hash Table。而在weak_table中其成员weak_entry会将传入对象的地址加以封装起来并且其中也有访问全局弱引用表的入口。 T 是模板类型参数泛型它代表 “任意类型”具体类型由使用 StripedMap 时指定。此处就是SideTable T泛型参数在运行时中实际代表 SideTable让 StripedMap 成为管理 SideTable 的通用容器。PaddedT对 T即 SideTable的包装通过内存对齐alignas避免多线程访问时的 CPU 缓存冲突提升性能。 templatetypename T class StripedMap { #if TARGET_OS_IPHONE !TARGET_OS_SIMULATORenum { StripeCount 8 }; #elseenum { StripeCount 64 }; #endifstruct PaddedT {T value alignas(CacheLineSize);};PaddedT array[StripeCount];static unsigned int indexForPointer(const void *p) {uintptr_t addr reinterpret_castuintptr_t(p);return ((addr 4) ^ (addr 9)) % StripeCount;}public:T operator[] (const void *p) { return array[indexForPointer(p)].value; }const T operator[] (const void *p) const { return const_castStripedMapT(this)[p]; }...省略了对象方法... }首先根据是否为 iphone 定义了一个 StripeCountiphone 下为 8即最多为八个sidetable 源码中 CacheLineSize 为 64使用 T 定义了一个结构体而 T 就是 SideTable 类型 生成了一个长度为 8 类型为 SideTable 的数组 indexForPointer() 逻辑为根据传入的指针经过一定的算法计算出一个存储该指针的位置因为使用了取模运算所以值的范围是 0 ~ StripeCount-1所以不会出现数组越界 后面的 operator 表示重写了运算符 [] 的逻辑调用了 indexForPointer() 方法这样使用起来更像一个数组 SideTables可以理解成一个类型为StripeMap Side Table静态全局对象内部以数组的形式存储了StripeCount个SideTable SideTable struct SideTable { // 保证原子操作的自旋锁 spinlock_t slock; // 引用计数的 hash 表RefcountMap refcnts; // weak 引用全局 hash 表weak_table_t weak_table;//构造函数SideTable() {memset(weak_table, 0, sizeof(weak_table));}//析构函数~SideTable() {_objc_fatal(Do not delete SideTable.);}...省略对象方法... }slock是一个自旋锁就是为了保证多线程访问安全性 refcnts本质是一个存储对象引用计数的hash表key为对象value为引用计数(优化过得isa中引用计数主要存在isa中) weak_table是存储对象弱引用的一个结构体该结构体内的成员如下 /**全局的弱引用表, 保存object作为key, weak_entry_t作为value* The global weak references table. Stores object ids as keys,* and weak_entry_t structs as their values.*/ struct weak_table_t {// 保存了所有指向特地对象的 weak指针集合weak_entry_t *weak_entries;// weak_table_t中有多少个weak_entry_tsize_t num_entries;// weak_entry_t数组的countuintptr_t mask;// hash key 最大偏移值,// 采用了开放定制法解决hash冲突,超过max_hash_displacement说明weak_table_t中不存在要找的weak_entry_tuintptr_t max_hash_displacement; };下面是refcnts的定义 typedef objc::DenseMapDisguisedPtrobjc_object,size_t,RefcountMapValuePurgeable RefcountMap;DenseMap 是一个 hash Map,基类 DenseMapBase 中的部分代码如下DenseMapBase中重写了操作符 [] ValueT operator[](const KeyT Key) {return FindAndConstruct(Key).second;}通过传入的 Key 寻找对应的 Value。而 Key 是 DisguisedPtrobjc_object 类型Value 是 size_t 类型。即使用 obj.address refCount 的形式来记录引用计数器 回到最初的 sidetable_addExtraRC_nolock 方法中 size_t refcntStorage table.refcnts[this];通过 this 即 object 对象的地址取出 refcnts 这个哈希表中存储的引用计数器 refcnts 可以理解成一个 Map使用 addressrefcount 的形式存储了很多个对象的引用计数器看不太懂这里 总结一下吧 iphone中Side Tables()本质上返回一个Side TableBuf对象该对象存储8个SideTableStripeCount涉及到多线程和效率问题有多个SideTable来存储对象相关的引用计数器和弱引用Apple通过对object的地址进行运算之后对Side Table的个数进行取模运算以次来决定将对象分配到哪个SideTable进行信息存储因为有取模运算所以不会出现数组溢出。范围为0-StripeCount-1当对象需要使用到Side Table时会被分配到到 8/64 个全局 sideTables 中的某一个表中存储相关的引用计数器或者弱引用信息 这里再附上一张上一篇的弱引用表关系图
http://www.pierceye.com/news/979716/

相关文章:

  • 微信h5商城网站开发米拓模板网站建设
  • 品牌网站设计案例wordpress 实例
  • 郑州大学科技园手机网站建设wordpress 新手指南
  • 国外免费建站网站搭建南阳网站排名优化报价
  • 中国排名高的购物网站免费软件下载网站有哪些
  • 云服务器做视频网站石家庄软件定制开发
  • 好的外贸网站的特征如何快速的制作h5页面
  • 徐州建站程序南京制作网页培训学校
  • 广州市服务好的网站制作排名北京网站建设公司哪个最好
  • 网站调用谷歌地图灌云网站制作
  • 做的网站能撤掉吗济南好的网站建设公司排名
  • 北京智能建站系统价格江西省住房建设厅统计网站
  • 中山建设网站官网郑州做网站排名公司
  • 怎么把自己做的网站放到百度上网页该如何推广
  • 军事网站大全军事网金蝶软件公司官网
  • 哪些网站用c 做的南宁有做门户网站的公司吗
  • 濮阳网站建设陈帅wordpress 调用用户头像
  • 旅游自媒体网站怎么做个人创业做网站
  • 语音识别程序代做网站网站运营策略如何做
  • 怎么做淘宝网站赚钱吗wordpress个性用户
  • 通州郑州阳网站建设wordpress发表的文章在页面找不到
  • 网上订货发货网站建设3d建模用什么软件
  • 广州房地产网站建设方案推广你公司网站
  • 较好的网站建设公司网站备案填了虚假座机能过吗
  • 网站权重是怎么提升的node怎么做网站
  • 珠海哪家做企业网站公司好网站开发常用图标 图像
  • 上海先进网站设计丹阳如何做百度的网站
  • dw免费网站模板下载ui设计培训课程
  • 襄城县城乡建设管理局网站网站推广要具备什么
  • 用vue做网站的实例wordpress redis缓存