(পটভূমি: আমার সি এবং সি ++ সংকলক প্রয়োগ করার কিছু অভিজ্ঞতা আছে))
সি 99 এর পরিবর্তনশীল দৈর্ঘ্যের অ্যারেগুলি মূলত একটি মিসটপ ছিল। ভিএলএএসকে সমর্থন করার জন্য, সি 99 কে সাধারণ বোধে নিম্নলিখিত ছাড়গুলি দিতে হয়েছিল:
sizeof x
আর সবসময় একটি সংকলন-সময় ধ্রুবক হয় না; sizeof
সংকলকটি কখনও কখনও রানটাইমে একটি এক্সপ্রেশন মূল্যায়ন করতে কোড উত্পন্ন করতে হবে ।
দ্বি-মাত্রিক VLAs অনুমতি ( int A[x][y]
) ফাংশন যে পরামিতি হিসেবে 2D VLAs নেওয়া প্রকাশক জন্য একটি নতুন বাক্য গঠন প্রয়োজন: void foo(int n, int A[][*])
।
সি ++ বিশ্বে কম গুরুত্বপূর্ণ, তবে এম্বেডড-সিস্টেম প্রোগ্রামারগুলির সি টার্গেট শ্রোতার পক্ষে অত্যন্ত গুরুত্বপূর্ণ, একটি ভিএলএ ঘোষণা করার অর্থ আপনার স্ট্যাকের একটি নির্বিচারে বড় অংশকে ছোপানো । এটি একটি গ্যারান্টিযুক্ত স্ট্যাক-ওভারফ্লো এবং ক্রাশ। (যে কোনও সময় আপনি ঘোষণার int A[n]
পরে, আপনি n
স্পষ্টতই জোর দিয়ে বলছেন যে আপনার কাছে 2 জিবি ছাড়ার মতো স্ট্যাক রয়েছে After সর্বোপরি, যদি আপনি জানেন তবে " এখানে অবশ্যই 1000 এর চেয়ে কম আছে"), তবে আপনি কেবল ঘোষণা করবেন for এর জন্য int A[1000]
32-বিট পূর্ণসংখ্যার n
স্থান 1000
পরিবর্তন একটি ভর্তি আপনার প্রোগ্রামের আচরণটি কী হওয়া উচিত তা আপনার কোনও ধারণা নেই))
ঠিক আছে, সুতরাং এখন C ++ সম্পর্কে কথা বলা যাক। সি ++-তে, আমাদের মধ্যে "টাইপ সিস্টেম" এবং "ভ্যালু সিস্টেম" এর মধ্যে একই শক্তিশালী পার্থক্য রয়েছে যা সি ৯৯… তবে আমরা সিটিতে যেভাবে নেই তার উপর নির্ভর করতে শুরু করেছি। উদাহরণ স্বরূপ:
template<typename T> struct S { ... };
int A[n];
S<decltype(A)> s; // equivalently, S<int[n]> s;
যদি n
একটি সংকলন-সময় ধ্রুবক না (যেমন, যদি A
পরিবর্তনশীল পরিবর্তিত ধরণের হয়), তবে পৃথিবীতে কি ধরণের হবে S
? হায় S
'র টাইপ এছাড়াও শুধুমাত্র রানটাইম এ নির্ধারণ করা?
এই সম্পর্কে কি:
template<typename T> bool myfunc(T& t1, T& t2) { ... };
int A1[n1], A2[n2];
myfunc(A1, A2);
সংকলকটির কিছু তাত্ক্ষণিকতার জন্য কোড উত্পন্ন করতে হবে myfunc
। এই কোডটি দেখতে কেমন হবে? A1
সংকলনের সময়টির ধরণটি না জানলে আমরা কীভাবে স্ট্যাটিকালি সেই কোডটি তৈরি করতে পারি ?
সবচেয়ে খারাপ, এটি যদি রানটাইমের সময় দেখা দেয় যে n1 != n2
তাই !std::is_same<decltype(A1), decltype(A2)>()
? সেক্ষেত্রে কলটি myfunc
সংকলনও করা উচিত নয় , কারণ টেমপ্লেটের ধরণের কাটা ব্যর্থ হওয়া উচিত! রানটাইমে আমরা কীভাবে সেই আচরণটি অনুকরণ করতে পারি?
মূলত, সি ++ আরও এবং আরও বেশি সিদ্ধান্তকে সংকলন-সময় : টেমপ্লেট কোড তৈরি, constexpr
ফাংশন মূল্যায়ন ইত্যাদির দিকে এগিয়ে যাওয়ার দিকে এগিয়ে চলেছে । এদিকে, C99 রানটাইমের মধ্যে tradition তিহ্যগতভাবে সংকলন-সময় সিদ্ধান্তগুলি (উদাঃ sizeof
) চাপতে ব্যস্ত ছিল । এটিকে মনে রেখে, C99- স্টাইলের ভিএলএলএসকে সি ++ তে সংহত করার চেষ্টা করা কোনও প্রচেষ্টা ব্যয় করা কি সত্যিকার অর্থে আসে ?
প্রতিটি অন্যান্য উত্তরদাতা ইতিমধ্যে উল্লেখ করেছেন যে, সি ++ প্রচুর পরিমাণে হিপ-বরাদ্দ প্রক্রিয়া সরবরাহ করে ( std::unique_ptr<int[]> A = new int[n];
বা std::vector<int> A(n);
স্পষ্টত হওয়া) যখন আপনি সত্যই এই ধারণাটি প্রকাশ করতে চান "আমার কতটা র্যাম দরকার হতে পারে তা আমার কোনও ধারণা নেই।" এবং সি ++ অনিবার্য পরিস্থিতি মোকাবিলার জন্য একটি নিফটি ব্যতিক্রম-হ্যান্ডলিং মডেল সরবরাহ করে যে আপনার যে পরিমাণ র্যাম প্রয়োজন তা আপনার পরিমাণের চেয়ে বেশি is তবে আশাকরি এই উত্তরটি আপনাকে কেন C99- স্টাইলের ভিএলএল সি সি ++ এর জন্য উপযুক্ত নয় - এবং সি 99 এর জন্য খুব ভাল ফিটও নয় সে সম্পর্কে একটি ভাল ধারণা দেয় । ;)
বিষয়ে আরও তথ্যের জন্য, N3810 "অ্যারে এক্সটেনশনের বিকল্পগুলি" , ভিএলএএস-এর বজর্ন স্ট্রোস্ট্রপের অক্টোবর ২০১ paper পত্রিকা দেখুন। বার্জার্নের পিওভ আমার থেকে খুব আলাদা; N3810 জিনিসগুলির জন্য ভাল সি ++ ইশ সিনট্যাক্স সন্ধান করতে এবং সি ++ এ কাঁচা অ্যারের ব্যবহারকে নিরুৎসাহিত করার দিকে আরও বেশি জোর দেয় , যেখানে আমি রূপক ও টাইপ সিস্টেমের প্রভাবগুলিতে আরও মনোনিবেশ করেছি। আমি জানি না যে তিনি রূপক / টাইপ সিস্টেমের প্রভাবগুলি সমাধান, দ্রবণযোগ্য বা নিছক উদ্দীপনা বিবেচনা করছেন কিনা।
এই একই পয়েন্টগুলির মধ্যে বেশ কয়েকটিতে হিট একটি ভাল ব্লগ পোস্ট হ'ল "ভেরিয়েবল দৈর্ঘ্যের অ্যারেগুলির আইনী ব্যবহার" (ক্রিস ওয়েলনস, 2019-10-27)।