Nic w mandatach C standard, który int
i long
muszą mieć ten sam rozmiar; co więcej, nawet jeśli mają one tę samą wielkość, nic w standardowym mandacie, że mają tę samą reprezentację (między innymi, mogą mieć niekompatybilne kombinacje bitów dopełnienia i odwzorowań pułapek, tak że aliasing między tymi dwoma typami nie może służyć żadnym przydatny cel).
Autorzy Standardu nie chcieli wymuszać implementatorów na platformach, na których aliasing między int
i long
nie miałby żadnego znaczenia dla rozpoznania takiego aliasingu. Nie chcieli też pisać reguł, które miałyby zastosowanie do niektórych platform (tych, w których aliasing służyłby celowi), ale nie do innych (tych, w których nie byłoby to możliwe). Zamiast tego doszli do wniosku, że ludzie piszący kompilatory jakości próbowaliby rozpoznawać aliasing w przypadkach, w których byłby użyteczny.
Możliwość używania wskaźników do jednego 32-bitowego typu do odczytu i zapisu wartości innego 32-bitowego typu, który ma taką samą reprezentację, jest wyraźnie przydatna, szczególnie jeśli interfejsy API są podzielone na typy, których oczekują. Jeśli niektóre popularne interfejsy API na platformie używają wartości int*
dla wartości 32-bitowych, a inne używają wartości long*
, implementacja ogólnego przeznaczenia dla tej platformy o wartości musi umożliwiać dostęp do danych obu typów za pomocą wskaźników innych.
Niestety, autorzy niektórych kompilatorów są bardziej zainteresowani procesem przetwarzania określonego podzbioru programów, niż wydajnym przetwarzaniem większego podzbioru programów i nie można polegać na generowaniu przydatnego kodu, jeśli konieczna jest wymiana danych. między interfejsami API, które używają tej samej reprezentacji danych, ale różnymi nazwanymi typami, chyba że całkowicie wyłączono analizę aliasingu. Oczywiście, jeśli celujesz w dialekty C, które są odpowiednie do ogólnego zastosowania na mikrokontrolerach, takie problemy nie mają znaczenia.
tylko dla pojedynczego obiektu lub tablicy longs/ints? – sellibitze
To magazyn atomowy dla pojedynczego 32-bitowego fragmentu pamięci. – coderdave