В настоящее время у меня есть эта функция, чтобы поменять байты данных для изменения порядка байтов.
template<typename Type, unsigned int Half = sizeof(Type)/2, unsigned int End = sizeof(Type)-1>
inline void swapBytes(Type& x)
{
char* c = reinterpret_cast<char*>(&x);
char tmp;
for (unsigned int i = 0; i < Half; ++i) {
tmp = c[i];
c[i] = c[End-i];
c[End-i] = tmp;
}
}
Эта функция будет вызываться некоторыми моими алгоритмами несколько миллионов раз. Следовательно, каждая отдельная инструкция, которую можно избежать, будет хорошей вещью.
У меня вопрос: как эту функцию можно оптимизировать?
Прежде всего вам необходимо проверить, есть ли на вашей аппаратной платформе инструкции по перестановке байтов или нет. Некоторые платформы имеют эти инструкции, а некоторые нет. После этого вам нужно искать библиотечную функцию, которая их использует. Проверьте документы или остановитесь в отладчике и посмотрите на разборку. Это хороший шанс, что вы найдете его. Вряд ли что-то еще будет работать лучше, чем это.
В конечном итоге напишите свою собственную функцию на ассемблере, которая использует эти инструкции.
Для 2-байтового типа будет работать прямое преобразование таблицы. Это 128 КБ, что не так много для наших современных компьютеров. Для 32-битных типов это близко к избыточному, но в некоторых (редких) случаях все еще может работать на большой 64-битной коробке.
Вы также можете использовать комбинацию asm-инструкций, преобразования таблиц и оптимизированного цикла.
Других решений пока нет …