Niektóre architektury CPU (inne niż x86) nie lubią odczytu i zapisu liczb wielobajtowych na niezaalokowanych adresach tak bardzo, że po wykryciu tego powodu wywołują wyjątek SIGBUS i zmuszają programistę do zrobienia wszystkiego ręcznie w porządku bajtowym . Chociaż nie można nic zrobić z platformami, które tego wymagają, głupotą byłoby sprawdzanie wyrównania i przeprowadzanie operacji bajtowych na platformach, które umożliwiają niewyrównany dostęp (jak na przykład x86). Pytanie brzmi: czy kompilatory C/C++ definiują stałą, która wskazuje wymaganie wyrównania?Wymóg wyrównania pamięci stałej kompilatora
Obecnie używam to:
#if defined(_M_IX86) | defined(__i386) | defined(__i386__) | defined(i386) | defined(_X86_)
// Unaligned access is allowed.
#elif defined(_M_X64) | defined(__x86_64__) | defined(__x86_64) | defined(__amd64) | defined(__amd64__) | defined(_M_AMD64)
// Unaligned access is allowed.
#else
#define ALIGNED_ACCESS_ONLY
#endif
Ale wygląda zbyt „home-napar”: zamiast wskazywać rzeczywiste właściwości bieżącej platformy sprzętowej, a jedynie przedstawia swoje własne rozważania o x86-32 oraz x86-64 i najbardziej popularne nazwy stałe dla tych platform.
Oczywistym rozwiązaniem byłoby połowu 'SIGBUS' po starając się niewyrównany dostęp ... – edmz
@black To będzie ciężki * * Przypuszczam, że: nawet jeśli połowu wyjątek Hardware szybko (co zdecydowanie wątpię), w każdym razie zainstalowanie programu obsługi, wychwycenie błędu i usunięcie programu obsługi nigdy nie może być tak szybkie, jak proste sprawdzenie wyrównania adresu, a następnie odpowiednie rozgałęzienie. Niewyrównany dostęp w moim przypadku to podstawowy tryb działania, a nie rzadka sytuacja. –
Rzeczywiście; Właśnie zaproponowałem temu "rozwiązanie ubogich ludzi". Czy możesz nam powiedzieć, czy chcesz to wiedzieć, czy próbujesz rozwiązać konkretny problem [XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – edmz