[PBRT-V3]代码中的#define(持续更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/libing_zeng/article/details/81013765

#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

猜你喜欢

转载自blog.csdn.net/libing_zeng/article/details/81013765