मैं सभी मेरे कोड पर इस्तेमाल किया उस मैक्रो डिबग मोड में करता है:रनटाइम लागत के बिना दावाों के आधार पर जीसीसी अनुकूलन को कैसे मार्गदर्शित करें?
#define contract(condition) \
if (!(condition)) \
throw exception("a contract has been violated");
... लेकिन रिलीज़ मोड में:
#define contract(condition) \
if (!(condition)) \
__builtin_unreachable();
यदि ऐसा assert()
से अधिक करता है कि है, रिलीज में बनाता है, कंपाइलर यूबी प्रचार के लिए धन्यवाद कोड को अनुकूलित कर सकता है।
, निम्नलिखित कोड के साथ परीक्षण:
int foo(int i) {
contract(i == 1);
return i;
}
// ...
foo(0);
... डिबग मोड में एक अपवाद फेंकता है, लेकिन रिलीज़ मोड में बिना शर्त return 1;
के लिए विधानसभा का उत्पादन:
foo(int):
mov eax, 1
ret
हालत , और उस पर निर्भर सब कुछ, अनुकूलित किया गया है।
मेरी समस्या अधिक जटिल स्थितियों के साथ उत्पन्न होती है। जब संकलक साबित नहीं कर सकता है कि स्थिति का कोई दुष्प्रभाव नहीं है, तो यह इसे अनुकूलित नहीं करता है, जो अनुबंध का उपयोग न करने की तुलना में रनटेम जुर्माना है।
क्या यह व्यक्त करने का कोई तरीका है कि अनुबंध की स्थिति का कोई दुष्प्रभाव नहीं है, ताकि हमेशा अनुकूलित हो?
टिप्पणियाँ विस्तृत चर्चा के लिए नहीं हैं, यह वार्तालाप [चैट करने के लिए स्थानांतरित हो गया है] (http://chat.stackoverflow.com/rooms/144609/discussion-on-question-by-lyingonthesky-how-to-guide-gcc-optimizations-based-on)। – deceze