std::aligned_storage
バリアント テンプレートのバッキング ストレージとして使用しています。問題は、-O2
gcc で有効にすると、「タイプがパニングされたポインターを逆参照すると厳密なエイリアシングが壊れる」という警告が表示され始めることです。
実際のテンプレートはもっと複雑です (実行時に型がチェックされます) が、警告を生成するための最小限の例は次のとおりです。
struct foo
{
std::aligned_storage<1024> data;
// ... set() uses placement new, stores type information etc ...
template <class T>
T& get()
{
return reinterpret_cast<T&>(data); // warning: breaks strict aliasing rules
}
};
これと本質的に同じことをしていると確信しboost::variant
ていますが、この問題を回避する方法を見つけることができないようです。
私の質問は次のとおりです。
- このように使用
aligned_storage
すると厳密なエイリアスに違反する場合、どのように使用すればよいですか? get()
関数に他のポインターベースの操作がない場合 、厳密なエイリアシングの問題は実際にありますか?get()
がインライン化されている場合はどうですか?- どう
get() = 4; get() = 3.2
ですか?タイプが異なるためにint
、そのシーケンスを並べ替えることができますか?float