Я читал Linux/arch/tile/lib/strlen_32.c
, чтобы узнать о достижении strlen_32
. Однако я встретил два macro
с именем __insn_seqb
и __insn_ctz
, которые я не знал смысла. Функция strlen_32
ниже:Что означают __insn_seqb() и __insn_ctz?
size_t strlen(const char*s)
{
const uintptr_t s_int = (uintptr_t)s;
const uint32_t *p = (const uint32_t*)(s_int&-4);
uint32_t v = *p | ((1<<(s_int<<3))-1);
uint32_t bits;
while((bits=__insn_seqb(v,0))==0)
v = *++p;
return ((const char*)p)+(__insn_ctz(bits)>>3)-s;
}
Я искал их на Google, но только нашел другое определение макроса: #define CFZ(x) __insn_ctz(x)
в string_endian.h
glib-ports string-endian.h Может кто-нибудь сказать мне, где ясно определение или реальное значение и использование этих двух макросы?
Он связан с обработкой четырех байтов строки одновременно. –
Все эти танцы из-за несвязанного доступа к данным. Не все архитектуры могут это сделать. В современном ядре для этого есть помощник 'get_unaligned()'. С другой стороны, влияние производительности может быть заметно при работе с строками при максимальной ширине шины данных. См. Например, 'strscpy()' реализация. – 0andriy