Я использую 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
таким образом нарушает строгое сглаживание, как мне его использовать? - Is there actually a strict-aliasing problem in
get()
given that there are no other pointer based operations in the function?- What about if
get()
is inlined? - А как насчет
get() = 4; get() = 3.2
? Может ли эта последовательность быть переупорядочена из-за того, чтоint
иfloat
являются разными типами?
- What about if
aligned_storage
в отличие от любого другого типа в качестве буфера не должно иметь никакого значения. Причина, по которой я указал здесьaligned_storage
, заключается в том, что он, кажется, был разработан с учетом такого рода использования. - person marack   schedule 08.10.2013aligned_storage
напрямую. Я отредактировал свой ответ, чтобы попытаться сделать это (даже) более ясным. - person rici   schedule 08.10.2013