इस कोड को g ++ के साथ संकलन करने में इतना समय क्यों लगता है?


12

निम्नलिखित कोड पर विचार करें:

template<int i> class A
{
    typedef A<i-1> B;
    B x, y;
};
template<> class A<0> { char m; };
int main()
{
    A<LEVEL> a;
}

जब निम्नलिखित Bash कमांड द्वारा g ++ द्वारा इसके संकलन को बेंचमार्क किया जा रहा है (g ++ 8.3.0 के साथ)

for ((level=1; level<30; ++level)); do
    echo -n ${level},
    /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp -o /dev/null
done

मुझे निम्न आउटपुट मिले:

1,0.03
2,0.03
3,0.04
4,0.04
5,0.04
6,0.04
7,0.04
8,0.04
9,0.03
10,0.04
11,0.02
12,0.04
13,0.02
14,0.03
15,0.04
16,0.05
17,0.05
18,0.08
19,0.11
20,0.20
21,0.35
22,0.67
23,1.30
24,2.52
25,5.02
26,10.23
27,19.96
28,40.30
29,80.99

तो, संकलन समय में घातीय है LEVEL। लेकिन अगर मैं बदल B x, y;जाता हूं B x[2];, तो निरंतर समय (~ 30 एमएस) में संकलन होता है।

क्यों होता है? मैंने सोचा कि, चूंकि कंपाइलर जानता है कि Bदोनों के लिए एक ही प्रकार है xऔर y, संकलन के रूप में एक ही समय लगेगा x[2]। लेकिन किसी कारण से यह अलग दिखाई देता है। क्या मैं किसी तरह Bमहसूस किया जा सकता हूं (जैसा कि केवल अलियास के विपरीत) ताकि g ++ दोनों चर को आसानी से बना सके जितनी आसानी से यह सरणी बना सकता है?


1
तकनीकी रूप से सही लेकिन बेकार (आपके लिए) उत्तर: कंपाइलर को पैच करें।
बोटजे

5
आप यहाँ क्यों पोस्ट करेंगे? Gcc के पास रिपोर्टिंग समस्याओं के लिए एक बगज़िला है ... सुनिश्चित करें कि आप पहले नवीनतम संस्करण के साथ परीक्षण करें।
मार्क ग्लिससे

@MarcGlisse मुझे उम्मीद थी कि एक अच्छी व्याख्या या एक समाधान हो सकता है। निश्चित नहीं है कि अगर इसे ठीक करने की कोशिश कर रहा हूं, तो इसे बग के रूप में माना जा सकता है।
रुस्लान

3
यहां तक ​​कि उनके पास उन मामलों के लिए एक कीवर्ड "कंपाइल-टाइम-हॉग" भी है जहां कंपाइलर को संकलन के लिए बहुत लंबा समय लगता है, इसलिए हां वे इसे फिक्स करने के लायक मानते हैं (जिसका मतलब यह नहीं है कि वे इसे तुरंत करेंगे)। इसलिए विशेष रूप से यदि आप एक और संकलक देख सकते हैं जिसमें घातांक व्यवहार नहीं है (तो आप जानते हैं कि यह परिहार्य है), कृपया इसकी रिपोर्ट करें। अच्छी तरह से हो सकता है अगर आप डेटाबेस में कुछ भी समान देखें, तो जांच लें, लेकिन यदि आप एक गैर-स्पष्ट डुप्लिकेट याद करते हैं तो यह ठीक है।
मार्क ग्लिससे

जवाबों:


1

क्योंकि आपके g ++ इंस्टेंस में एक बग है। यह नहीं होना चाहिए, और जैसा कि @Marc Glisse ने टिप्पणी की, आपको इसकी रिपोर्ट करनी चाहिए (जो आपने लेखन के समय की है)

आप अपना प्रश्न तब (समझदार पसंद) हटाना चाह सकते हैं। या इस उत्तर को स्वीकार करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.