Поля бит не переносятся в том же смысле, что и целые числа, не переносимые. Вы можете использовать целые числа для записи переносимой программы, но вы не можете ожидать отправки двоичного представления int
, как и на удаленном компьютере, и ожидать, что он правильно интерпретирует данные.
Это связано с тем, что 1. длина слов в процессорах различается, и из-за этого размеры целочисленных типов различаются (длина в 1,1 байт может также различаться, но в наши дни это редкость вне встроенных систем). А потому, что 2. байтовая сущность отличается от разных процессоров.
Эти проблемы легко преодолеть. Собственная энсианность может быть легко преобразована в согласованную консистенцию (большой эндиан является стандартом де-факто для сетевого общения), и размер может быть проверен во время компиляции, а целые числа фиксированной длины доступны в эти дни. Поэтому целые числа могут использоваться для связи по сети, если эти данные будут учтены.
Бит-поля строятся на обычных целых типах, поэтому они имеют те же проблемы с контентом и целыми размерами. Но у них есть even more реализация указанного поведения.
Все о фактических деталях распределения битовых полей в объекте класса
- Например, на некоторых платформах, битовые поля не Straddle байт, на других они делают
- Кроме того, на некоторых платформах битовые поля упаковываются слева направо, другие справа налево
Независимо от того, r, short, int, long и long long бит, которые явно не подписаны или не обозначены, подписаны или без знака.
В отличие от байтов, это не так просто, чтобы преобразовать «все о фактических деталях распределения» в канонической форме.
Кроме того, в то время как endianness является специфической архитектурой процессора, данные о поле бит специфичны для реализации компилятора. Таким образом, битовые поля не переносятся для связи даже между отдельными процессами на одном компьютере, если мы не можем гарантировать, что они были скомпилированы с использованием того же (версии) компилятора.
TL; бит битовых полей не является переносным способом связи между компьютерами. Целые числа тоже не являются, но их не-переносимость легко обойти.
В каком контексте они назывались «небезопасными»? Добавить ссылку? – anatolyg
Я думаю, что в большинстве случаев люди злоупотребляют битовыми полями, чтобы извлекать фрагменты других типов данных на суббайтных уровнях, которые совершенно не переносятся. – user2357112
@anatolyg [комментарий Лундина] (http://stackoverflow.com/questions/35934375/bitfields-in-c-programming-language/35935493#comment59526628_35934375) на [этот вопрос] (http://stackoverflow.com/questions/ 35934375/битовая-в-с-язык программирования/35935493). Конечно, я не видел, чтобы их обвиняли в том, что они «небезопасны», поскольку у меня есть «не переносные», но все же. – Pharap