c语言operator,C在struct中重载operator()

本文探讨Box2D库中为何不直接使用.x和.y操作向量坐标,而是通过索引运算符。作者解析了索引操作的工作原理,并分享了自定义实现的代码片段,比较了不同方式的优缺点。重点在于理解背后的算法设计和性能考量。
摘要由CSDN通过智能技术生成

Here is a code from b2Math.h from Box2d physics engine.

您发布的Box2D源代码的复制和粘贴似乎有错误.特别是,在非const方法中似乎缺少了&符号.

此外,此代码段似乎来自除当前2.3.2发布代码之外的代码库.

/// Read from and indexed element.

float32 operator () (int32 i) const

{

return (&x)[i];

}

/// Write to an indexed element.

float32& operator () (int32 i)

{

return (&x)[i];

}

Why can’t we just use SomeVector.x and SomeVector.y to read/write vector coordinates?

我们可以,而且我们通常这样做.

然而,Box2D中的一些代码(具体为b2AABB :: RayCast)似乎是从算法编写的(b2AABB :: RayCast的评论说“来自实时碰撞检测,p179”)迭代x和y为数组下标零和一.我猜想Erin Cato(Box2D的作者)以这种方式实现了这些运算符:(a)使风格上的访问更符合算法,(b)使其工作,(c)使其工作在看似高效的方式.我可以确认它至少起作用了.

我有my own fork of Box2D,我已经重写了这些运算符.我将其接口更改为使用[](而不是()),并将其实现更改为使用switch语句显式访问x或y.后者我明确地避免了我可能未定义的行为w.r.t. C标准.

这里是我的实现的相关部分的代码段(请注意,我并不认为这是完美或好的,只是它的替代实现是有效的,它应该明确依赖于定义的行为) :

/// Accesses element by index.

/// @param i Index (0 for x, 1 for y).

auto operator[] (size_type i) const

{

assert(i < max_size());

switch (i)

{

case 0: return x;

case 1: return y;

default: break;

}

return x;

}

/// Accesses element by index.

/// @param i Index (0 for x, 1 for y).

auto& operator[] (size_type i)

{

assert(i < max_size());

switch (i)

{

case 0: return x;

case 1: return y;

default: break;

}

return x;

}

And how actually line return (&x)[i]; works?

正如我上面暗示的那样,我之前已经研究过这个问题.

当结构的x和y成员变量的内存布局与具有两个浮点数的数组相同时,它可以工作;它通常做的.因此,&符号(&)获取x参数的地址,然后将该地址视为数据开头的地址,然后由i进行索引.

然而,就C标准而言,我不认为这是定义的行为.然而,根据我的口味,它没有明确定义.

希望这能回答你的问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值