2012-05-19 24 views
5

मैं कैसे कुछ C/C++ सुविधाओं की जांच के लिए विधानसभा में अनुवाद किया गया था और मैं निम्नलिखित फ़ाइल बनाई:जीसीसी अनावश्यक असेंबली कोड क्यों बनाता है?

struct foo { 
    int x; 
    char y[0]; 
}; 

char *bar(struct foo *f) 
{ 
    return f->y; 
} 

मैं तो gcc -S के साथ इस संकलित (और यह भी कोशिश की g++ -S के साथ) लेकिन जब मैं को देखा विधानसभा कोड, मैं बार समारोह है कि मैंने सोचा था कि gcc दूर अनुकूलन करने के लिए सक्षम होना चाहिए में एक छोटी सी अतिरेक बात से निराश थे: लाइनों

_bar: 
Leh_func_begin1: 
     pushq %rbp 
Ltmp0: 
     movq %rsp, %rbp 
Ltmp1: 
     movq %rdi, -8(%rbp) 
     movq -8(%rbp), %rax 
     movabsq $4, %rcx 
     addq %rcx, %rax 
     movq %rax, -24(%rbp) 
     movq -24(%rbp), %rax 
     movq %rax, -16(%rbp) 
     movq -16(%rbp), %rax 
     popq %rbp 
     ret 
Leh_func_end1: 

अन्य बातों के अलावा,

012,351,
 movq %rax, -24(%rbp) 
     movq -24(%rbp), %rax 
     movq %rax, -16(%rbp) 
     movq -16(%rbp), %rax 

व्यर्थ रूप से अनावश्यक लग रहा है। क्या कोई कारण जीसीसी (और संभवतः अन्य कंपाइलर्स) इसे अनुकूलित नहीं कर सकता/सकती है?

+1

कृपया मानक अनुकूलन सक्षम करने के लिए -O स्विच के साथ जीसीसी चलाएं। –

+0

जीसीसी का कौन सा संस्करण आप उपयोग कर रहे हैं? –

उत्तर

11

मैंने सोचा कि जीसीसी को अनुकूलित करने में सक्षम होना चाहिए।

gcc manual से:

किसी भी अनुकूलन विकल्प के बिना, संकलक के लक्ष्य संकलन की लागत को कम करने के लिए और डिबगिंग उत्पादन अपेक्षित परिणाम बनाने के लिए है।

दूसरे शब्दों में, यह तब तक अनुकूलित नहीं होता जब तक कि आप इसे न पूछें।

bar: 
.LFB0: 
     .cfi_startproc 
     leaq 4(%rdi), %rax 
     ret 
     .cfi_endproc 

अधिक जानकारी के लिए मैनुअल में Options That Control Optimization देखें: जब मैं -O3 ध्वज का उपयोग कर अनुकूलन चालू करते हैं, जीसीसी 4.4.6 और अधिक कुशल कोड पैदा करता है।

+0

ओह, मुझे लगता है कि मानक अनुकूलन डिफ़ॉल्ट रूप से चालू होगा। वे क्यों नहीं हैं – Matt

+7

@ मैट: मैनुअल को उद्धृत करने के लिए, "किसी भी अनुकूलन विकल्प के बिना, संकलक का लक्ष्य संकलन की लागत को कम करना और डिबगिंग को अपेक्षित परिणामों का उत्पादन करना है।" – NPE

+1

@ मैट और क्योंकि कार्यान्वयनकर्ताओं ने चुना है। जब तक आप उनमें से किसी एक से जवाब नहीं देते हैं, यह एक व्यर्थ सवाल है। – EJP

8

संकलक के बिना संकलक उत्पन्न कोड आमतौर पर एक सीधी निर्देश-निर्देश-निर्देश है, और निर्देश कार्यक्रम के नहीं हैं, लेकिन मध्यवर्ती प्रतिनिधित्व के उन लोगों में जो रिडंडेंसी पेश की गई हो सकती है।

आप इस तरह के अनावश्यक निर्देश के बिना विधानसभा आशा करते हैं, gcc -O -S

अनुकूलन आप उम्मीद कर रहे थे peephole optimization कहा जाता है की तरह इस्तेमाल करते हैं। कंपाइलर्स में आमतौर पर इनमें से बहुत कुछ होता है, क्योंकि अधिक वैश्विक अनुकूलन के विपरीत, वे लागू करने के लिए सस्ते होते हैं और (आमतौर पर) कोड को और भी खराब बनाने का जोखिम नहीं उठाते-अगर संकलन के अंत में लागू होते हैं, कम से कम।

this blog post में, मैं एक उदाहरण प्रदान करता हूं जहां जीसीसी और क्लैंग दोनों छोटे 32-बिट निर्देश उत्पन्न कर सकते हैं जब स्रोत कोड में पूर्णांक प्रकार 64-बिट होता है लेकिन परिणामस्वरूप सबसे कम 32-बिट परिणाम होता है ।

संबंधित मुद्दे