Ответ 1
Неявно заданный конструктор копирования/перемещения для неединичного класса X выполняет поэтапную копию/перемещение его оснований и членов.
12.8/15 [class.copy] в N4141
Таким образом, бит-бит в байтах заполнения может отличаться.
Предположим, что у меня есть тип 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 кажется, что эти байты копируются. Я хотел бы знать, гарантировано ли это.
Неявно заданный конструктор копирования/перемещения для неединичного класса X выполняет поэтапную копию/перемещение его оснований и членов.
12.8/15 [class.copy] в N4141
Таким образом, бит-бит в байтах заполнения может отличаться.
Это не авторитетная, но cppreference
запись для std::memcmp
предполагает, что байты заполнения могут отличаться:
memcmp()
между двумя объектами типаstruct{char c; int n;}
будет сравнивать байты заполнения, значения которых могут отличаться, когда значенияc
иn
являются одинаковыми
учитывая, что вы спросили о типе POD (следовательно, включая союзы), стоит упомянуть, что согласно [class.copy]
Неявно определенный конструктор copy/move для объединения X копирует представление объекта (6.9) из X
что для тривиально копируемых типов также должны включать в себя биты дополнений. Таким образом, это может быть просто заменой A на
union A{ struct {
char a;
int b;
}; };
(на самом деле выше используется нестандартная анонимная структура, но вы получаете точку...)
Отвечая на ваш второй вопрос:
Эквивалентно, если я передаю базовые байты некоторых объектов A другой программе, которая не понимает их значение или структуру, и обрабатывает их как массив из 8 байтов, может ли эта другая программа безопасно сравнивать два как для равенства?
Поскольку объект вашего типа может содержать байты заполнения, другая программа обычно не может сравнивать два таких объекта для равенства:
Зная, какие биты байтов, которые составляют объект семантически, являются ключом для определения его представления представления . Однако в этом случае целевая программа знает только представление object, то есть последовательность bytes, представляющую такой объект в памяти, включая байты заполнения. Функция, подобная memcmp, может сравнивать только такие объекты, представление значений которых идентично представлению объекта значимым образом. Если вы используете его для сравнения объектов по значению, даже если у них есть отступы, он может не дать правильные результаты, так как он не может определить, какие биты в представлении объекта не имеют значения, чтобы представления двух объектов были равны.