আমি মনে করি আপনি যা চাইছেন তা পেয়েছি। আমি ধরে নিলাম আপনার প্রাথমিক উদ্বেগ হ'ল এর বাইরে নির্ধারিত অ-ইউনিফর্ম ভেরিয়েবলগুলি main()
:
float left;
float right;
float mscaled;
float xn;
float xm;
আসুন একনজরে দেখে নেওয়া যাক জিপিইউ এবং জিএলএসএল কীভাবে কাজ করে। জিপিইউতে স্ট্যাক বা কল অ্যাক্টিভেশন রেকর্ড নেই। বেশিরভাগ সিপিইউতে সি কমপ্লেয়ারের মতো জিএলএসএল তে সুযোগ বা স্থানীয় ভেরিয়েবল অনুকরণ করার উপায় নেই way বিদ্যমান সমস্তগুলি হ'ল নিবন্ধগুলি, যা হয় অভিন্ন রেজিস্টার, শেডার স্টেজ ইনপুট, আউটপুট এবং স্থানীয় রেজিস্টার ফাইলটি যা শেডার অনুরোধের জন্য অনন্য।
অন্য কথায়, কোনও ফাংশন বা স্ট্যাক বা একটি গাদা হিসাবে কোনও জিনিস নেই, সমস্ত ভেরিয়েবলগুলি রেজিস্টারে যে কোনও জায়গায় বাস করে বলে ঘোষণা করে। তারা জিএলএসএল এর কিছু স্কোপের স্থানীয় বা পুরো ফাইলটিতে গ্লোবাল কিনা তা কোনও পার্থক্য করে না। তারা কেবল নিবন্ধভুক্ত।
তবে রেজিস্টার বরাদ্দকারী জিএলএসএল স্ট্যান্ডার্ডের অংশ নয়। জিপিইউ বুঝতে পারে যে উচ্চ-স্তরের জিএলএসএল কোডকে নিম্ন-স্তরের মেশিন কোডে রূপান্তর করার ক্ষেত্রে বিভিন্ন ওপেনজিএল বাস্তবায়নের ক্ষেত্রে বিভিন্ন স্তরের মানের থাকতে পারে। সংকলক (জিএলএসএল বা অন্যথায়) এর আরও জটিল অংশগুলির মধ্যে একটি হল নিবন্ধকরণ বরাদ্দ । এটি সংকলকের অংশ যা নির্ধারণ করে যে প্রদত্ত ভেরিয়েবলটি নিযুক্ত করে কোনটি নিবন্ধভুক্ত করে। সিতে এটি কিছুটা শক্ত হয় কারণ সাধারণত এটি খুব ক্ষুদ্র রেকর্ড ফাইল (বিশেষত x86 এর উপর) মোকাবেলা করতে হয় এবং এটি রেজিস্টার স্পিলিং (স্ট্যাকের চলকগুলি সরিয়ে নেওয়া) এবং আলিয়াসিং (ফাংশনগুলি কল করার আগে র্যামে ফিরে ভেরিয়েবলগুলি সংরক্ষণ করা) এবং ডিল করতে হয় and বিজোড় নির্দেশাবলী যা আউটপুট দাবি করে তা কোনও নির্দিষ্ট রেজিস্টারে (x86 এর)idiv
এই ক্ষেত্রে). কোনও স্ট্যাক বা হিপ না থাকার কারণে জিপিইউগুলিতে একটি বড়-ইশ রেজিস্টার ফাইল রয়েছে, তাই বরাদ্দকারী আরও সহজ হতে পারে।
তবে রেজিস্টার ফাইলটি অসীম নয়। আপনার হার্ডওয়্যার দ্বারা সমর্থিত রেজিস্টারগুলির তুলনায় আপনার যদি আরও ভেরিয়েবল থাকে তবে সংকলকটিকে রেজিস্টারগুলিতে আপনার সমস্ত ভেরিয়েবল ফিট করার চেষ্টা করতে হবে। এটির জন্য সাধারণত লাইভেস রেঞ্জ চেকিংয়ের কিছু ফর্ম প্রয়োজন । এটি হ'ল, যদি আপনি কোনও xn
গণনার জন্য কোনও ভেরিয়েবল ব্যবহার করেন তবে এটি আর কখনও ব্যবহার করবেন না, সংকলক এটি নির্ধারণ করতে পারে এবং তারপরে জেনে রাখা হবে যে অধিকৃত রেজিস্টারটি xn
অন্য ভেরিয়েবল দ্বারা পরে ব্যবহার করা যেতে পারে, সুতরাং সেখানে রেজিস্টারগুলির চেয়ে বেশি ভেরিয়েবলের অনুমতি দেওয়া হয় (এত দীর্ঘ যেমন একবারে খুব বেশি লাইভ ভেরিয়েবল নেই) not
সংকলকটি এটি নাও করতে পারে। এটা নেই। অথবা এটি কেবলমাত্র কিছু ক্ষেত্রে এটি করতে পারে। Scopes সরল সংকলক প্রদত্ত সমাধানের জন্য আরও অনেক সহজ সমস্যা। স্থানীয় ফাংশন ভেরিয়েবলগুলিতে বরাদ্দকৃত সমস্ত নিবন্ধগুলি ফাংশনটি বের হওয়ার পরে পুনরায় ব্যবহার করা যেতে পারে কারণ এটি জানেন যে ভেরিয়েবলগুলি মারা গেছে। গ্লোবাল ভেরিয়েবলের এত সহজ গ্যারান্টি নেই। সুতরাং, কিছু কম সক্ষম সংকলক তাদের জীবনকালকেও অনুকূলিত করতে পারে না এবং বৈশ্বিক চলকগুলি সর্বদা একটি নিবন্ধক খায়। এটি কোনও ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চলবে না তবে এটি কোনও চালক আপনার লেখার শেডারের আকার সীমাবদ্ধ করতে পারে।
সাধারণভাবে, আমি সমস্ত ভেরিয়েবল স্থানীয় রাখার জন্য সুপারিশ করব। সংজ্ঞাটি যত তাড়াতাড়ি বোঝায় তত পরিবর্তনকের ব্যবহারের কাছে রাখুন। এটি কেবল জিএলএসএল নয়, সমস্ত প্রোগ্রামিং ভাষার ক্ষেত্রে প্রযোজ্য। আপনার পক্ষে প্রতিটি ক্ষেত্রে "ভেরিয়েবল" কনস্টের তৈরি করারও পরামর্শ দেব। এটি আবার কিছু কম-সক্ষম সংকলকগুলির একটি ইঙ্গিত হতে পারে যা নির্দিষ্ট অনুকূলকরণ সম্ভব এবং আরও গুরুত্বপূর্ণ এটি আপনার কোডটিকে আরও স্ব-ডকুমেন্টিং এবং বজায় রাখা সহজ করে তোলে।
এবং অবশ্যই, এখানে আপনার বাধ্যবাধকতা "পরীক্ষা করার জন্য সুনির্দিষ্ট প্রোফাইল এবং সন্ধানের জন্য এটি সন্ধান করুন" পরামর্শ। আপনার গ্লোবালগুলি ছাড়া এবং ছাড়াই আপনার শেডারটি লিখুন এবং এটি প্রোফাইল করুন। অনলাইনে যে কোনও এবং সমস্ত পারফরম্যান্স পরামর্শ অবিশ্বস্ত হওয়া উচিত এবং ধরে নেওয়া উচিত বা পুরানো হয়ে গেছে।
main()
ফাংশন মানে ? আপনার মানগুলি কি আসলে গ্লোবাল ভেরিয়েবল (জিএলএসএল পার্লেন্সে ইউনিফর্ম বা বৈশিষ্ট্য) বা ধ্রুবক মান?