1.ios newåallocçåºå«
2.vue源码阅读解析1- new Vue初始化流程
3.newåalloc initçåºå«ä»¥ååèªç好å¤ï¼
4.RocksDb 源码剖析 (1) | 如何混合 new 、mmap 设计高效内存分配器 arena ?
5.èè JS ä¸ç Object.create
ios newåallocçåºå«
1.å¨å®é å¼åä¸å¾å°ä¼ç¨å°newï¼ä¸è¬å建对象å±ä»¬çå°çå ¨æ¯[[className alloc] init]
ä½æ¯å¹¶ä¸æå³çä½ ä¸ä¼æ¥è§¦å°newï¼å¨ä¸äºä»£ç ä¸è¿æ¯ä¼çå°[className new]ï¼
è¿æå»é¢è¯çæ¶åï¼ä¹å¾å¯è½è¢«é®å°è¿ä¸ªé®é¢ã
2.é£ä¹ï¼ä»ä»¬ä¸¤è ä¹é´å°åºæä»ä¹åºå«å¢
æ们çæºç ï¼
+ new { id newObject = (*_alloc)((Class)self, 0); Class metaClass = self->isa; if (class_getVersion(metaClass) > 1) return [newObject init]; else return newObject; } //è alloc/init åè¿æ ·ï¼ + alloc { return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); } - init { return self; }
éè¿æºç ä¸æ们åç°ï¼[className new]åºæ¬çåäº[[className alloc] init]ï¼
åºå«åªå¨äºallocåé å åçæ¶å使ç¨äºzone.
è¿ä¸ªzoneæ¯ä¸ªä»ä¹ä¸ä¸å¢ï¼
å®æ¯ç»å¯¹è±¡åé å åçæ¶åï¼æå ³èç对象åé å°ä¸ä¸ªç¸é»çå ååºåå ï¼ä»¥ä¾¿äºè°ç¨æ¶æ¶èå¾å°ç代价ï¼æåäºç¨åºå¤çé度ï¼
3.è为ä»ä¹ä¸æ¨è使ç¨newï¼
ä¸ç¥å¤§å®¶åç°äºæ²¡æï¼å¦æ使ç¨newçè¯ï¼åå§åæ¹æ³è¢«åºå®æ»åªè½è°ç¨init.
èä½ æ³è°ç¨initXXXæä¹åï¼æ²¡é¨å¿ï¼æ®è¯´æåç设计æ¯å®å ¨åé´Smalltalkè¯æ³æ¥çã
ä¼ è¯´é£ä¸ªæ¶åå·²ç»æallocFromZone:è¿ä¸ªæ¹æ³ï¼
ä½æ¯è¿ä¸ªæ¹æ³éè¦ä¼ 个åæ°id myCompanion = [[TheClass allocFromZone:[self zone]] init];
è¿ä¸ªæ¹æ³åä¸é¢è¿æ ·ï¼
+ allocFromZone:(void *) z { return (*_zoneAlloc)((Class)self, 0, z); } //åæ¥ç®å为ä¸é¢è¿ä¸ªï¼ + alloc { return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); }
ä½æ¯ï¼åºç°ä¸ªé®é¢ï¼è¿ä¸ªæ¹æ³åªæ¯ç»å¯¹è±¡åé äºå åï¼å¹¶æ²¡æåå§åå®ä¾åéã
æ¯ä¸æ¯ååå°newé£æ ·çå¤çæ¹å¼ï¼å¨æ¹æ³å é¨éå¼è°ç¨initæ¹æ³å¢ï¼
åæ¥åç°âæ¾ç¤ºè°ç¨æ»æ¯éå¼è°ç¨è¦å¥½âï¼æ以åæ¥å°±æ两个æ¹æ³åå¼äºã
æ¦æ¬æ¥è¯´ï¼newåalloc/initå¨åè½ä¸å ä¹æ¯ä¸è´çï¼åé å å并å®æåå§åã
å·®å«å¨äºï¼éç¨newçæ¹å¼åªè½éç¨é»è®¤çinitæ¹æ³å®æåå§åï¼
éç¨allocçæ¹å¼å¯ä»¥ç¨å ¶ä»å®å¶çåå§åæ¹æ³ã
vue源码阅读解析1- new Vue初始化流程
在 Vue 2.6. 版本中,初始化过程从一个简单的HTML文件引入Vue开始。核心在于 src/core/instance/index.js 和 src/core/instance/init.js 文件,其中定义了一个名为的方法,当执行 new Vue(options) 时,测试心理源码会调用这个方法进行实例化。
重点在于理解 $mount 方法,它在 src/platforms/web/entry-runtime-with-compiler.js 中被实现,主要负责将模板编译成可识别的render函数,这对于模板编写和Vue的编译效率至关重要。当使用模板时,Vue会自动编译,而直接写render函数会更高效。
继续深入,src/core/instance/lifecycle.js 的 mountComponent 方法有两个 $mount,一个用于with-compiler模式,负责模板编译阶段的处理;而其他情况下,template会被Webpack和loader处理并编译。thread+源码分析
在 mountComponent 方法中,创建渲染watcher,watcher内部调用updateComponent。watcher实例化时,vm._watcher = this,接着执行get函数,实际上是执行updateComponent,从而生成Vnode。
然后进入vm.update函数,android源码+多少类进一步调用patch方法,该方法在src/core/vdom/patch.js中,这是new Vue初始化流程的最终步骤。
newåalloc initçåºå«ä»¥ååèªç好å¤ï¼
å ¶å®å¨ä»¥åï¼å°±æ¸æ¸çä½¿ç¨ [[className alloc] init]ï¼èæ ¹æ¬ä¸å»ç¨ [className new]ï¼äºï¼è¿ä¸¤è åºæ¬çåãå¯ä»¥å»æ¥ä¸ä¸æºç ï¼åºå«åªå¨äºallocåé å åçæ¶å使ç¨äºzoneï¼zoneæ¯ç»å¯¹è±¡åé å åçæ¶åï¼æå ³èç对象åé å°ä¸ä¸ªç¸é»çå ååºåå ï¼ä»¥ä¾¿äºè°ç¨æ¶æ¶èå¾å°ç代价ï¼æåäºç¨åºå¤çé度ãèä¸è¯è¯´åæ¥ï¼åå§åçæ¹å¼å¹¶ä¸æ¯åªæinitä¸ç§ï¼ç¨newçè¯å±éäºinitä¸ç§æ¹æ³ã
RocksDb 源码剖析 (1) | 如何混合 new 、mmap 设计高效内存分配器 arena ?
本文旨在深入剖析RocksDb源码,从内存分配器角度着手。RocksDb内包含MemoryAllocator和Allocator两大类内存分配器。MemoryAllocator作为基类,提供MemkindKmemAllocator和JemallocNodumpAllocator两个子类,mvn打包源码,文档分别集成memkind和jemalloc库的功能,实现内存分配与释放。
接着,重点解析Allocator类及其子类Arena的实现。基类Allocator提供两个关键接口:内存分配与对齐。Arena类采用block为单位进行内存分配,先分配一个block大小的内存,后续满足需求时,优先从block中划取,can+接收源码以减少内存浪费。一个block的大小由kBlockSize参数决定。分配策略中,Arena通过两个指针(aligned_alloc_ptr_和unaligned_alloc_ptr_)分别管理对齐与非对齐内存,提高内存利用效率。
分配内存时,Arena通过构造函数初始化成员变量,包括block大小、内存在栈上的分配与mmap机制的使用。构造函数内使用OptimizeBlockSize函数确保block大小合理,减少内存对齐浪费。Arena中的内存管理逻辑清晰,尤其在分配新block时,仅使用new操作,无需额外内存对齐处理。
分配内存流程中,AllocateNewBlock函数直接调用new分配内存,而AllocateFromHugePage和AllocateFallback函数则涉及mmap机制的使用与内存分配策略的统一。这些函数共同构成了Arena内存管理的核心逻辑,实现了灵活高效地内存分配。
此外,Arena还提供AllocateAligned函数,针对特定对齐需求分配内存。这一函数在使用mmap分配内存时,允许用户自定义对齐大小,优化内存使用效率。在处理对齐逻辑时,Arena巧妙地利用位运算优化计算过程,提高了代码效率。
总结而言,RocksDb的内存管理机制通过Arena类实现了高效、灵活的内存分配与管理。通过深入解析其源码,可以深入了解内存对齐、内存分配与多线程安全性的实现细节,为开发者提供宝贵的内存管理实践指导。未来,将深入探讨多线程内存分配器的设计,敬请期待后续更新。
èè JS ä¸ç Object.create
å®è¯è¯´ï¼ä¹åä¸ç¥éè¿æè¿ä¹ä¸ªç©æãå¶ç¶é´çæå new æºç ï¼æç®åå®ç¬¬ä¸æ¬¡è®¤è¯ãObject.create() å®æ¹è§£éï¼æ¹æ³å建ä¸ä¸ªæ°å¯¹è±¡ï¼ä½¿ç¨ç°æç对象æ¥æä¾æ°å建ç对象çprotoã
å ¶å® Object.create() æ两个åæ°ï¼ Object.create(proto, [propertiesObject])
proto : å¿ é¡»ï¼è¡¨ç¤ºæ°å»ºå¯¹è±¡çåå对象ã
å³è¯¥åæ°ä¼è¢«èµå¼å°ç®æ 对象(å³æ°å¯¹è±¡ï¼æ说æ¯æåè¿åç对象)çååä¸ã
该åæ°å¯ä»¥æ¯nullï¼ å¯¹è±¡ï¼ å½æ°ç prototype å±æ§
注æï¼å建空ç对象æ¶éä¼ null , å¦åä¼æåº TypeError å¼å¸¸
propertiesObject : å¯éï¼æ·»å å°æ°å建对象çå¯æ举å±æ§ã
( å³å ¶èªèº«çå±æ§ï¼èä¸æ¯ååé¾ä¸çæ举å±æ§ ) 对象çå±æ§æ述符以åç¸åºçå±æ§å称ã
è¿äºå±æ§å¯¹åº Object.defineProperties() ç第äºä¸ªåæ°ã
ä¸ æ®éæ¹å¼ å建对象 ä¸åç¹