खोज…


इनलाइनिंग फ़ंक्शन एक से अधिक स्रोत फ़ाइल में उपयोग किए जाते हैं

छोटे कार्यों के लिए जिन्हें अक्सर कहा जाता है, फ़ंक्शन कॉल के साथ जुड़े ओवरहेड उस फ़ंक्शन के कुल निष्पादन समय का एक महत्वपूर्ण अंश हो सकता है। प्रदर्शन को बेहतर बनाने का एक तरीका, ओवरहेड को खत्म करना है।

इस उदाहरण में हम तीन स्रोत फ़ाइलों में चार फ़ंक्शन (प्लस main() ) का उपयोग करते हैं। उनमें से दो ( plusfive() और timestwo() ) प्रत्येक को "सोर्स 1 सी" और "सोर्स 2 सी" में स्थित अन्य दो द्वारा बुलाया जाता है। main() शामिल है, इसलिए हमारे पास काम करने का एक उदाहरण है।

main.c:

#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"

int main(void) {
    int start = 3;
    int intermediate = complicated1(start);
    printf("First result is %d\n", intermediate);
    intermediate = complicated2(start);
    printf("Second result is %d\n", intermediate);
    return 0;
}

source1.c:

#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"

int complicated1(int input) {
    int tmp = timestwo(input);
    tmp = plusfive(tmp);
    return tmp;
}

source2.c:

#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"

int complicated2(int input) {
    int tmp = plusfive(input);
    tmp = timestwo(tmp);
    return tmp;
}

headerfile.h:

#ifndef HEADERFILE_H
#define HEADERFILE_H

int complicated1(int input);
int complicated2(int input);

inline int timestwo(int input) {
  return input * 2;
}
inline int plusfive(int input) {
  return input + 5;
}

#endif

कार्य timestwo और plusfive को complicated1 timestwo और plusfive दोनों द्वारा बुलाया जाता complicated2 , जो विभिन्न "अनुवाद इकाइयों", या स्रोत फ़ाइलों में हैं। इस तरह से उनका उपयोग करने के लिए, हमें उन्हें हेडर में परिभाषित करना होगा।

इस तरह संकलित करें, जीसीसी मान लें:

cc -O2 -std=c99 -c -o main.o main.c
cc -O2 -std=c99 -c -o source1.o source1.c
cc -O2 -std=c99 -c -o source2.o source2.c
cc main.o source1.o source2.o -o main

हम -O2 ऑप्टिमाइज़ेशन विकल्प का उपयोग करते हैं क्योंकि कुछ कंपाइलर ऑप्टिमाइज़ेशन के बिना इनलाइन नहीं करते हैं।

inline कीवर्ड का प्रभाव यह है कि विचाराधीन फ़ंक्शन प्रतीक ऑब्जेक्ट फ़ाइल में उत्सर्जित नहीं होता है। अन्यथा अंतिम पंक्ति में एक त्रुटि होगी, जहां हम ऑब्जेक्ट फ़ाइलों को अंतिम निष्पादन योग्य बनाने के लिए लिंक कर रहे हैं। यदि हमारे पास inline नहीं होती है, तो दोनों ही .o फ़ाइलों में एक ही प्रतीक परिभाषित किया जाएगा, और "बहु-परिभाषित चिह्न" त्रुटि उत्पन्न होगी।

उन स्थितियों में जहां प्रतीक की वास्तव में आवश्यकता होती है, इसका नुकसान यह होता है कि प्रतीक बिल्कुल उत्पन्न नहीं होता है। इससे निपटने के लिए दो संभावनाएं हैं। सबसे पहले .c फ़ाइलों में से एक में उल्लिखित कार्यों के एक अतिरिक्त extern घोषणा को जोड़ना है। तो source1.c लिए निम्नलिखित जोड़ें:

extern int timestwo(int input);
extern int plusfive(int input);

अन्य संभावना के साथ समारोह को परिभाषित करने के लिए है static inline बजाय inline । इस पद्धति में यह खामी है कि अंततः प्रश्न में फ़ंक्शन की एक प्रति इस हेडर के साथ उत्पन्न होने वाली प्रत्येक ऑब्जेक्ट फ़ाइल में उत्पादित की जा सकती है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow