2017-10-22 9 views
45

Załóżmy, że mam typ POD tak:Czy kopiowane są bajty dopełnienia typu POD?

struct A { 
    char a; 
    int b; 
}; 

W moim systemie, sizeof(A) == 8, choć sizeof(char) == 1 i sizeof(b) == 4. Oznacza to, że struktura danych ma 3 nieużywane bajty.

Załóżmy teraz robimy

A x = ...; 
A y =x; 

Pytanie:

To jest zagwarantowane, że wszystkie 8 bajtów x i y będą identyczne, nawet te 3 nieużywane?

Równoważnie, jeśli przeniosę podstawowe bajty niektórych obiektów o numerach do innego programu, który nie rozumie ich znaczenia lub struktury, i traktuje je jako tablicę o długości 8 bajtów, czy ten inny program może bezpiecznie porównać dwie wartości równe A?

Uwaga: In an experiment with gcc 7, wydaje się, że te bajty zostaną skopiowane. Chciałbym wiedzieć, czy jest to zagwarantowane.

+0

pokrewne: https: // stackoverflow.com/a/1575369/955273 –

+1

Nie sądzę, żeby dupek odpowiadał na pytanie "są to dopełniające bajty tak samo". Mówi tylko, że memcpy je kopiuje, ale nie jest to dokładnie to, o co prosił OP. – vsoftco

+5

@vsoftco * "' = 'jest wymagane tylko do skopiowania członków. Może to, ale nie musi, skopiować dopełnienie." * Drugi akapit w górnej odpowiedzi. –

Odpowiedz

40

niejawnie zdefiniowane konstruktor kopii/przejście przez nie związków klasy X wykonuje kopie memberwise/przenoszenie jego zasad i członków.

12,8/15 [class.copy] w N4141

wzór bitowy w bajtach wypełniających ten sposób mogą się różnić.

+0

To trochę niefortunne, że N4141 jest [chroniony hasłem] (https://stackoverflow.com/questions/27180058/which-c-draft). Wygląda na to, że jest to ostateczny standard dla C++ 14. Wersja robocza [N4140] (https://github.com/cplusplus/draft/blob/master/papers/n4140.pdf), informacja jest [z tego wątku Reddit] (https: //www.reddit. com/r/cpp/comments/2sewtw/c14_published_by_iso_today /). Nie mogę powiedzieć, że ufam temu wątkowi reddit w 100%. W tym przypadku jest 12.8/16, a nie 15. Czy istnieje gdzieś skierowany wykres, gdzie standardy i szkice są węzłami, a krawędź oznacza _jest częścią_? –

+3

@StefanHanke Właściwie źródło N4141 jest dostępne na github, po prostu trzeba go zbudować samodzielnie. https://github.com/cplusplus/draft/tree/n4141 –

+4

"W rzeczywistości źródło N4141 jest dostępne na github, po prostu trzeba go zbudować samodzielnie" To jest bardzo C++ rzecz do powiedzenia. – pmf

8

To nie jest miarodajne, ale wejście cppreference „s dla std::memcmp sugeruje, że bajty wypełniające mogą się różnić:

memcmp() między dwoma obiektami typu struct{char c; int n;} porówna bajty wypełniające, których wartości mogą się różnić, gdy wartości c i n są takie same

+9

Nie wiesz, co to ma wspólnego z kopiowaniem? – imallett

4

odpowiadając na drugie pytanie:

Równoważnie, jeśli przeniosę leżące poniżej bajty niektórych obiektów A do innego programu, który nie rozumie ich znaczenia lub struktury, i traktuje je jako tablicę o długości 8 bajtów, czy ten inny program może bezpiecznie porównać dwa? Jeśli chodzi o równość?

jako obiekt typu może zawierać bajty wypełniające, inny program na ogół nie można porównać dwa takie obiekty dla równości:

wiedząc który bity bajtów, które czynią z przedmiotem semantycznie jest kluczem do definiowania swojej wartości reprezentacji wartości:. Jednak w tym scenariuszu program docelowy zna tylko obiektową reprezentację obiektu, tj. Sekwencję bajtów reprezentujących taki obiekt w pamięci, w tym bajty dopełnienia.Funkcja taka jak memcmp może porównywać tylko takie obiekty, których reprezentacja wartości jest identyczna z reprezentacją obiektu w znaczący sposób. Jeśli użyjesz go do porównywania wartości obiektów, nawet jeśli mają dopełnienie, może nie dać odpowiednich wyników, ponieważ nie może stwierdzić, które bity w reprezentacji obiektu są nieistotne dla reprezentacji wartości dwóch obiektów, aby były równe.

Zobacz http://en.cppreference.com/w/cpp/language/object

6

skoro pytasz o rodzaju POD (stąd w tym związków zawodowych), warto wspomnieć, że zgodnie z [class.copy]

niejawnie zdefiniowane copy/konstruktora posunięcie dla związku X kopiuje reprezentacji przedmiotem (6,9), z X

że trywialny copyable Ty pes powinien również zawierać bity dopełniające. Tak, to może być tylko kwestia zastępowania z

union A{ struct { 
    char a; 
    int b; 
}; }; 

(faktycznie, powyższe wykorzystuje niestandardowe anonimowy struct, ale o co chodzi ...)

+0

Odpowiedni link: https://stackoverflow.com/questions/26241397/difference-between-object-and-value-representation-by-example – MSalters

Powiązane problemy