Нет реализации C, о которой я знаю, которая предоставляет какой-либо макрос препроцессора, чтобы помочь вам понять это.Поскольку ваш код предположительно работает на широком спектре машин, я предполагаю, что у вас есть доступ к широкому кругу машин для тестирования, поэтому вы можете найти ответ с помощью тестовой программы.Затем вы можете написать свой собственный макрос, например, как показано ниже:
#if defined(__sparc__)
/* Unaligned access will crash your app on a SPARC */
#define ALIGN_ACCESS 1
#elif defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC)
/* Unaligned access is too slow on a PowerPC (maybe?) */
#define ALIGN_ACCESS 1
#elif defined(__i386__) || defined(__x86_64__) || \
defined(_M_IX86) || defined(_M_X64)
/* x86 / x64 are fairly forgiving */
#define ALIGN_ACCESS 0
#else
#warning "Unsupported architecture"
#define ALIGN_ACCESS 1
#endif
Обратите внимание, что скорость неприсоединенного доступа будет зависеть от границ, которые он пересекает.Например, если доступ пересекает границу страницы 4 КБ, это будет намного медленнее, и могут быть другие границы, которые заставляют это быть еще медленнее.Даже на x86 некоторые невыровненные обращения не обрабатываются процессором, а обрабатываются ядром ОС.Это невероятно медленно.
Также нет гарантии, что будущая (или текущая) реализация не изменит внезапно характеристики производительности невыровненных обращений.Это произошло в прошлом и может произойти в будущем;PowerPC 601 очень простил доступ без выравнивания, а PowerPC 603e - нет.
Еще больше усложняет тот факт, что код, который вы пишете для создания выравниваемого доступа, будет отличаться по реализации на разных платформах.Например, в PowerPC это упрощается тем, что x << 32
и x >> 32
всегда равны 0, если x
равен 32 битам, но на x86 вам не повезло.