У меня есть структура, определенная следующим образом:
struct s_zoneData {
bool finep = true;
double pzone_tcp = 1.0;
double pzone_ori = 1.0;
double pzone_eax = 1.0;
double zone_ori = 0.1;
double zone_leax = 1.0;
double zone_reax = 0.1;
};
Я создал оператор сравнения:
bool operator==(struct s_zoneData i, struct s_zoneData j) {
return (memcmp(&i, &j, sizeof(struct s_zoneData)) == 0);
}
В большинстве случаев сравнение не удавалось, даже для идентичных переменных. Мне потребовалось некоторое время (и я возился с gdb), чтобы понять, что проблема в том, что байты заполнения для элемента структуры finep
являются неинициализированным мусором. Для справки, на моей машине (x64) sizeof(struct s_zoneData)
равно 56, что означает, что для элемента finep
имеется 7 байтов заполнения.
Сначала я решил проблему, заменив memcmp
сравнением значений с плавающей точкой на основе ULP для каждого члена структуры, потому что я думал, что могут возникнуть проблемы с округлением. Но теперь я хочу углубиться в эту проблему и увидеть возможные альтернативные решения.
Вопрос в том, есть ли способ указать значение для байтов заполнения для разных компиляторов и платформ? Или, переписав его как более общий вопрос, потому что я мог бы быть слишком сосредоточен на своем подходе, каков будет правильный способ сравнения двух struct s_zoneData
переменных?
Я знаю, что создание фиктивной переменной, такой как char pad[7]
, и инициализация ее нулями должны решить проблему (по крайней мере, для моего конкретного случая), но я читал несколько случаев, когда у людей возникали проблемы с выравниванием структуры для разных компиляторов и порядок членов, поэтому я бы предпочел использовать стандартное решение, если таковое существует. Или, по крайней мере, что-то, что гарантирует совместимость для разных платформ и компиляторов.