我使用std::aligned_storage
作爲變體模板的後備存儲。問題是,一旦我在gcc上啓用了-O2
,我開始收到警告'dereferencing type-punned pointer will break strict aliasing`。如何在使用aligned_storage時避免嚴格的混疊錯誤
真正的模板要複雜得多(類型在運行時檢查),但一個小例子,生成警告:
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
是不同的類型,該序列是否可以重新排序?
- 如果
不對齊以任何方式影響的別名問題?希望它是原因的一部分(但是這並不會改變標準對它的態度,doens't?) – dhein
@Zaibis不,使用'aligned_storage'而不是任何其他類型作爲緩衝區shouldn'沒有任何區別。我在這裏指定'aligned_storage'的原因是,它似乎是爲了這種用途而設計的。 – marack
@marack:你不應該(並且不允許)直接使用'aligned_storage'。我編輯了我的答案,試圖使(更)更清楚。 – rici