限られた数のアイテムをコンテナに格納したい。不要なオブジェクト コンストラクターの呼び出しを避けたいので、配列を使用したくありません。std::vector
暗黙的な呼び出しのため、使用したくありませんmalloc
(最大のキャッシュ コヒーレンスのためにヒープへのアクセスを最小限に抑えたい)。
そこで、次のような独自のカスタム コンテナーを定義することにしました。
template<typename T, size_t capacity> class my_array {
private:
char buffer[sizeof(T)*capacity];
...
public:
T& operator[](size_t i) { return *(T*)&buffer[i*sizeof(A)]; }
...
};
しかし、実際にこのコンテナーを使用しようとすると、厳密なエイリアス規則に違反しているというコンパイラの警告が表示されます。厳密なエイリアシングについて読み、コンパイラの最適化によって上記のコードが壊れる理由を理解しました。
どうすればこれを回避できますか?
奇妙なことに、私のコンパイラーは私のカスタムobject_pool
クラスについて何の不満も持っていません。特に、連想 STL データ構造のカスタム アロケーターとして使用しています。そのクラスは上記のものと非常によく似ています ( achar[]
を使用し、同様のキャストを行います)。2つの違いが何であるかわかりません。