Skip to content

Instantly share code, notes, and snippets.

@savanovich
Created March 5, 2015 10:53
Show Gist options
  • Save savanovich/5e04c9daf17b882295dd to your computer and use it in GitHub Desktop.
Save savanovich/5e04c9daf17b882295dd to your computer and use it in GitHub Desktop.
C: Do not allow structure padding
struct test_t {
int a;
char b;
int c;
} __attribute__((__packed__));
@savanovich
Copy link
Author

http://habrahabr.ru/post/142662/#comment_4777709
Это всё, конечно, хорошо. Но, как уже правильно отметили в комментариях, непереносимо, а на некоторых платформах и попросту небезопасно. Из лично известных мне — SPARC весьма щепетильно относится к выравниванию данных, и генерит исключение SIGBUS в случае доступа к неправильно выравненным данным.
Спасаться от лишнего паддинга можно и без pragma pack. Рецепт прост — поля в структуре «сортируются» по размеру. В начале помещаются самые большие (uint64, uint32), в конце — самые маленькие — (uint8). Все вопросы с порядком байт должны (на мой взгляд) решаться в точке сериализации и десериализации данных (ну, например, при отправке в сеть и получения из сети), а сам этот процесс, по хорошему, должен производиться не сразу в структуру, а путём последовательного чтения данных из буфера и размещения в соответствующих полях в специфичном для платформы виде. Может быть это не так «просто» и «изящно» выглядит, зато надёжно, переносимо и расширяемо.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment