के बीच अंतर मैंने विभिन्न परियोजनाओं में इन दोनों कंपाइलरों का उपयोग किया।क्लैंग और जीसीसी
कोड प्रसंस्करण और आउटपुट पीढ़ियों के मामले में वे अलग कैसे हैं? उदाहरण के लिए gcc
और clang
दोनों ऑप्टिमाइज़ेशन के लिए -O2
विकल्प हैं। क्या वे अनुकूलन कोड के मामले में एक ही तरीके (उच्च स्तर) का संचालन कर रहे हैं? मैं एक छोटे से परीक्षण किया, उदाहरण के लिए अगर मैं निम्नलिखित कोड है:
int foo(int num) {
if(num % 2 == 1)
return num * num;
else
return num * num +1;
}
निम्नलिखित -O2 साथ बजना और जीसीसी के साथ उत्पादन विधानसभाओं हैं:
----gcc 5.3.0----- ----clang 3.8.0----
foo(int): foo(int):
movl %edi, %edx movl %edi, %eax
shrl $31, %edx shrl $31, %eax
leal (%rdi,%rdx), %eax addl %edi, %eax
andl $1, %eax andl $-2, %eax
subl %edx, %eax movl %edi, %ecx
cmpl $1, %eax subl %eax, %ecx
je .L5 imull %edi, %edi
imull %edi, %edi cmpl $1, %ecx
leal 1(%rdi), %eax setne %al
ret movzbl %al, %eax
.L5: addl %edi, %eax
movl %edi, %eax retq
imull %edi, %eax
ret
के रूप में यह उत्पादन देखा जा सकता है अलग-अलग निर्देश हैं। तो मेरा सवाल यह है कि उनमें से एक को अलग-अलग परियोजनाओं में एक दूसरे का फायदा होता है?
आप 'int foo (int num) {return num * num + ~ num & 1;}' लिखकर अपना कोड सुधार सकते हैं। – fuz
@FUZxxl: महान बिंदु, [[बेहतर कोड बनाता है] (https://godbolt.org/g/Y1RZuj), लेकिन आपको माता-पिता 'int foo (int num) की आवश्यकता है {वापसी संख्या * num + (~ num & 1);} 'क्योंकि' और 'की तुलना में कम प्राथमिकता * और + है। इसके अलावा, नकारात्मक संख्याओं के लिए इसका अलग-अलग व्यवहार होता है। सी में,' -1% 2' '-1' है, इसलिए यदि गलत है। gcc का कोड इसके लिए खाता है यदि आप 'n * n + (n% 2) लिखते हैं। –
@FUZxxl नोट के लिए धन्यवाद, यह देखने के लिए एक साधारण परीक्षण है कि कौन से कंपाइलर्स आउटपुट – Pooya