Re[3]: Как обойти strict aliasing rule?
От: Eeel Россия  
Дата: 20.06.16 14:09
Оценка:
Здравствуйте, alexanius, Вы писали:

A>А вот тут один интересный момент. В стандарте не говорится что это UB. Более того, там есть сноска в которой утверждается что в подобной ситуации происходит реинтерпретация данного участка памяти. По идее с точки зрения strict-aliasing здесь тоже всё должно быть нормально.


A>

A>6.5.2.3 Structure and union members
A>...

Это секция стандарта C99 ("чистого си"), а не C++. Насколько я понимаю, в C++ этот момент отличается (что плохо).

В C++ там есть только оговорка насчет структур с одинаковым префиксом.

  C++ 14 9.5.1
In a union, at most one of the non-static data members can be active at any time, that is, the value of at
most one of the non-static data members can be stored in a union at any time. [ Note: One special guarantee
is made in order to simplify the use of unions: If a standard-layout union contains several standard-layout
structs that share a common initial sequence (9.2), and if an object of this standard-layout union type
contains one of the standard-layout structs, it is permitted to inspect the common initial sequence of any of
standard-layout struct members; see 9.2. — end note ]...

struct A
{
    int a;
    int b;
    double c;
};
struct B
{
    int a;
    int b;
    float c;
};
union Foo
{
    A a;
    B b;
};
Foo foo;

Здесь допустимо записать foo.a.a и foo.a.b, и прочитать, соответственно, foo.b.a и foo.b.b.
Отредактировано 27.06.2016 18:09 S. Schlongberg . Предыдущая версия . Еще …
Отредактировано 21.06.2016 9:56 S. Schlongberg . Предыдущая версия .
Отредактировано 21.06.2016 9:56 S. Schlongberg . Предыдущая версия .
Отредактировано 21.06.2016 9:52 S. Schlongberg . Предыдущая версия .
Отредактировано 20.06.2016 14:18 S. Schlongberg . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.