2009-11-14 14 views
16

में कार्यान्वयन क्या कोई मुझे जीसीसी में strlen() की परिभाषा पर इंगित कर सकता है? मैं अब लगभग डेढ़ घंटे के लिए 4.4.2 रिलीज कर रहा हूं (जबकि पागल की तरह गुगलिंग) और मुझे लगता है कि strlen() वास्तव में लागू किया गया है।strlen() जीसीसी

उत्तर

26

आप glibc में विचार करना चाहिए, न जीसीसी - यह strlen.c में परिभाषित किया जा रहा है - यहाँ strlen.c for glibc version 2.7 के लिए एक लिंक है ... और यहाँ glibc SVN repository online for strlen.c करने के लिए एक कड़ी है।

कारण आप जीसीसी glibc को देखकर किया जाना चाहिए और नहीं है:

GNU सी पुस्तकालय लिनक्स कर्नेल के साथ जीएनयू प्रणाली में सी पुस्तकालय और सबसे प्रणालियों के रूप में प्रयोग किया जाता है।

+0

मेरे पास भी glibc है और यह देखने के लिए नहीं लगता था। सुंदर wifty। सर उठाने के लिए धन्यवाद। –

+2

मेह, यह बहुत अनुकूलित नहीं है। कम से कम विज़ुअल सी ++ के साथ हमें एक सभ्य असेंबली भाषा स्ट्रेल मिलती है। – toto

+1

"जीएनयू सी लाइब्रेरी मुख्य रूप से पोर्टेबल और उच्च प्रदर्शन सी लाइब्रेरी बनने के लिए डिज़ाइन की गई है।" मुझे लगता है कि वे पोर्टेबिलिटी भाग पर अधिक वजन डाल रहे हैं, शायद। –

3

क्या आप यह देख रहे हैं? strlen() source। अधिक जानकारी के लिए git repository देखें। glibc resources page में गिट रिपॉजिटरीज़ के लिंक हैं यदि आप वेब व्यू को देखने के बजाय उन्हें पकड़ना चाहते हैं।

7

यहाँ bsd कार्यान्वयन है

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

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

अभी भी उस दिन की प्रतीक्षा कर रहा है जब एक कंपाइलर इस से तेजी से तेज़ मशीन कोड उत्पन्न कर सकता है .... वर्तमान में यह एक अनुकूलित * सी * संस्करण की आधा गति से भी कम है। –

3

Google Code Search ऐसे ही प्रश्नों के लिए एक अच्छा प्रारंभिक बिंदु है। वे आम तौर पर एक समारोह के विभिन्न स्रोतों और कार्यान्वयन को इंगित करते हैं।

अपने विशेष मामले में: GoogleCodeSearch(strlen)

गूगल कोड खोज पूरी तरह से मार्च, 2013 को बंद कर दिया गया

3

मूल पोस्टर इस ज्ञात नहीं सकता है है या इस के लिए तलाश कर दिया गया, जीसीसी आंतरिक inlines एक तथाकथित "बिल्टिन" सी कार्यों की संख्या जो यह स्वयं को परिभाषित करती है, जिनमें कुछ mem *() फ़ंक्शंस और (gcc संस्करण के आधार पर) स्ट्रेल शामिल हैं। ऐसे मामलों में, लाइब्रेरी संस्करण अनिवार्य रूप से कभी भी उपयोग नहीं किया जाता है, और ग्लिब में संस्करण में व्यक्ति को इंगित करना सख्ती से सही नहीं बोल रहा है। (यह प्रदर्शन कारणों से करता है - जो सुधार स्वयं को उत्पन्न करता है, उसके अलावा जीसीसी "कार्यों" के बारे में कुछ चीजें जानता है, जैसे कि यह प्रदान करता है, उदाहरण के लिए, स्ट्रेल एक शुद्ध कार्य है और यह इस प्रकार से हो सकता है एकाधिक कॉल दूर का अनुकूलन, या मेम *() कार्यों कि कोई अलियासिंग हो रहा है।)

इस बारे में अधिक जानकारी के लिए, के मामले में देखने http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

8

मुझे पता है इस सवाल का 4yrs पुराना है, लेकिन जीसीसी यदि आप #include <string.h> नहीं हैं और इसके लिए कोई भी जवाब (स्वीकृत उत्तर सहित) खाते में स्वयं स्ट्रेल की प्रतिलिपि शामिल होगी। आप भूल जाते हैं, तो आपको एक चेतावनी मिल जाएगा:

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

और जीसीसी इसकी प्रतिलिपि जो 86 पर repnz scasb एएसएम संस्करण जब तक आप -Werror या -fno-निर्मित पारित है इनलाइन होगा। इससे संबंधित फाइलें gcc/config/<platform>/<platform>.{c,md}

यह भी gcc/builtins.c द्वारा नियंत्रित है। यदि आपको आश्चर्य हुआ कि एक स्ट्रेल() को निरंतर अनुकूलित किया गया था, तो इस फ़ाइल में tree c_strlen(tree src, int only_value) के रूप में परिभाषित फ़ंक्शन देखें।यह नियंत्रित करता है कि स्ट्रेलन (दूसरों के बीच) का विस्तार और फोल्ड किया गया है (पहले उल्लिखित कॉन्फ़िगरेशन/प्लेटफ़ॉर्म के आधार पर)

0

मुझे एहसास है कि यह पुराना प्रश्न है, आप लिनक्स कर्नेल स्रोतों को जिथब 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; 
} 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^