2017-06-06 90 views
5

Powiedzmy, że mam strukturę z 2 polami i implementacją C, która również ma pewne dopełnienie między tymi polami.Czy struktura przypisania gwarantuje, że dopełnienie będzie równe?

Jeśli utworzę dwie zmienne struktury i przypiszę jeden do drugiego, czy dopełnienie będzie gwarantowane jako równe?

Wiem, że dla większości kompilatorów będzie tak (ponieważ po prostu nazywają się memcpy), ale chcę wiedzieć, co jest określone w dopełnieniu w standardzie?

Intencja dla tego pytania to, czy mogę użyć memcmp, aby sprawdzić równość struktur.

Powiedz, że mam kompilator, który emituje kod, który po prostu przypisuje wszystkich członków struktury zamiast wykonywania memcpy, czy będzie to poprawna implementacja przypisania operacji struct?

+1

Jesteś zaniepokojony wartościami dopełnienia *, a nie rozmiarami, prawda? –

+0

Na ogół wyściółka nie będzie taka sama. Wygląda na to, że nie został zainicjowany.W przypadku 'x = y', myślę, że czy dopełnienie jest takie samo, czy nie, zależy od implementacji. – BLUEPIXY

+0

@EugeneSh. tak, wartości wypełnienia, Wielkość wypełnienia będzie taka sama, ponieważ są one tej samej struktury. –

Odpowiedz

6

Standardowe mówi w note 51 of 6.2.6.1 General:

Tak więc, na przykład, przyporządkowanie struktury nie musi skopiuje bity wypełniające.

+0

Dzięki, że rozwiązuje problem bezpośrednio. Notatka informacyjna 52 również bezpośrednio mówi o memcmp. Ale to już koniec ==. Ten sam pomysł. –

+0

Tak, 52 też jest interesujące. Czy uważasz, że powinno to zostać dodane? –

+0

Ściśle mówiąc chodzi o operator ==, który nie jest dostępny dla struktur. Ale możesz dodać to jako dodatkowe, aby prawdopodobnie rzucić nieco światła na motywację, która jest za tym zaprojektowana. –

1

Nie sądzę, że można użyć memcmp, ponieważ pamięć między elementami (tj. Zawartość w "dopełnieniu") nie ma pewnej wartości i przypisanie takiego obiektu struct do inny nie jest wymagany do kopiowania zawartości wypełnienia.

+0

Moje przeczucie jest twoje, ale ponieważ jest to pytanie [język-prawnik], musisz dostarczyć dowód ze Standardu :) – Quentin

+0

Więc zasadniczo masz na myśli to, że wywołanie memcmp na struct z padding byłoby niezdefiniowanym zachowaniem, ponieważ jesteś próbując odczytać bajty, które nie zostały zainicjowane? –

+0

Co się stanie, jeśli struktura na RHS zadania zostanie zainicjowana za pomocą memsetu? –

6
6.2.6.1 Ogólne
...
      Gdy wartość jest przechowywana w strukturze przedmiotu lub związków typu, w tym w państwie obiektu, bajty reprezentacja obiektu, która odpowiada dowolnemu bajtowi dopełnienia, powoduje nieokreślone wartości. 51) Wartość obiektu struktury lub związku nie jest reprezentacją pułapki, nawet jeśli wartość elementu struktury lub obiektu związku może być reprezentacją pułapki.

      Gdy wartość jest przechowywana w elemencie obiektu typu Unii, bajtów reprezentacji obiektu które nie odpowiadają temu członkowi ale nie odpowiadają innym członkom przyjmować wartości nieokreślone. 51) Na przykład przypisanie struktury nie musi kopiować żadnych bitów dopełnienia.

C 2011 Online Draft

Przypis 51 bezpośrednio kieruje swoje pytanie - zawartość bitów wypełniających nie mogą być kopiowane w zadania, więc memcmp może nie działać na porównywaniu dwóch structs równości.

+0

Dzięki, że rozwiązuje mój problem. –

+0

Akceptacja odpowiedzi @ EugeneSh, ponieważ została ona odebrana jako pierwsza. –