文档更新说明
- 最后更新 2020年04月11日
- 首次更新 2020年04月11日
前言
最近在看runtime源码的时候发现一些平时很少见的语法, 问了一下一个做C++的朋友, 有些他说也看不懂.
现在把这类语法汇总一下放到在.
正文
结构体成员定义带了冒号
objc_object结构体中有一个用来保存OC类类型的类型isa_t, 这个类型的定义如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| union isa_t { isa_t() { } isa_t(uintptr_t value) : bits(value) { }
Class cls; uintptr_t bits; #if defined(ISA_BITFIELD) struct { uintptr_t nonpointer : 1; uintptr_t has_assoc : 1; uintptr_t has_cxx_dtor : 1; uintptr_t shiftcls : 33; uintptr_t magic : 6; uintptr_t weakly_referenced : 1; uintptr_t deallocating : 1; uintptr_t has_sidetable_rc : 1; uintptr_t extra_rc : 19 }; #endif };
|
里面涉及到的一些比较少见的语法, 其中结构体使用了位域, 位域可以实现按位定义类型, 举个例子
1 2 3 4 5 6 7 8 9 10
| typedef struct { int a : 1; int b : 2; int c : 4; } BS;
BS bs = BS{.a = 0, .b =1, .c =3}; printf("size:%lu a:%d b:%d c:%d\n", sizeof(BS), bs.a, bs.b, bs.c); printf("%d\n", bs);
|
runtime在一开始初始化阶段, 加载类类型到内存里的时候, 用了下面这段代码
1 2 3 4 5 6
| void map_images(unsigned count, const char * const paths[], const struct mach_header * const mhdrs[]) { mutex_locker_t lock(runtimeLock); return map_images_nolock(count, paths, mhdrs); }
|
变量类型 变量名(参数值)
这个语法等价于给变量名赋值, 例如
int a(1) 等价于 int a = 1
上面mutex_locker_t这个其实是locker类, 等价于调用类的构造函数, 并把参数传进去构造函数里
1 2
| locker(mutex_tt& newLock);
|
例如下面这样:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Studen { public: int height; int age;
Studen(int a) { age = a; height = 140; } };
Studen std(10); printf("%d\n", std.age);
|
结构体或者类的函数后面带了个const关键字
作用就是告诉编译器函数的实现并没有修改到对象的成员, 这样可以提高执行效率和代码的可读性.