簡體   English   中英

使用指針算法迭代C ++中的類數據成員

[英]Using pointer arithmetic to iterate over class data members in C++

我有一個C ++類,包含一堆相同類型的數據成員,我想迭代它們:

// C.h

class C {

  // other members

  double foo;
  double bar;
  ...
  double barf; // 57th double declared since foo, nothing else in between

  // other members
};

指針算法似乎有效,例如在這里使用構造函數初始化那58個成員雙精度:

// C.cpp

C::C() {
  for (int i = 0; i < 58; i++) {
    *(&this->foo + i) = 0;
  }
}

我在這里找到了相關的問題如何迭代C ++類的變量成員 ,這里是C ++:迭代所有對象的成員? ,這里的班級成員是否在記憶中被連續起來? 這里有類連續數據 ,有些人認為這種事情是可以的,有些則是禁止的。 后者說不能保證它不會失敗,但不要引用它實際上失敗的任何實例。 所以我的問題是,有沒有其他人使用過這個,或者已經嘗試過並遇到麻煩了?

或者也許有更好的方法? 最初在我的應用程序中,我確實使用數組代替我的對象,索引如下:

int i_foo = 0, i_bar = 1, ..., i_barf = 57;

然而,一旦我引入了不同的對象(及其數組),索引命名開始失控。 另外,我想了解課程,我希望其他一些功能可以證明有用;-)

我非常重視迭代,例如計算對象集合的統計數據。 當然,我可以創建一個函數來逐個將類成員映射到一個數組,但性能是一個優先事項。 我正在為自己開發這個應用程序,以便在Windows上使用VS. 我想保持其他平台選項開放,但這不是我打算廣泛分發的東西。 謝謝

喬治:

我認為你可以有一個更好的解決方案(比如將返回第i個屬性的方法:

double get(size_t idx)
{
  switch (idx)
  {
    case 0: return foo; 
    case 1: return bar;
    case 2: return foo_bar;
    ....
  }
}

使用指針算法迭代類數據成員可能會在代碼優化期間導致問題。 例:

struct Vec3
{
    double x, y, z;

    inline Vec3& operator =(const Vec3& that)
    {
        x = that.x;
        y = that.y;
        z = that.z;
        return *this;
    }

    inline double& operator [](int index)
    {
        return (&x)[index];
    }
};

...
Vec3 foo = bar;            // operator =
double result = foo[2];    // operator []
...

兩個運算符都是內聯的,結果的值取決於最終指令的重新排序。 可能的情況:

foo.x = bar.x;
foo.y = bar.y;
foo.z = bar.z;
result = (&foo.x)[2];    // correct -- result contains new value

foo.x = bar.x;
foo.y = bar.y;
result = (&foo.x)[2];    // incorrect -- result contains old value
foo.z = bar.z;

foo.x = bar.x;
result = (&foo.x)[2];    // incorrect -- result contains old value
foo.y = bar.y;
foo.z = bar.z;

有些編譯器沒有意識到(&foo.x)[2]與foo.z的數據相同,並且它們不正確地重新排序指令。 很難找到像這樣的bug。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM