यदि मेरे दो अलग-अलग सदस्य हैं, तो दोनों को एक ही फ़ंक्शन कॉल के आधार पर आरंभीकृत करने की आवश्यकता है, क्या फ़ंक्शन को दो बार कॉल किए बिना ऐसा करने का कोई तरीका है?
उदाहरण के लिए, एक अंश वर्ग जहाँ अंश और हर एक स्थिर होते हैं।
int gcd(int a, int b); // Greatest Common Divisor
class Fraction {
public:
// Lets say we want to initialize to a reduced fraction
Fraction(int a, int b) : numerator(a/gcd(a,b)), denominator(b/gcd(a,b))
{
}
private:
const int numerator, denominator;
};
इससे समय बर्बाद होता है, क्योंकि जीसीडी फ़ंक्शन को दो बार कहा जाता है। आप एक नए वर्ग के सदस्य को भी परिभाषित कर सकते हैं gcd_a_b
, और सबसे पहले आरंभिक सूची में gcd के उत्पादन को निर्दिष्ट कर सकते हैं, लेकिन तब यह व्यर्थ स्मृति को जन्म देगा।
सामान्य तौर पर, क्या यह बर्बाद किए गए फ़ंक्शन कॉल या मेमोरी के बिना ऐसा करने का एक तरीका है? क्या आप शायद इनिशियलाइज़र सूची में अस्थायी चर बना सकते हैं? धन्यवाद।
-O3
। लेकिन शायद किसी भी सरल परीक्षण के कार्यान्वयन के लिए यह वास्तव में फ़ंक्शन कॉल को इनलाइन करेगा। यदि आप __attribute__((const))
एक दृश्यमान परिभाषा प्रदान किए बिना प्रोटोटाइप पर उपयोग करते हैं या शुद्ध करते हैं, तो उसे दो कॉलों के बीच समान arg के साथ GCC या क्लैंग को सामान्य-सबप्रेसेशन एलिमिनेशन (CSE) करने देना चाहिए। ध्यान दें कि ड्रू का उत्तर गैर-शुद्ध कार्यों के लिए भी काम करता है, इसलिए यह बहुत बेहतर है और आपको इसका उपयोग किसी भी समय करना चाहिए जब तक कि फ़नल इनलाइन न हो।