मेरे पास मेरे प्रोग्राम में एक सहायक वर्ग है जिसमें मेरे कार्यक्रम के विभिन्न वर्गों में कई स्थिर कार्य हैं। जैसेकई अनुवाद इकाइयों में कॉपी किए गए C++ में स्थिर सदस्य फ़ंक्शन हैं?
helper.h
:
Class helper {
public:
static void fn1()
{ /* defined in header itself */ }
/* fn2 defined in src file helper.cpp */
static void fn2();
}
हेल्पर केवल स्थिर सदस्य कार्य करती है। इसलिए, अन्य मॉड्यूल द्वारा सहायक की कोई वस्तु नहीं बनाई जाती है। सहायक कार्यों जैसे अन्य मॉड्यूल में उपयोग किया जाता है:
A.cpp
#include "helper.h"
A::foo() {
helper::fn1();
helper::fn2();
}
B.cpp
#include "helper.h"
B::foo() {
helper::fn1();
helper::fn2();
}
संकलक A.cpp
और B.cpp
में सहायक कार्यों के अलग प्रतियां बनाने करता है? मैंने कुछ पूर्व पदों को पढ़ा और मैंने जवाबों से इकट्ठा किया कि संकलक ऐसा करेगा। लेकिन जब मैं fn1
और fn2
printf("Address of fn1 is %p\n", &helper::fn1);
और printf("Address of fn1 is %p\n", &helper::fn1);
के A.cpp
और B.cpp
दोनों के पते को मुद्रित करता हूं, तो मुझे वही पता मिलता है। अब मैं उलझन में हूँ। क्या कोई स्पष्टीकरण दे सकता है, अगर मुझे कुछ याद आ रहा है।
कारण मैं सहायक कार्यों की कई प्रतियों (यदि ऐसा होता है) के बारे में चिंतित है, तो हम अपने निष्पादन योग्य आकार को कम करने की कोशिश कर रहे हैं और इसे अनुकूलित करना चाहते हैं।
+1। मुझे सवाल थोड़ा और सावधानी से पढ़ना चाहिए था;) मेरी पोस्ट हटा दी गई। – Mahesh
@snkrish: क्या यह एक टेम्पलेट स्थिर सदस्य फ़ंक्शन या टेम्पलेट स्थिर वैश्विक फ़ंक्शन है? यदि यह स्थिर सदस्य फ़ंक्शन है, तो आपको शायद टेम्पलेट पैरामीटर के प्रत्येक संयोजन के लिए एक नई प्रति प्राप्त होगी, लेकिन संकलन इकाइयों की संख्या अभी भी प्रभावित नहीं होगी। यदि एक स्थिर वैश्विक (या नामस्थान) फ़ंक्शन, तो आपको प्रत्येक संकलन इकाई में एक नई प्रति प्राप्त होगी। –
विस्तृत उत्तर के लिए धन्यवाद, अब मैं देखता हूं कि पता क्यों समान था। मेरे पास एक फॉलो अप प्रश्न है, मुझे यकीन नहीं है कि मुझे एक अलग पोस्ट शुरू करना चाहिए या नहीं। यदि उपरोक्त वही fn2 टेम्पलेट्स का उपयोग करके लिखा गया था: टेम्पलेट स्थैतिक शून्य fn2(); - क्या स्वयं को हेडर में परिभाषित किया जाना चाहिए या क्या मुझे निष्पादन योग्य आकार को अनुकूलित करने के लिए बाहरी टेम्पलेट सहायक :: fn2() {/ * helper.cpp * /} में परिभाषा का उपयोग करना चाहिए। संकलक फ़ंक्शन की एक प्रति बनायेगा, जब भी एफएन 2 को एक अलग टी के साथ बुलाया जाता है, भले ही इसे कैसे परिभाषित किया जाए? –
cppcoder