से स्ट्रिंग वस्तु मान लीजिए मैं एक समारोह foo
कि मेरे कोड में स्थानों की एक बड़ी संख्या में से एक स्थिरांक std::string
संदर्भ लेता कॉल करने की आवश्यकता:मैक्रो :: शाब्दिक
int foo(const std::string&);
..
foo("bar");
..
foo("baz");
एक तार के साथ एक समारोह कॉलिंग इस तरह के शाब्दिक std::string
ऑब्जेक्ट्स बनाते हैं, प्रत्येक बार शाब्दिक प्रतिलिपि बनाते हैं।
जब तक मैं गलत नहीं हूं, संकलक प्रति स्थिर std::string
ऑब्जेक्ट प्रति शाब्दिक बनाकर इसे अनुकूलित नहीं करेंगे जिसे बाद में कॉल के लिए पुन: उपयोग किया जा सकता है। मुझे पता है कि g ++ में उन्नत स्ट्रिंग पूल तंत्र हैं, लेकिन मुझे नहीं लगता कि यह std::string
ऑब्जेक्ट्स स्वयं तक फैली हुई है।
static std::string bar_string("bar");
foo(bar_string);
..
static std::string baz_string("baz");
foo(baz_string);
Callgrind का उपयोग करना, मैं पुष्टि कर सकता कि यह वास्तव में मेरा कार्यक्रम में तेजी लाने करता है:
मैं इस "अनुकूलन" अपने आप को, जो कोड कुछ हद तक कम पठनीय बनाता कर सकते हैं।
मैंने सोचा कि मैं इसके लिए मैक्रो बनाने की कोशिश करूंगा, लेकिन मुझे नहीं पता कि यह संभव है या नहीं। मैं जो चाहता हूं वह कुछ है:
foo(STATIC_STRING("bar"));
..
foo(STATIC_STRING("baz"));
मैंने शाब्दिक के साथ टेम्पलेट पैरामीटर के रूप में टेम्पलेट बनाने का प्रयास किया, लेकिन यह असंभव साबित हुआ। और चूंकि कोड ब्लॉक में फ़ंक्शन परिभाषा संभव नहीं है, इसलिए मैं विचारों से बाहर हूं।
क्या ऐसा करने का एक शानदार तरीका है, या मुझे कम पठनीय समाधान का सहारा लेना होगा?
char * के बजाय उपयोग कर सकते हैं? – ZivS
तो, '[]() -> std :: स्ट्रिंग कॉन्स और {std :: स्ट्रिंग कॉन्स एस (" बार ") के बारे में क्या; वापसी एस; }() '? – dyp
सी ++ 14 के साथ, आप उपयोगकर्ता द्वारा परिभाषित शाब्दिक '" बार "एस का उपयोग कर सकते हैं, लेकिन मुझे यकीन नहीं है कि यह एक प्रतिलिपि बनाता है या नहीं –