[英]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.