这是来自Box2d物理引擎的b2Math.h的代码。
struct b2Vec2
{ ...
/// Read from and indexed element.
float operator () (int i) const
{
return (&x)[i];
}
/// Write to an indexed element.
float operator () (int i)
{
return (&x)[i];
}
...
float x, y;
}
为什么我们不能只使用SomeVector.x和SomeVector.y来读取/写入矢量坐标?线路的实际return (&x)[i];
运作方式如何?我的意思是,对结构的x组件的引用对我来说还不清楚数组制动器[]。
预先感谢您的答复。
这是来自Box2d物理引擎的b2Math.h的代码。
您发布的Box2D源代码的复制和粘贴中似乎存在错误。特别是,在非常量方法中似乎缺少了“&”号。
另外,此代码段似乎来自当前2.3.2发布的代码之外的其他代码库。
这是来自GitHub上Box2D 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];
}
为什么我们不能只使用SomeVector.x和SomeVector.y来读取/写入矢量坐标?
我们可以并且通常这样做。
但是,Box2D中有一些代码(b2AABB::RayCast
特别是)似乎是从一种算法(b2AABB::RayCast
说“来自实时碰撞检测,p179”的注释)中编写的,该算法在x和y上迭代为数组下标零和一。我猜想Erin Cato(Box2D的作者)是通过以下方式实现这些运算符的:(a)使访问在样式上更符合算法,(b)使访问有效,(c)使访问在看起来高效的方式。我可以确认它至少可以正常工作。
我有自己的Box2D分支,在其中重写了这些运算符。我将其接口更改为使用[]
(而不是()
),并将其实现更改为使用一条switch
语句来显式访问x
或y
。后者是我为避免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;
}
以及行返回(&x)[i]的实际方式;作品?
正如我在上面暗示的那样,我之前已经研究了这个确切的问题。
当结构的x和y成员变量的内存布局与具有两个浮点数的数组相同时,该函数起作用。它通常会这样做。因此&符(&
)获取x
参数的地址,然后将该地址视为数组开头的地址,然后由它进行索引i
。
不过,就C ++标准而言,我认为这不是定义的行为。但是,对于我的口味而言,定义不够明确。
希望这能回答您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句