《Ray Tracing in One Weekend》中为何重载const与非const版本[]运算符?
关于向量类重载两个
operator[]的原因 先看你提到的两段代码:
double operator[](int i) const { return e[i]; } double& operator[](int i) { return e[i]; }
这两个重载是C++里实现const正确性和灵活操作的标准写法,核心目的不止是性能,主要有这几点:
让非const向量支持直接修改元素
非const版本返回引用,意味着你可以像操作普通数组一样给向量元素赋值,比如:vec3 my_vec(1.0, 2.0, 3.0); my_vec[0] = 5.0; // 直接修改原向量的第一个元素如果只有值返回的版本,
my_vec[0] = 5.0修改的只是返回的临时double副本,原向量的元素根本不会变化,完全达不到修改数据的目的。严格保证const对象的只读性
const版本是专门给const对象设计的——当你拿到一个const vec3&(比如函数的const引用参数),只能调用const成员函数。这时候返回值而不是引用,就确保了无法通过operator[]修改const对象的内部数据,严格遵守const的语义,防止意外修改只读对象。比如:void print_vec(const vec3& v) { // v[0] = 0.0; // 编译报错,因为const版本返回值,不能赋值 std::cout << v[0] << std::endl; // 只读访问没问题 }性能优化(锦上添花)
你提到的性能提升确实是一个好处,虽然double的复制开销不大,但在光线追踪这种需要海量向量运算的场景下,频繁的小复制累积起来也会影响效率。返回引用避免了值复制,能节省这部分开销。
内容的提问来源于stack exchange,提问作者SaucyPandora
相关产品推荐
相关产品推荐

