मैं (या? :) का उपयोग किए बिना MAX या MIN के दो पूर्णांक को वापस करने के लिए एक शाखा रहित फ़ंक्शन लिखने की कोशिश कर रहा हूं। the usual technique का उपयोग करते हुए मैं यह आसानी से किसी दिए गए शब्द आकार के लिए पर्याप्त कर सकते हैं:टेम्पलेटलाइज्ड शाखा रहित int अधिकतम/मिनट फ़ंक्शन
inline int32 imax(int32 a, int32 b)
{
// signed for arithmetic shift
int32 mask = a - b;
// mask < 0 means MSB is 1.
return a + ((b - a) & (mask >> 31));
}
अब
, arguendo कि मैं वास्तव में इन-आदेश प्रोसेसर की तरह है, जहां यह आवश्यक है पर आवेदन की तरह लिख रहा हूँ यह सोचते हैं, मेरे सवाल है क्या int के सभी आकारों में इसे सामान्यीकृत करने के लिए C++ टेम्पलेट्स का उपयोग करने का कोई तरीका है या नहीं।
>> 31 कदम केवल ज़ाहिर है, int32s के लिए काम करता है, और जब तक मैं int8, int16, और int64 के लिए समारोह पर भार के बाहर नकल कर सकता है, ऐसा लगता है जैसे मैं एक टेम्पलेट समारोह के बजाय का उपयोग करना चाहिए। लेकिन मैं बिट्स में टेम्पलेट तर्क का आकार कैसे प्राप्त करूं?
क्या इससे बेहतर करने का कोई बेहतर तरीका है? क्या मैं मुखौटा टी पर हस्ताक्षर करने के लिए मजबूर कर सकता हूं? यदि टी को हस्ताक्षर नहीं किया गया है तो मास्क-शिफ्ट चरण काम नहीं करेगा (क्योंकि यह अंकगणितीय शिफ्ट के बजाय तार्किक होगा)।
template< typename T >
inline T imax(T a, T b)
{
// how can I force this T to be signed?
T mask = a - b;
// I hope the compiler turns the math below into an immediate constant!
mask = mask >> ((sizeof(T) * 8) - 1);
return a + ((b - a) & mask);
}
और, ऊपर किया है, मैं इसे कुछ भी लेकिन एक पूर्णांक प्रकार (उदाहरण के लिए, कोई तैरता या वर्ग) के लिए इस्तेमाल किया जा रहा से रोका जा सकता है?
अधिकांश आधुनिक मशीनों में conditonal mov निर्देश होते हैं, जो उन्हें कोई शाखाओं के साथ न्यूनतम/अधिकतम करने में सक्षम बनाता है (उदाहरण के लिए, cmp a, b/movlt a, b)। यह उस कोड से तेज़ होगा जो आप उत्पन्न करने की योजना बना रहे हैं, और कंपाइलर्स उनके बारे में जानते हैं। क्या आप सुनिश्चित हैं कि आपका कंपाइलर पहले से ही आपके लिए ऐसा नहीं करता है? –
@IraBaxter बिल्कुल यकीन है; मैं हमेशा इसके असेंबली आउटपुट को देखता हूं। इसके अलावा, मैं जिस प्रोसेसर को लक्षित करता हूं (ए पावरपीसी व्युत्पन्न) निश्चित रूप से एक cmov नहीं मिला है। – Crashworks
जो भी कोड आप लिखते हैं, वह केवल सी ++ स्रोत के रूप में शाखा रहित होगा। कंपाइलर सशर्त कूद (यानी शाखाएं) उत्पन्न किए बिना उत्पन्न कर सकता है अगर/else /? /:, और इसके विपरीत अगर/अन्य स्रोत से अनुकूलित शाखा रहित निर्देश उत्पन्न हो सकते हैं। – galinette