बार strlen(word)
निष्पादित किया जाता है की संख्या पर निर्भर:
- तो
word
(डेटा स्थिर है) निरंतर रूप में घोषित किया जाता है
- या संकलक पता लगा सकते हैं कि
word
नहीं बदला है।
निम्न उदाहरण लें:
char word[256] = "Grow";
for (i = 0; i < strlen(word); ++i)
{
strcat(word, "*");
}
इस उदाहरण में, चर word
पाश के भीतर संशोधित किया गया है:
0) "आगे बढ़ें" - लंबाई == 4
1) "आगे बढ़ें * "- लंबाई == 5
2)" आगे बढ़ें ** "-, लंबाई == 6
हालांकि, संकलक strlen
कॉल बाहर कारक बन सकते हैं तो यह एक बार कहा जाता है यदि varia ble word
निरंतर रूप में घोषित किया जाता है:
void my_function(const char * word)
{
for (i = 0; i < strlen(word); ++i)
{
printf("%d) %s\n", i, word);
}
return;
}
समारोह घोषणा की है कि चर word
निरंतर डेटा है (वास्तव में, निरंतर डेटा के लिए सूचक)। इस प्रकार लंबाई नहीं बदलेगी, इसलिए संकलक केवल strlen
को कॉल कर सकता है।
संदेह में, आप हमेशा अनुकूलन स्वयं कर सकते हैं, जो इस मामले में अधिक पठनीय कोड पेश कर सकता है।
स्रोत
2010-01-12 18:42:30
यह सही जवाब है ... वास्तव में, यह निर्भर करता है कि संकलक कितना चालाक है। – Noldorin
उदाहरण में यह ''char *' पर किया गया था जिसका अर्थ है कि न तो सूचक और न ही डेटा की ओर इशारा किया गया था। क्या जीसीसी वास्तव में ऐसा कर रहा है? यह अविश्वसनीय रूप से खतरनाक लगता है। –
@PP: मान लीजिए कि आपका 'शब्द' लूप के अंदर कहीं और नहीं पारित किया गया है (या केवल 'char const * 'लेने वाले फ़ंक्शन पर पास किया गया है), और आपका कोड सिंगल-थ्रेडेड माना जाता है, और इसमें कोई एलियासिंग शामिल नहीं है (या तो क्योंकि फ़ंक्शन यूनरी है, या क्योंकि पॉइंटर को 'प्रतिबंधित' घोषित किया गया है)। उस स्थिति में, मैं कहूंगा कि यह एक बहुत ही सुरक्षित धारणा है कि डेटा नहीं बदलेगा। –