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

53 篇文章 22 订阅

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值