Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Unie i niezdefiniowane zachowanie w C++17

Ostatnio zmodyfikowano 2018-03-15 20:21
Autor Wiadomość
luks
Temat założony przez niniejszego użytkownika
Unie i niezdefiniowane zachowanie w C++17
» 2018-03-13 00:19:18
Cześć.

Poniższy program drukuje:
1
2
1
2

Czy zawiera on niezdefiniowane zachowanie, gdy bierzemy pod uwagę standard C++17?

C/C++
#include<iostream>

using namespace std;

struct A {
    int first;
    int second;
};

struct B {
    int first;
    int second;
};

struct Test {
    union {
        A a;
        B b;
    };
};

int main() {
    Test t;
    t.a.first = 1;
    t.b.second = 2;
    cout << t.a.first << '\n';
    cout << t.a.second << '\n';
    cout << t.b.first << '\n';
    cout << t.b.second << '\n';
    return 0;
}
P-169973
latajacaryba
» 2018-03-13 01:44:39
The union is only as big as necessary to hold its largest data member. The other data members are allocated in the same bytes as part of that largest member. The details of that allocation are implementation-defined, and it's undefined behavior to read from the member of the union that wasn't most recently written. Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union.
źródło

EDIT: powód to pewnie (jak to w 99% bywa) zła nazwa.
P-169974
luks
Temat założony przez niniejszego użytkownika
» 2018-03-13 01:45:25
Kolego, który przeniosłeś ten wątek. Kultura wymaga, aby podać powód przeniesienia. Skoro człowiek posługujący się skrzynką bjarne@stroustrup.com był w stanie ustosunkować się do mojego pytania, to ty tym bardziej powinieneś, skoro gmerasz przy wątku.
P-169975
luks
Temat założony przez niniejszego użytkownika
» 2018-03-13 01:49:00
it's undefined behavior to read from the member of the union that wasn't most recently written -> struktury z przykładu mają common initial sequence, więc można czytać nieaktywne pola union
P-169976
pekfos
» 2018-03-13 01:50:49
Kultura wymaga, by zapoznać się z zasadami zakładania tematów. Jak chcesz powód, to proszę: Brak formatowania. Brak opisu - podałeś kod i pytasz czy jest poprawny, zawężając tylko pytanie do UB. Z perspektywy czasu taki temat jest bezużyteczny i do właśnie takiego działu trafił.
P-169977
luks
Temat założony przez niniejszego użytkownika
» 2018-03-13 02:02:20
No tak, podałem kod i pytam, czy jest poprawny. Szczyt bezczelności. A co byś chciał? Mam ci tutaj wkleić 30 nagłówków i napisać opis dziedzinowy na 30 stron? Kolego, kod jest przejrzysty, zawiera meritum, więc nie mydl mi oczu formatowaniem. Jeżeli uważasz, że pytania dotyczące UB są bezużyteczne, to nie mamy o czym rozmawiać. Poczytaj sobie np. o UBSan. Korporacja Google nie utworzyłaby takiego narzędzia, gdyby UB było sprawą marginalną.
P-169978
luks
Temat założony przez niniejszego użytkownika
» 2018-03-13 03:13:03
Na http://en.cppreference.com/w​/cpp/language/data_members mamy:

"If a standard-layout union holds two (or more) standard-layout structs as members, and these structs have a common initial sequence of data members, it is well-defined to examine any member of that common initial sequence regardless of which member of the union is active."
P-169979
garlonicon
» 2018-03-13 06:40:39
Ciekawe podejście. Widzę, że C++ zmierza w stronę paradygmatu funkcyjnego. Ciekawe, czy w C++20 będzie kacza typizacja (ang. duck typing)? Bo to, co podajesz, to w sumie jest coś takiego: nazwa może być inna, byle typy się zgadzały - jak coś wygląda jak kaczka (pola) i kwacze jak kaczka (metody), to znaczy, że to jest kaczka (obiekt danego typu) i można go tak traktować. W tym przypadku to samo dotyczy unii. Nie wiem, czy to jest zgodne ze standardem, ale domyślam się, do czego takie podejście może prowadzić.

Jak chcesz powód, to proszę: Brak formatowania.
Pewnie chodziło o to, aby kod był w znacznikach [cpp]tutaj kod źródłowy[/cpp].

Brak opisu - podałeś kod i pytasz czy jest poprawny, zawężając tylko pytanie do UB. Z perspektywy czasu taki temat jest bezużyteczny i do właśnie takiego działu trafił.
Uważam, że to pytanie jest dość istotne. Jeśli można tak pisać, to znaczy, że mamy coś w rodzaju wcześniej opisanej kaczej typizacji dla unii. A jak nie, to w praktyce trzeba napisać więcej bardziej skomplikowanego kodu, aby osiągnąć to samo.

Dopisano:
@ktokolwiekMającyUprawnienia: zmienić tytuł na jakiś lepszy, choćby "Kacza typizacja w uniach" (nie miałem lepszego pomysłu), dorzucić formatowanie do pierwszego postu i wyciągnąć ten temat z bezużytecznych. Nie kojarzę, abyśmy mieli podobny temat na forum, a to może być przydatne choćby przy omawianiu rodzajów typizacji w kursie (jeśli coś takiego jest planowane).
P-169981
« 1 » 2 3 4
  Strona 1 z 4 Następna strona