Подтвердить что ты не робот

Убирают ли байты заполнения типа POD?

Предположим, что у меня есть тип POD:

struct A {
    char a;
    int b;
};

В моей системе sizeof(A) == 8, хотя sizeof(char) == 1 и sizeof(b) == 4. Это означает, что структура данных содержит 3 неиспользуемых байта.

Предположим теперь, что

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

Вопрос:

Гарантируется ли то, что все 8 байтов x и y будут идентичными, даже эти 3 неиспользуемые?

Эквивалентно, если я передаю базовые байты некоторых объектов A в другую программу, которая не понимает их значение или структуру, и рассматривает их как массив из 8 байтов, может ли эта другая программа безопасно сравнить два A для равенство?

Примечание: В эксперименте с gcc 7 кажется, что эти байты копируются. Я хотел бы знать, гарантировано ли это.

4b9b3361

Ответ 1

Неявно заданный конструктор копирования/перемещения для неединичного класса X выполняет поэтапную копию/перемещение его оснований и членов.

12.8/15 [class.copy] в N4141

Таким образом, бит-бит в байтах заполнения может отличаться.

Ответ 2

Это не авторитетная, но cppreference запись для std::memcmp предполагает, что байты заполнения могут отличаться:

memcmp() между двумя объектами типа struct{char c; int n;} будет сравнивать байты заполнения, значения которых могут отличаться, когда значения c и n являются одинаковыми

Ответ 3

учитывая, что вы спросили о типе POD (следовательно, включая союзы), стоит упомянуть, что согласно [class.copy]

Неявно определенный конструктор copy/move для объединения X копирует представление объекта (6.9) из X

что для тривиально копируемых типов также должны включать в себя биты дополнений. Таким образом, это может быть просто заменой A на

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

(на самом деле выше используется нестандартная анонимная структура, но вы получаете точку...)

Ответ 4

Отвечая на ваш второй вопрос:

Эквивалентно, если я передаю базовые байты некоторых объектов A другой программе, которая не понимает их значение или структуру, и обрабатывает их как массив из 8 байтов, может ли эта другая программа безопасно сравнивать два как для равенства?

Поскольку объект вашего типа может содержать байты заполнения, другая программа обычно не может сравнивать два таких объекта для равенства:

Зная, какие биты байтов, которые составляют объект семантически, являются ключом для определения его представления представления . Однако в этом случае целевая программа знает только представление object, то есть последовательность bytes, представляющую такой объект в памяти, включая байты заполнения. Функция, подобная memcmp, может сравнивать только такие объекты, представление значений которых идентично представлению объекта значимым образом. Если вы используете его для сравнения объектов по значению, даже если у них есть отступы, он может не дать правильные результаты, так как он не может определить, какие биты в представлении объекта не имеют значения, чтобы представления двух объектов были равны.

См. http://en.cppreference.com/w/cpp/language/object