2009-11-14 3 views
16

누구나 GCC에서 strlen()의 정의를 가르쳐 줄 수 있습니까? 나는 약 0.5 시간 동안 4.4.2를 풀 렸으며 (인터넷 검색은 미친 듯), 실제로 strlen()이 구현 된 것을 찾을 수없는 것처럼 보입니다.gcc의 strlen() 구현

답변

26

GCC가 아니라 glibc를보고 있어야합니다. strlen.c에 정의 된 것 같습니다. strlen.c for glibc version 2.7에 대한 링크가 있습니다. 여기에 glibc SVN repository online for strlen.c에 대한 링크가 있습니다. 당신 gcc가 glibc보고되지해야

그 이유는 다음과 같습니다

GNU C 라이브러리는 리눅스 커널과 으로 C의 GNU 시스템에서 라이브러리와 대부분의 시스템을 사용한다.

+0

나는 glibc가있어 보이지 않을 것입니다. 꽤 멋진. 머리를 가져 주셔서 감사합니다. –

+2

Meh, 그다지 최적화되지 않았습니다. 적어도 Visual C++에서는 괜찮은 어셈블리 언어 strlen을 얻습니다. – toto

+1

"GNU C 라이브러리는 주로 휴대용 고성능 C 라이브러리로 설계되었습니다." 나는 그들이 이식성 부분에 더 많은 무게를두고 있다고 생각하고있다. –

7

여기

size_t 
strlen(const char *str) 
{ 
     const char *s; 

     for (s = str; *s; ++s) 
       ; 
     return (s - str); 
} 
+10

컴파일러가 빠른 기계 코드를 생성 할 수있는 날을 여전히 기다리고 있습니다 .... 현재는 최적화 된 * C * 버전의 절반 이하입니다. –

3

Google Code Search 그런 질문에 대한 좋은 출발점입니다 bsd 구현입니다. 일반적으로 함수의 다양한 소스와 구현을 가리 킵니다. 특정 경우

: 원래 포스터가 이것을 알고하지 않을 수 있습니다 또는이 찾고 있지만 GoogleCodeSearch(strlen)

구글 코드 검색이 완전히 년 3 월 2013 년 종료 된

3

는, GCC는 내부적으로 인라인 mem *() 함수 및 (gcc 버전에 따라) strlen을 포함하여 자체적으로 정의하는 소위 "내장"c 함수의 수입니다. 이 경우, 라이브러리 버전은 본질적으로 사용되지 않으며, glibc에있는 버전의 사람을 가리키는 것이 엄격히 말하면 정확하지 않습니다. (이것은 성능상의 이유로 - 인라인 자체가 생성하는 개선 외에도 gcc가 함수를 제공 할 때 함수에 대한 특정 사항을 "인식"합니다. 예를 들어 strlen은 순수한 함수이며 따라서 여러 통화를 멀리 최적화, 또는 MEM의 *()에는 앨리어싱가 진행되지 않는 기능.)이 방법에 대한 자세한 내용은

의 경우에 나는이 질문이 4yrs 오래 실현,하지만 GCC http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

8

참조 #include <string.h>이 아니라면 자신의 사본을 포함하고 그 답을 포함하지 않습니다 (수락 된 답변 포함).

file_name:line_number: warning: incompatible implicit declaration of built-in function 'strlen'

및 GCC는 -Werror 또는 -fno-내장을 통과하지 않으면 86에 repnz scasb의 ASM의 변형입니다 복사본을 인라인 것입니다 : 당신이 잊어 버린 경우, 당신은 경고를 받게됩니다. 이것과 관련된 파일은 gcc/config/<platform>/<platform>.{c,md}

입니다. 또한 gcc/builtins.c에 의해 제어됩니다. strlen()이 상수에 최적화되었는지 그리고 어떻게 stirlen()이 최적화되었는지 궁금해지면,이 파일에 tree c_strlen(tree src, int only_value)으로 정의 된 함수를보십시오.또한 strlen (다른 것들 중에서)이 펼쳐지고 접혀지는 방식을 제어합니다. (앞서 언급 한 config/platform을 기반으로합니다.)

0

저는 이것이 오래된 질문이라는 것을 알고 있습니다. github here에서 리눅스 커널 소스를 찾을 수 있습니다. 32 비트 strlen()에 대한 구현은 github의 strlen_32.c에서 찾을 수 있습니다. 언급 된 파일에는이 구현이 있습니다.

#include <linux/types.h> 
#include <linux/string.h> 
#include <linux/module.h> 

size_t strlen(const char *s) 
{ 
    /* Get an aligned pointer. */ 
    const uintptr_t s_int = (uintptr_t) s; 
    const uint32_t *p = (const uint32_t *)(s_int & -4); 

    /* Read the first word, but force bytes before the string to be nonzero. 
    * This expression works because we know shift counts are taken mod 32. 
    */ 
    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; 
} 
EXPORT_SYMBOL(strlen); 
1

이 코드는 더 간단 할 수 있습니다.

size_t Strlen (const char * _str) 
{ 
    size_t i = 0; 
    while(_str[i++]); 
    return i; 
}