এই কোডটি 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;
}

নিম্নলিখিত বাশ কমান্ড দ্বারা 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 এমএস) হয় happens

কেন এমন হয়? আমি ভেবেছিলাম, যেহেতু সংকলক জানে যে এটি উভয়র Bজন্য এক এবং একই ধরণের xএবং yএটি সংকলনের মতো একই সময় নেয় x[2]। তবে কিছু কারণে এটি ভিন্ন প্রদর্শিত হয়। আমি কীভাবে কোনওভাবে Bঅনুধাবন করতে বাধ্য করতে পারি (কেবলমাত্র এলিয়াসের বিপরীতে) যাতে জি ++ উভয় ভেরিয়েবলকে সহজেই তৈরি করতে পারে যেমন এটি অ্যারে তৈরি করেছিল?


1
একটি প্রযুক্তিগতভাবে সঠিক তবে অকেজো (আপনার জন্য) উত্তর: সংকলকটি প্যাচ করুন।
বোতজে

5
আপনি এখানে কেন পোস্ট করবেন? সমস্যাগুলির প্রতিবেদনের জন্য জিসিসির একটি বাগজিলা রয়েছে ... আপনি সর্বশেষতম সংস্করণ দিয়ে পরীক্ষা করেছেন তা নিশ্চিত করুন।
মার্চ গ্লিস

@ মার্কগ্লিস আমি আশা করি এর থেকে ভাল ব্যাখ্যা বা কার্যকারণ হতে পারে। নিশ্চিত না যে আমি যদি এটির মতো রিপোর্ট করে থাকি তবে এটি ঠিক করার চেষ্টা করা কোনও বাগ হিসাবে বিবেচিত হবে।
রুসলান

3
এমনকি তাদের ক্ষেত্রে এমন একটি কীওয়ার্ড রয়েছে "কম্পাইল-টাইম-হগ" যেখানে সংকলক সংকলন করতে খুব বেশি সময় নেয়, তাই হ্যাঁ তারা এটিকে ফিক্সিংয়ের পক্ষে বিবেচনা করে (যার অর্থ এই না যে তারা তা অবিলম্বে এটি করবে)। সুতরাং বিশেষত যদি আপনি অন্য কোনও সংকলক দেখতে পান যার ঘনঘন আচরণ নেই (যাতে আপনি জানেন যে এটি এড়ানো যায়), দয়া করে এটি প্রতিবেদন করুন। ওয়েল হতে পারে আপনি ডাটাবেসে খুব অনুরূপ কিছু দেখতে পান কিনা তা পরীক্ষা করে দেখুন, তবে আপনি যদি অ-সুস্পষ্ট অনুলিপিটি মিস করেন তবে এটি ঠিক।
মার্ক গ্লিস

5
@ মার্কগ্লিস রিপোর্ট করেছেন: gcc.gnu.org/bugzilla/show_bug.cgi?id=91990
রুসলান

উত্তর:


1

কারণ আপনার জি ++ উদাহরণে একটি ত্রুটি রয়েছে। এটি করা উচিত নয়, এবং @ মার্ক গ্লিস মন্তব্য হিসাবে, আপনার এটি রিপোর্ট করা উচিত (যা লেখার সময় আপনি করেছেন)

আপনি নিজের প্রশ্নটি তখন মুছে ফেলতে চাইতে পারেন (বুদ্ধিমান পছন্দ)। অথবা এই উত্তর গ্রহণ করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.