Есть код: Код (Text): const unsigned char *k; a += ((unsigned int)k[0]) << 0; a += ((unsigned int)k[1]) << 8; a += ((unsigned int)k[2]) << 16; a += ((unsigned int)k[3]) << 24; b += ((unsigned int)k[4]) << 0; b += ((unsigned int)k[5]) << 8; b += ((unsigned int)k[6]) << 16; b += ((unsigned int)k[7]) << 24; c += ((unsigned int)k[8]) << 0; c += ((unsigned int)k[9]) << 8; c += ((unsigned int)k[10]) << 16; c += ((unsigned int)k[11]) << 24; Который можно переписать как: Код (Text): const unsigned char *k; a += ((unsigned int *)k)[0]; b += ((unsigned int *)k)[1]; c += ((unsigned int *)k)[2]; Какой вариант должен быть теоретически быстрее на не выровненных данных? ADD: Архитектура x86
Во-первых, если пишешь на С, то нужно очень сильно постараться, чтобы данные оказались не выравненными Во-вторых, для современных x86 невыравненные данные не так страшны, "как их малюют". Заметная задержка возникает только при пересечении 64-байтных границ кэш-линеек (при чтении массива двордов это будет происходить 1 раз из 16-ти). Плюс в AMD возможна доп.задержка в 1 такт при пересечении 8-байтных границ (но зато они в отличие от пеньков могут выполнять два чтения за 1 такт). Поэтому как ни крути, а чтение двордами по любому будет быстрее, чем хитроумные махинации с байтами
leo както бенчил (на амд). практически одинаково. разница практически равна погрешности. проц читает ведь из кэша. так что, имхо, оптимальнее паковать.
Почему бы не довериццо memcpy (a,b,c расположены друг за другом и чтобы не было gap'оф - pragma или в структуре) - ?