FreeBSD's generic implementation of memchr
을 수행합니다FreeBSD의 memchr 구현이 포인터를 증가시키는 이유는 무엇입니까?
void *
memchr(const void *s, int c, size_t n)
{
if (n != 0) {
const unsigned char *p = s;
do {
if (*p++ == (unsigned char)c)
return ((void *)(p - 1));
} while (--n != 0);
}
return (NULL);
}
을 불필요하게 복잡한 것 같다 나에게하는; 으로 확인하십시오 do
- while
그냥 p
선언을 피하기 위해 완전히 무의미한 것 같습니다. 그러나, 나는 루프 본체가하는 이유에 특히 관심이 : 대신 더 간단의
if (*p++ == (unsigned char)c)
return ((void *)(p - 1));
:
if (*p == (unsigned char)c)
return ((void *) p);
++p;
조건과 후행 증가가 일부 컴파일러에 대한 몇 가지 최적화 혜택이 인라인합니까/플랫폼?
컴파일러가 생성하는 (최적화 된) 기계 코드를 확인 했습니까? 당신의 접근 방식이 다른 점은 무엇입니까?'p'의 _definition_은 코드를 생성합니까? 그리고 네, 당신은 그 코드가 가장 많이 쓰여졌을 때와 그 당시의 좋은/나쁜 컴파일러가 어떻게 최적화되었는지를 생각해 보지 못했습니다. 상당수의 CPU에는 "0이 아닌 경우 감소 및 분기"명령어가 있습니다. – Olaf
@Olaf god와 구현을 비교하기 위해 godbolt를 사용했습니다 (-O3을 사용하고 -O를 사용). 나는 어셈블리에 익숙하지 않지만, 간단한 버전은 더 적은 명령어를 생성하는 것으로 보인다. – jamesdlin
내 의견을 다시 읽고, 나는 꽤 많이 추가했다. BSD를 실행하는 모든 대상을 확인합니까? x86은 실제로 널리 보급 된 플랫폼이 아닙니다. 이 코드는 심지어 수십 년 동안 x86과 ARM을 능가하는 8 비트와 16 비트 MCU에도 사용될 수 있습니다. – Olaf