Предположим, что вы работаете с 32-разрядной системой x86. Ваша задача - реализовать strlen как можно быстрее.
Есть две проблемы, о которых вы должны позаботиться:
1. выравнивание адреса.
2. прочитать память с длиной машинного слова (4 байта).
Нетрудно найти первый адрес выравнивания в данной строке.
Затем мы можем прочитать память один раз с 4 байтами и подсчитать ее общую длину. Но мы должны остановиться, как только в 4 байтах будет нулевой байт, и посчитать левые байты до нулевого байта. Чтобы быстро проверить нулевой байт, есть фрагмент кода из glibc:
unsigned long int longword, himagic, lomagic;
himagic = 0x80808080L;
lomagic = 0x01010101L;
// There's zero byte in 4 bytes.
if (((longword - lomagic) & ~longword & himagic) != 0) {
// do left thing...
}
Я использовал его в Visual C ++, чтобы сравнить с реализацией CRT. ЭЛТ гораздо быстрее, чем выше.
Я не знаком с реализацией CRT, они использовали более быстрый способ проверки нулевого байта?