मुझे संदेह है कि इस प्रश्न का उत्तर लक्ष्य आर्किटेक्चर द्वारा भिन्नता जा रहा है, क्योंकि रूपांतरण हार्डवेयर में हो सकता है (लेकिन हो सकता है)। उदाहरण के लिए, निम्नलिखित कोड है, जो पूर्णांक और नाव के बीच कुछ interconversions का कारण बनता है पर विचार करें:
int main (int argc, char** argv)
{
int precoarced = 35;
// precoarced gets forced to float
float result = 0.5 + precoarced;
// and now we force it back to int
return (int)result;
// I wonder what the disassembly looks like in different environments?
}
जब मैं जी के साथ इस संकलन करने की कोशिश की ++ डिफ़ॉल्ट सेटिंग के साथ (मैं Ubuntu, 86 पर हूँ), और gdb इस्तेमाल किया डिसअसेंबल करने का :
0x00000000004004b4 <+0>: push %rbp
0x00000000004004b5 <+1>: mov %rsp,%rbp
0x00000000004004b8 <+4>: mov %edi,-0x14(%rbp)
0x00000000004004bb <+7>: mov %rsi,-0x20(%rbp)
0x00000000004004bf <+11>: movl $0x23,-0x8(%rbp)
0x00000000004004c6 <+18>: cvtsi2sdl -0x8(%rbp),%xmm0
0x00000000004004cb <+23>: movsd 0x10d(%rip),%xmm1 # 0x4005e0
0x00000000004004d3 <+31>: addsd %xmm1,%xmm0
0x00000000004004d7 <+35>: unpcklpd %xmm0,%xmm0
0x00000000004004db <+39>: cvtpd2ps %xmm0,%xmm0
0x00000000004004df <+43>: movss %xmm0,-0x4(%rbp)
0x00000000004004e4 <+48>: movss -0x4(%rbp),%xmm0
0x00000000004004e9 <+53>: cvttss2si %xmm0,%eax
0x00000000004004ed <+57>: pop %rbp
0x00000000004004ee <+58>: retq
एक सीवीटी-प्रीफिक्स्ड निमोनिक के साथ निर्देशों को नोट करें। ये रूपांतरण निर्देश हैं। तो इस मामले में, कुछ हद तक निर्देशों में हार्डवेयर में रूपांतरण हो रहा है। तो, इन निर्देशों के कितने चक्रों के आधार पर, यह उचित रूप से तेज़ हो सकता है। लेकिन फिर, एक अलग वास्तुकला (या अलग संकलक) कहानी बदल सकता है।
संपादित करें: एक मजेदार साइड नोट पर, मुझे 0.5f के बजाय गलती से 0.5 निर्दिष्ट करने के कारण वहां एक अतिरिक्त रूपांतरण है। यही कारण है कि cvtpd2ps op वहां है।
संपादित करें: x86 के पास लंबे समय तक (80 के दशक से) एफपी समर्थन था, इसलिए x86 को लक्षित करने वाले सी ++ कंपाइलर्स आम तौर पर हार्डवेयर का उपयोग करेंगे (जब तक कि संकलक समय के पीछे गंभीरता से न हो)। इस बात को इंगित करने के लिए धन्यवाद हॉट लिक्स।
हां, विभिन्न प्रकारों के बीच कनवर्ट करने की लागत है। अगर मैं अपने मध्यकाल से वापस आ जाता हूं तो कोई और गहराई से जवाब नहीं दे सकता है। – Mysticial
चूंकि फ्लोटिंग-पॉइंट ऑपरेशंस बेस-2 अंकगणितीय के मामले में गैर-तुच्छ हैं, इसलिए कंपाइलर्स अक्सर सहायक कार्यों को उत्सर्जित करते हैं (देखें कि libgcc की आवश्यकता क्यों है?) और इससे प्रदर्शन को गंभीरता से प्रभावित किया जा सकता है। –
बात यह है कि, आपका प्रोग्राम ** ** ** अलग-अलग प्रकार के संचालन पर एन-आरी ऑपरेशन करता है। यह तर्क के अनुसार तर्क को बढ़ावा देता है सी 99 की 6.3.1।8 सामान्य अंकगणितीय रूपांतरण, और फिर एन-आरी ऑपरेशन होता है, आमतौर पर उसी प्रकार के तर्क के साथ (कुछ अपवाद हैं लेकिन कोई भी जिसमें फ़्लोटिंग-पॉइंट प्रकार शामिल नहीं हैं)। –