Когда sizeof (int) не равен 4 байтам в Objective-C? - PullRequest
5 голосов
/ 07 марта 2011

Я использую сетевую среду с открытым исходным кодом, которая позволяет разработчикам легко общаться через службу, обнаруженную с помощью Bonjour в Objective-C.

Есть несколько строк, которые заставили меня быть в восторге отНекоторое время назад, даже если кажется, что они никогда не вызывали каких-либо проблем на любых машинах, которые я тестировал, независимо от того, использую ли я 32-битную или 64-битную версию моего приложения:

int packetLength = [rawPacketData length];
[outgoingBuffer appendBytes:&packetLength length:sizeof(int)];
[outgoingBuffer appendData:rawPacketData];
[self writeToStream];

Обратите внимание, что первой отправляемой информацией является длина пакета данных, которая является довольно стандартной, а затем отправляются сами данные.Что пугает меня, так это длина длины .Будет ли одна машина когда-нибудь предполагать, что значение int равно 4 байтам, а другая машина считает, что значение int равно 8 байтам?

Если два размера могут быть разными на разных машинах, что может вызвать это?Зависит ли это от моего компилятора или от архитектуры компьютера конечного пользователя?И, наконец, если это проблема, как я могу взять 8-байтовое int и сократить его до 4-байтов, чтобы обеспечить обратную совместимость?(Поскольку мне никогда не потребуется больше 4 байтов для представления размера пакета данных.)

Ответы [ 4 ]

15 голосов
/ 07 марта 2011

Вы не можете предполагать, что sizeof(int) всегда будет четырьмя байтами.Если размер имеет значение, вы должны либо жестко закодировать размер 4 (и написать код для сериализации значений в четырехбайтовые массивы с надлежащим порядком байтов), либо использовать типы, такие как int32_t, определенные в <stdint.h>.

(Тем не менее, на практике большинство поставщиков компиляторов решили, что int должно оставаться четыре байта, поэтому вам , вероятно, не нужно беспокоиться о том, что завтра все сломается. Опять же, это не былоt так давно, что многие поставщики компиляторов допускают, что int будет двумя байтами, что приводит к множеству проблем, когда ints становится четырьмя байтами, поэтому вам действительно следует поступить правильно, так что защититесь от будущих изменений.)

2 голосов
/ 07 марта 2011

Может быть иначе, но это зависит от компилятора больше, чем от машины. Другой компилятор может переопределить int как 8 байт.

1 голос
/ 07 марта 2011

Размер int зависит от архитектуры машины;Размер int почти всегда будет размером шины данных, если только ваш компилятор C не сделает что-то особенное и не изменит его.

Это означает, что размер int не равен 4 байтам, когда вы компилируете свою программу в 8-битном режиме., 16-битная или 64-битная машина / архитектура.

Я бы определил константу для размера буфера вместо использования размера int.

Надеюсь, это ответит на ваш вопрос.

0 голосов
/ 07 марта 2011

Я думал, что только long отличается по размеру на 32 или 64-битных системах?

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