Сериализация бинарной структуры gcc против cl - PullRequest
0 голосов
/ 24 августа 2010

Полное раскрытие - это домашняя работа, хотя она завершена и полностью работает, я ищу лучшее решение.

У меня есть двоичный файл, который был создан программой, скомпилированной в Visual Studio (я полагаю). Структура выглядит примерно так.

struct Record {
    char c;
    double d;
    time_t t;
};

Размер этой структуры в Windows с Visual Studio 2008 дает 24 байта. 1 + 8 + 8 = 24. Так что там происходит некоторое дополнение. Одна и та же структура в Linux и gcc дает 16 байтов. 1 + 8 + 4 = 16. Чтобы выстроить это в ряд, я добавил некоторые отступы и изменил time_t на другой тип. Итак, моя структура выглядит следующим образом.

struct Record {
    char c;
    char __padding[7];
    double d;
    long long t;
};

Теперь это работает, и gcc дает свой размер в 24 байта, но кажется немного грязным. Итак, два вопроса ..

Почему это реализовано по-разному между двумя компиляторами?

Есть ли варианты типа __attribute__ ((aligned)) или какие-либо другие более чистые решения для этого?

1 Ответ

1 голос
/ 24 августа 2010

Разница проистекает из того, используем ли мы 32-битное выравнивание double по умолчанию или 64-битное выравнивание double по умолчанию.На 32-битной машине наличие двойного на 64-битной границе может иметь некоторые преимущества, но, вероятно, оно невелико.В этом случае VC, вероятно, более осторожен, чем gcc.

Суть в том, что если вы используете структуры для сериализации, вы должны ВСЕГДА делать их упакованными (т.е. выровненными по 8 битам), а затем выполнять выравнивание вручную.Таким образом, ваш код обязательно будет совместим на разных платформах.

...