Размер структур в Objective-C и C ++ - PullRequest
3 голосов
/ 04 января 2012

Я конвертирую некоторый код Objective-C ++ в обычный Objective-C, и у меня возникли некоторые проблемы со структурами.Для обоих языков у меня есть структура, объявленная в файле .h следующим образом.

struct BasicNIDSHeader {
    short messageCode;
    short messageDate;
    int messageTime;
    int messageLength;
    short sourceID;
    short destID;
    short numberOfBlocks;
};

В C ++ структура объявляется как

BasicNIDSHeader header;

и в Objective-C Iсделать это

struct BasicNIDSHeader header;

Код для их использования фактически одинаков на обоих языках.

memset(&header, 0, sizeof(header));
[[fileHandle readDataOfLength:sizeof(header)] getBytes:&header];

, где fileHandle - NSFileHandle.

Проблема в чемисходный код C ++, sizeof (header) = 18. При использовании Objective-C sizeof (header) = 20.

Есть идеи, почему это происходит или как это исправить?Код зависит от размера, как в C ++.Я могу просто жестко закодировать это, но хотел бы иметь лучшее понимание того, почему это происходит.Плюс я ненавижу жесткие константы.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Если вы зависите от структуры внутренней памяти ваших struct s - вы должны отключить заполнение. Это называется «упакованным», и разные компиляторы по-разному сигнализируют об этом.

В GCC вы делаете это с ключевым словом __attribute__. Подробности здесь .

0 голосов
/ 04 января 2012

Я могу говорить только за C ++.В C ++ есть особенность реализации, которая выравнивает данные по определенным адресам, так что данные могут быть эффективно обработаны.

В MS Visual C ++ вы можете принудительно выровнять байты с помощью прагмы:

#pragma pack(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...