Pola bitowe są nieprzenośne w takim samym znaczeniu, jak liczby całkowite są nieprzenośne. Możesz używać liczb całkowitych do napisania programu przenośnego, ale nie możesz oczekiwać, że wyślesz binarną reprezentację int
jak do zdalnego komputera i spodziewasz się, że poprawnie zinterpretuje dane.
Dzieje się tak dlatego, że 1. długości słowa procesorów są różne, a przez to różnią się rozmiarami typów całkowitych (długość 1,1 bajtów również może być różna, ale obecnie jest to rzadkość na zewnątrz systemów wbudowanych). A ponieważ 2. endianness bajt różni się w procesorach.
Problemy te są łatwe do przezwyciężenia. Rodzimy endianness może być łatwo przekonwertowany do uzgodnionej endianness (duży endian jest de facto standardem dla komunikacji sieciowej), a rozmiar może być kontrolowany w czasie kompilacji, a liczba stałych typów całkowitych jest dostępna w tych dniach. Dlatego można używać liczb całkowitych do komunikowania się w sieci, o ile te szczegóły są zadbane.
Pola bitów opierają się na zwykłych typach całkowitych, więc mają takie same problemy z endianness i liczbami całkowitymi. Ale mają one określone zachowanie implementacji even more.
Wszystko o rzeczywistych szczegółów alokacji pól bitowych wewnątrz obiektu klasy
- Na przykład, na niektórych platformach, pola bitowe nie STRADDLE bajtach na innych robią
- Ponadto na niektórych platformach pola bitowe są zapakowane od lewej do prawej, a inne od prawej do lewej:
Niezależnie od tego, czy r, krótkie, długie, długie i długie długie pola bitów, które nie są jawnie podpisane lub niepodpisane, są podpisane lub niepodpisane.
przeciwieństwie endianness, to nie jest trywialny do konwersji „wszystko o rzeczywistych szczegółów rozdziału” do postaci kanonicznej.
Ponadto, podczas gdy endianness jest specyfikacją architektury procesora, szczegóły pola bitowego są specyficzne dla implementatora kompilatora. Tak więc pola bitowe nie są przenośne do komunikacji nawet pomiędzy oddzielnymi procesami w obrębie tego samego komputera, chyba że możemy zagwarantować, że zostały skompilowane przy użyciu tego samego (wersji) kompilatora.
Pola bitowe TL nie są przenośnym sposobem komunikacji między komputerami. Liczby całkowite też nie są, ale ich nieprzenośność jest łatwa do obejścia.
W jakim kontekście zostały one nazwane "niebezpieczne"? Dodaj link? – anatolyg
Myślę, że głównie w ten sposób ludzie nadużywają bitfieldów do wydobywania fragmentów reprezentacji innych typów danych na poziomach pod-bajtów, co jest całkowicie nieprzenośne. – user2357112
@anatolyg [Komentarz Lundina] (http://stackoverflow.com/questions/35934375/bitfields-in-c-programming-language/35935493#comment59526628_35934375) na [to pytanie] (http://stackoverflow.com/questions/ 35934375/bitfields-in-c-język programowania/35935493). To oczywiste, że nie widziałem, by oskarżano ich o bycie "niebezpiecznymi" tak samo jak "nieprzenośnych", ale nadal. – Pharap