2

ページから次のリストがあります。

#include "vector.h"

// An axis-aligned bounding box
class AABB
{
  public:
    VECTOR P; //position
    VECTOR E; //x,y,z extents

    AABB( const VECTOR& p, const VECTOR& e): P(p) ,E(e) {}

    // ...

    const SCALAR min( long i ) const
    {

      return ((AABB*)this)->P[i] - ((AABB*)this)->E[i];
    }
    // ...
};

今私が理解していないのは、長い値を持つ min() によってアクセスされるものです。調べvector.hたところ、角かっこ演算子がオーバーロードされていることがわかりました。

class VECTOR
{
  public:
    SCALAR x,y,z; //x,y,z coordinates

    //...

    //index a component
    //NOTE: returning a reference allows
    //you to assign the indexed element
    SCALAR& operator [] ( const long i )
    {
      return *((&x) + i);
    }
    //...
};

後で次のように使用されます。

// each axis
for( long i=0 ; i<3 ; i++ )
{
  if( A.max(i)<B.min(i) && v[i]<0 )
  {

xでは、値の参照が だけインクリメントされるのはなぜiですか?
この質問がとてつもなく簡単である場合は、ご容赦ください。私はまだ新人です。これで十分な情報が得られない場合は、実際のソースを提供できます

4

4 に答える 4

3

インクリメントされていません。

&x  //<- address of member x
(&x) + i //<- address of member x shifted right by i SCALAR's
*((&x) + i) // the scalar value at that point

したがって*((&x) + i)、i 番目のスカラーを返します。x は 0、y は 1、z は 2 です。

于 2013-06-04T22:20:55.357 に答える
3

これはポインタ演算と呼ばれます。

コードでは、ポインタである&xアドレスを受け取ります。xそれに追加iすると、ポインターが だけインクリメントされsizeof(x) * iます。通常、配列にインデックスを付けるのと同じ効果を得るためにこれを行います。たとえば、

int arr[10];

次に、配列内の th 整数に&arr[0] + i効果的にインデックスを作成します。i場合によっては、標準配列の代わりに、他のタイプの連続したメモリ ブロックが存在することがあります。

ここには配列やその他のそのようなメモリブロックがないため、これは問題のケースではまったく起こりません。代わりに、コードは、配列レイアウトをシミュレートして、 、、およびがメモリ内に配置されるVECTORようなメモリ レイアウトをコンパイラが計算すると想定しています。xyz

ただし、この方法では C++ 標準に従って未定義の動作が発生するため、この の実装にVECTORは欠陥があり、使用しないでください。

于 2013-06-04T22:22:01.937 に答える
1

それがポインタ演算です。

VECTOR構造体では、メンバーSCALARはメモリ内に連続して出現する可能性が高く(保証されていません)、そのコードの作成者は構造体の最初のメンバーのメモリ アドレスにインデックスを追加するだけでそれを利用しました ( x)。

これは、入力が出力にどのようにマップされるかです。

  • 0... *(&x + 0)... ...x
  • 1... *(&x + 1)... ...y
  • 2... *(&x + 2)... ...z

しかし、これは著者によるかなり危険な仮定でした:V.
(パディングバイト、メンバーの順序など...)

于 2013-06-04T22:21:05.617 に答える