#define的定义其实就是简单的文本的替换
1. ARENA_ALLOC(arena, Type)
#define ARENA_ALLOC(arena, Type) new ((arena).Alloc(sizeof(Type))) Type
实际使用的情况类似于这样:
si->bsdf = ARENA_ALLOC(arena, BSDF)(*si);
这段code经过文本替换后是:
si->bsdf = new ((arena).Alloc(sizeof(BSDF))) BSDF(*si);
这里new的是什么鬼?小编一开始一脸懵X。
后来参考了:https://blog.csdn.net/xiaorenwuzyh/article/details/44514815
才知道,这个new被称为“placement new”。
placement new 的功能就是 在一个 已经分配好的空间上,调用构造函数,创建一个类。
用法:
void *buf = // 在这里为buf分配内存
Class *pc = new (buf) Class();
所以,“new ((arena).Alloc(sizeof(BSDF))) BSDF(*si);”的意思是:
在((arena).Alloc(sizeof(BSDF)))分配的空间上,调用BSDF的构造函数BSDF(*si)创建一个BSDF对象。
2.#define STAT_COUNTER(title, var)
#define STAT_COUNTER(title, var) \
static PBRT_THREAD_LOCAL int64_t var; \
static void STATS_FUNC##var(StatsAccumulator &accum) { \
accum.ReportCounter(title, var); \
var = 0; \
} \
static StatRegisterer STATS_REG##var(STATS_FUNC##var)
“\”:續行符。意思就是,上面這一堆代碼其實就是一行。
“##”、“#”的意思參考:https://blog.csdn.net/libing_zeng/article/details/81033473