2012-04-01 5 views
0

C의 특정 (char *) 포인터에서 시작하는 연속적인 null 바이트의 양을 계산하는 빠른 방법이 있습니까? 나는 현재 잘 작동하고 빠르지 만 빡빡한 루프를 사용하고 있지만 libc/gcc의 문자열 함수는 훨씬 더 빠른 경향이 있습니다.C에서 연속적인 null ( 0) 바이트를 어떻게 계산합니까?

나는 strspn과 비슷한 것을 찾고 있는데, buf strspn은 (물론) 첫 번째 null 바이트에서 멈추고 따라서이 작업에는 쓸모가 없다. 나는 또한 이 아니고이 아닌 바이트 수를 반환하는 strlen의 역함을 찾고 있다고 말할 수 있다고 생각합니다.

+5

NUL 바이트가 문자열의 끝이 아닌 경우 문자열의 끝 부분을 어떻게 알 수 있습니까? – delnan

+5

그것이 충분히 빠를 때 ... 왜 botter일까요?! – Anthales

+2

C 라이브러리 구현에는 아마도 손으로 쓴 어셈블러가있을 것입니다. 가장 가까운 정렬 된 포인터로 이동하여 정수 값을 비교할 수 있습니다. –

답변

2

에 도달하기 전에 동안 중지 보장해야한다. C.

표준 휴대용이 할 수있는 빠른 방법이 없다

int zeros(char *p) 
{ 
    int n = 0; 
    if ((int)p & 1) { 
    if (*p) 
     return 0; 
    p++; 
    n++; 
    } 
    if ((int)p & 2) { 
    if (*(short *)p) 
     goto label1; 
    p += 2; 
    n += 2; 
    } 
    if ((int)p & 4) { 
    if (*(long *)p) 
     goto label2; 
    p += 4; 
    n += 4; 
    } 
    while (!*(long long *)p) { 
    p += 8; 
    n += 8; 
    } 
    if (!*(long *)p) { 
    p += 4; 
    n += 4; 
    } 
label2: 
    if (!*(short *)p) { 
    p += 2; 
    n += 2; 
    } 
label1: 
    if (!*p) 
    n++; 
    return n; 
} 
+0

좋은 생각이지만, int가 4 자 길이라는 가정. –

+0

'int'는 포인터 값을 유지하기에 충분히 큰 것은 아닙니다. '(u) intptr_t'를'stdint.h'에서 사용하거나, 사용할 수 없다면'size_t'를 사용하십시오. –

+0

@KyleJones :'sizeof()'를 사용하여 타입의 크기를 검사 할 수 있습니다. [compile-time "assert"] (http://www.flipcode.com/archives/Compile-Time_Asserts.shtml)를 사용하여 크기가 다른 플랫폼에서 코드가 컴파일되지 않도록 할 수 있습니다. –

3

그런 방법이 있는지 모르겠지만 직접 작성해야하는 경우 (int*) 또는 (long*)을 사용하여 4 바이트 또는 8 바이트 세트를 함께 확인하는 것이 좋습니다.

+0

좋은 생각이지만 결국에는 측정해야합니다. 그리고 매우 간단한 솔루션이 더 빠른 것으로 밝혀집니다. (나는 자바 jit 컴파일러가 증분을 저장하기 위해 일련의 8 반복 작업을 시도했다는 것을 기억한다. 결과로 jit은 루프를 느리게 만든다 .--) –

+0

코드의 복잡성과 효율성 사이에는 강한 상관 관계가 없다. 크기와 복잡성은 동일하지 않습니다. – Vincent

2

어떨까요?

char* start = ... 
char* act = start; 
while (*act++ == 0); 
ptrdiff_t nulls = (act - start) - 1; 

그러나, 뭔가 한 번에 zeroness에 대한 단어를 확인할 수 있습니다, 포인터가 워드로 정렬되어 있으면 사용할 수없는 메모리를

+1

'ptrdiff_t' 또는'size_t'이지만'int'가 아닙니다. –

+0

이것은 근본적으로 제가 현재 사용하고있는 꽉 루프입니다. 감사합니다 :) –

2

, 그들은 휴대용에 기록 할 필요가 없기 때문에 C 컴파일러 내장 명령 및 표준 라이브러리는, 빨리 갈 수있는, 표준 C - 구현 관련 지식을 자유롭게 활용할 수 있습니다.

물론이 루트를 직접 사용할 수도 있습니다.하지만 가지고있는 것이 이미 충분히 빠르다면, 이식성과 유지 보수 비용에 정말 가치가 있습니까?

관련 문제