$ open .zshrc
// ****** 添加以下别名
alias subl='/Applications/SublimeText.app/Contents/SharedSupport/bin/subl'
alias code='/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code'// ****** 使用
$ code main.sil
// 如果想SIL文件高亮,需要安装插件:VSCode SIL
从 SIL 文件中,可以看出,代码是经过混淆的,可以通过以下命令还原,以s4main1tAA10YDWTeacherCvp 为例:xcrun swift-demangle s4main1tAA10YDWTeacherCvp,结果如下:
这里的 Local 中可以看出:requiredSize 是内存大小,requiredAlignmentMask 是内存对齐方式;requiredAlignmentMask 是 swift 中的字节对齐方式,这个和 OC 中是一样的,必须是8的倍数,不足的会自动补齐,目的是以空间换时间,来提高内存操作效率;
static HeapObject *_swift_allocObject_(HeapMetadata const*metadata,size_t requiredSize,size_t requiredAlignmentMask){assert(isAlignmentMask(requiredAlignmentMask));auto object = reinterpret_cast<HeapObject *>(swift_slowAlloc(requiredSize, requiredAlignmentMask));// NOTE: this relies on the C++17 guaranteed semantics of no null-pointer// check on the placement new allocator which we have observed on Windows,// Linux, and macOS.new(object)HeapObject(metadata);// If leak tracking is enabled, start tracking this object.SWIFT_LEAKS_START_TRACKING_OBJECT(object);SWIFT_RT_TRACK_INVOCATION(object, swift_allocObject);return object;}
void*swift::swift_slowAlloc(size_t size,size_t alignMask){void*p;// This check also forces "default" alignment to use AlignedAlloc.if(alignMask <= MALLOC_ALIGN_MASK){#ifdefined(__APPLE__)
p =malloc_zone_malloc(DEFAULT_ZONE(), size);#else// 堆中创建size大小的内存空间,用于存储实例变量
p =malloc(size);#endif}else{size_t alignment =(alignMask ==~(size_t(0)))? _swift_MinAllocationAlignment
: alignMask +1;
p =AlignedAlloc(size, alignment);}if(!p) swift::crash("Could not allocate memory.");return p;}
进入 HeapObject 初始化方法,需要两个参数:metadata、refCounts:
structHeapObject{/// This is always a valid pointer to a metadata object.
HeapMetadata const*metadata;
SWIFT_HEAPOBJECT_NON_OBJC_MEMBERS;#ifndef__swift__HeapObject()=default;// Initialize a HeapObject header as appropriate for a newly-allocated object.
constexpr HeapObject(HeapMetadata const*newMetadata):metadata(newMetadata),refCounts(InlineRefCounts::Initialized){}// Initialize a HeapObject header for an immortal object
constexpr HeapObject(HeapMetadata const*newMetadata,
InlineRefCounts::Immortal_t immortal):metadata(newMetadata),refCounts(InlineRefCounts::Immortal){}
Swift 编译简介Swift 的编译环境配置和编译流程,请参考我之前的博客:Swift之源码编译的环境搭建和编译流程;创建一个 YDWTeacher 类,并通过默认的初始化器,创建一个实例对象并赋值给 t,如下: class YDWTeacher { var age: Int = 18 var name: String = "YDW" } let t = YDWTeacher()接下来,要研究的是这个初始化器到底做了一个什么样的操作?因此引入 SIL (Swift i