文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 正文
    1. 3.0.1. 结构体成员定义带了冒号
    2. 3.0.2. 变量类型 变量名(参数值)
    3. 3.0.3. 结构体或者类的函数后面带了个const关键字

文档更新说明

  • 最后更新 2020年04月11日
  • 首次更新 2020年04月11日

前言

  最近在看runtime源码的时候发现一些平时很少见的语法, 问了一下一个做C++的朋友, 有些他说也看不懂.
  
  现在把这类语法汇总一下放到在.   

正文

结构体成员定义带了冒号

objc_object结构体中有一个用来保存OC类类型的类型isa_t, 这个类型的定义如下

union isa_t {
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits;
#if defined(ISA_BITFIELD)
struct {
// 以下是__arm64__架构下的定义
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
};

里面涉及到的一些比较少见的语法, 其中结构体使用了位域, 位域可以实现按位定义类型, 举个例子

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); // size:4 a:0 b:1 c:3
printf("%d\n", bs); // 输出26, 对应二进制011 01 0
// 解释一下, 结构体本来是有3个int型, 占用12个字节的, 但是现在用了位域, abc三个变量只使用了int型的低位4个位, 所以结构体总占用大小是4个字节

runtime在一开始初始化阶段, 加载类类型到内存里的时候, 用了下面这段代码

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类, 等价于调用类的构造函数, 并把参数传进去构造函数里

// 构造函数的定义
locker(mutex_tt& newLock);

例如下面这样:

class Studen {
public:
int height;
int age;
Studen(int a) {
age = a;
height = 140;
}
};
Studen std(10);
printf("%d\n", std.age); // 10

结构体或者类的函数后面带了个const关键字

作用就是告诉编译器函数的实现并没有修改到对象的成员, 这样可以提高执行效率和代码的可读性.

文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 正文
    1. 3.0.1. 结构体成员定义带了冒号
    2. 3.0.2. 变量类型 变量名(参数值)
    3. 3.0.3. 结构体或者类的函数后面带了个const关键字