struct Flat {
int a1;
int a2;
}
// a hierarchical struct which containing a struct attribute
struct NonFlat {
Flat b1;
int b2;
}
Flat f1, f2;
memcmp (&f1, &f2, sizeof f1)
в моем компиляторе это работает, то есть
f1.a1 == f2.a1, f1.a2 == f2.a2 <=> memcmp (f1, f2) == 0;
NonFlat n1, n2;
memcmp (&n1, &n2, sizeof n1) // does it also work for non-flat structs, considering the padding?
Я предполагаю, что это должно также работать для NonFlat структур. Тем не менее, в моем компиляторе, для неплоских структур, кажется, даже если атрибуты-члены равны, результат memcmp указывает, что они разные.
Функция библиотеки C memcmp выполняет побайтное сравнение мест в памяти. Как правильно указал @MSalters, это сравнение будет включать все байты заполнения.
Неважно, являются ли ваши структуры плоскими или неплоскими для любого определения плоских или не плоских. Он не заботится о семантике структуры и ничего не знает о ней.
Если байты равны, он вернет истину. В противном случае он вернет false.
Подразумевается, что для любой структуры, члены которой расположены непрерывно в памяти, она будет соответствовать, если все поля совпадают. Для любой структуры, имеющей указатели на другие места в памяти, она не будет следовать этим указателям, чтобы увидеть, совпадает ли указанная ими память, а вместо этого будет смотреть только на литеральный адрес, сохраненный в указателе, и проверять, совпадает ли это.
Ваши структуры плоские.
Неплоские структуры имеют указатели.
Также вы не инициализировали эти структуры.