エンティティ ベースのコンポーネント システムを開発しており、特定のインデックスをコンポーネント タイプに割り当てようとしています。
static std::size_t getNextTypeId() {
static std::size_t lastTypeIdBitIdx{0};
++lastTypeIdBitIdx;
// This line produces the output at the end of the question
std::cout << lastTypeIdBitIdx << std::endl;
return lastTypeIdBitIdx;
}
// I'm assuming that TypeIdStorage<T1>::bitIdx will always be different
// from TypeIdStorage<T2>::bitIdx
template<typename T> struct TypeIdStorage {
static const std::size_t bitIdx;
};
// This line statically initializes bitIdx, getting the next id
template<typename T> const std::size_t TypeIdStorage<T>::bitIdx{getNextTypeId()};
私のゲーム コードでは、次のように宣言された約 20 のコンポーネント タイプがあります。
struct CPhysics : public sses::Component { ... };
struct CHealth : public sses::Component { ... };
struct CWeapon : public sses::Component { ... };
// and so on...
私のエンティティシステムコードでは、コンポーネントタイプの1つであることを数回使用TypeIdStorage<T>::bitIdx
しT
ています-これが起こることを期待しています:
- 存在する場合
TypeIdStorage<T>
は、単純に を返しTypeIdStorage<T>::bitIdx
ます。 - 存在しない場合は、作成して で初期化
bitIdx
しgetNextTypeId()
ます。
これは、アプリケーションを実行したときに出力されるものです。
1 2 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
getNextTypeId()
呼び出しで同じ番号が返される可能性はありますか? この種の出力は不可能なはずです。
静的変数が繰り返されずにインクリメントされることが保証されていませんか? 私はここで本当に混乱しています。
デバッグモードとリリースモードの両方で、 g++ 4.8.1とclang++ 3.4の両方でテスト済み。同じ出力。
valgrindは興味深いものを出力しません。
clang++ のAddressSanitizerも興味深いものを出力しません。
プログラムのエントリ ポイントを に設定するとint main() { return 0; }
、まったく同じ出力が生成されます。問題はコンパイル時ですが、どうすれば可能ですか? これは私には不可能な状況のように思えます。