সিতে কী-ওয়ার্ডটি “রেজিস্টার” করবেন?


272

মূল registerশব্দটি সি ভাষায় কী করে ? আমি পড়েছি এটি অনুকূলিতকরণের জন্য ব্যবহৃত হয় তবে কোনও মানেই এটি পরিষ্কারভাবে সংজ্ঞায়িত হয় না। এটি কি এখনও প্রাসঙ্গিক এবং যদি তাই হয় তবে আপনি কখন এটি ব্যবহার করবেন?


41
সিটিতে রেজিস্টার কীওয়ার্ডটি কী করে? উপেক্ষা করা হয় :)
বেটসেস

18
@bestss সম্পূর্ণ উপেক্ষা করা হয়নি। registerভেরিয়েবলের ঠিকানা পাওয়ার চেষ্টা করুন ।
qrdl

4
আপনি যে কোডটি পড়ছেন তা পুরনো youtube.com/watch?v=ibF36Yyeehw#t=1827
কর্নেল আতঙ্ক

উত্তর:


340

এটি সংকলকটির একটি ইঙ্গিত যা ভেরিয়েবলটি খুব বেশি ব্যবহৃত হবে এবং আপনি যদি সম্ভব হয় তবে এটি প্রসেসরের রেজিস্টারে রাখার পরামর্শ দেন।

বেশিরভাগ আধুনিক সংকলকগণ এটি স্বয়ংক্রিয়ভাবে করেন এবং আমাদের মানবের তুলনায় এগুলি তুলনায় আরও ভাল।


17
ঠিক আছে, আমি আমার এসিএম সাবমিশনগুলি টুইঙ্ক করতে রেজিস্ট্রার নিয়ে পরীক্ষা করেছি এবং কখনও কখনও এটি সত্যই সহায়তা করে। তবে আপনাকে সত্যিই যত্নশীল হতে হবে, কারণ দুর্বল পছন্দগুলি কর্মক্ষমতা হ্রাস করে।
ypnos

80
'নিবন্ধক' ব্যবহার না করার একটি ভাল কারণ : আপনি ঘোষিত 'রেজিস্টার' হিসাবে পরিবর্তনকের ঠিকানা নিতে পারবেন না
অ্যাডাম রোজেনফিল্ড

22
মনে রাখবেন যে কিছু / অনেক সংকলক নিবন্ধক কীওয়ার্ডটিকে সম্পূর্ণ উপেক্ষা করবে (যা পুরোপুরি আইনী)।
ইউরো মিশেল্লি

4
ypnos: আসলে এসিএম আইসিপিসি সমস্যার সমাধানের গতি এ জাতীয় মাইক্রো-অপ্টিমাইজেশনের চেয়ে অ্যালগরিদম পছন্দের উপর অনেক বেশি নির্ভর করে। 5-সেকেন্ড সময় সীমাটি সাধারণত সঠিক সমাধানের জন্য যথেষ্ট হয়, বিশেষত জাভার পরিবর্তে সি ব্যবহার করার সময়।
জোয় 13

65
@ ইউরো: আপনি সম্ভবত এটি জানেন, তবে কেবল স্পষ্ট করে বলতে গেলে, একটি registerপরিবর্তনকের ঠিকানা নেওয়া থেকে বিরত রাখতে সংকলকটির প্রয়োজন ; এই হল শুধুমাত্র বাধ্যতামূলক প্রভাব registerশব্দ। এমনকি এটি অপ্টিমাইজেশানগুলি উন্নত করার পক্ষেও যথেষ্ট, কারণ এটি তুচ্ছ হিসাবে এটি জানাতে তুচ্ছ হয়ে যায় যে কেবল এই ফাংশনের মধ্যে পরিবর্তনশীলটি পরিবর্তন করা যায়।
ডেল হ্যাগলুন্ড

69

আমি অবাক হয়েছি যে কেউই উল্লেখ করেন নি যে আপনি রেজিস্টার ভেরিয়েবলের ঠিকানা নিতে পারবেন না, এমনকি সংকলক নিবন্ধের পরিবর্তে মেমরিতে পরিবর্তনশীল রাখার সিদ্ধান্ত নিয়েছে কিনা।

সুতরাং registerআপনি কোনও কিছুই জিতে না ব্যবহার করে (যেকোনও ক্ষেত্রে সংকলকটি ভেরিয়েবলটি কোথায় রাখবেন তা নিজেই সিদ্ধান্ত নেবে) এবং &অপারেটরকে হারাবে - এটি ব্যবহার করার কোনও কারণ নেই।


94
আসলে একটি কারণ আছে। আপনি ভেরিয়েবলের ঠিকানা নিতে পারেন না এমন একমাত্র সত্য যে কয়েকটি অপ্টিমাইজেশনের সুযোগ দেয়: সংকলক প্রমাণ করতে পারে যে ভেরিয়েবলটি আর সংযুক্ত করা হবে না।
আলেকজান্দ্রি সি

8
সংযোজনকারীরা প্রমাণ করে যে কুখ্যাতটি ভৌতিক হয় যে অ্যালিয়্যাসিং অযৌক্তিক ক্ষেত্রে ঘটে না, তাই registerএটি এর জন্যও কার্যকর যখন সংকলক এটি কোনও রেজিস্টারে না রাখে।
মাইলস রাউটে

2
@ অ্যালেক্সানড্রেসি, মাইলস, সংকলকগণ কোথাও কোনও ভেরিয়েবল নেওয়া হয়েছে কিনা তা পরীক্ষা করে ঠিকঠাক। এলিয়াস সনাক্তকরণ সম্পর্কে অন্যান্য অসুবিধা নির্বিশেষে, বিশ্রাম দেওয়া যা আপনাকে কিছুই কিনে না। যখন কে + আর প্রথম সি তৈরি করেছিলেন, তখন এটি আগে থেকেই জেনে রাখা কার্যকর ছিল যে & ব্যবহার করা হবে না, যেহেতু এই সংকলকটি নীচের কোডটি দেখার আগে, ঘোষণাটি দেখার বিষয়ে রেজিস্টার বরাদ্দের সিদ্ধান্ত নিয়েছিলেন। এজন্য নিষেধাজ্ঞার জায়গা রয়েছে। 'রেজিস্টার' কীওয়ার্ডটি এখন মূলত অপ্রচলিত।
গ্রেগগো

25
এই যুক্তি দ্বারা constঅকার্যকর যেহেতু এটি আপনাকে কিছুই জিতায় না, আপনি কেবল পরিবর্তনশীল পরিবর্তন করার ক্ষমতাটি ছেড়ে দেন। registerভবিষ্যতে কেউ ভেরিয়েবলের ঠিকানা না নিয়ে তা নিশ্চিত করে ব্যবহার করা যেতে পারে। registerযদিও আমি ব্যবহার করার কারণ ছিল না ।
টোর ক্লিংবার্গ

34

এটি কম্পাইলারকে ভেরিয়েবলটি সংরক্ষণ করার জন্য র্যামের পরিবর্তে সিপিইউ রেজিস্টার ব্যবহার করার চেষ্টা করতে বলে। নিবন্ধগুলি সিপিইউতে রয়েছে এবং র‌্যামের চেয়ে অ্যাক্সেস করার জন্য আরও দ্রুত। তবে এটি কেবল সংকলকটির পরামর্শ এবং এটি অনুসরণ নাও করতে পারে।


8
সি ++, সি ++ ব্যবহার করে এমন লোকদের জন্য যুক্তিযুক্ত যা আপনাকে একটি রেজিস্টার ভেরিয়েবলের ঠিকানা নিতে দেয়
উইল

5
@ উইল: ... তবে সংকলক সম্ভবত কীওয়ার্ডটিকে অগ্রাহ্য করবে ignoring আমার উত্তর দেখুন।
বিডব্লিউড্রাকো

হ্যাঁ, এটি দেখে মনে হয় যে 'রেজিস্টার' হ'ল সি ++ তে একটি প্লাসবো, এটি কেবলমাত্র সি কোডটি সি ++ হিসাবে সংকলিত করার অনুমতি দেয়। এবং রেফারেন্স, বা কনস্ট্যান্স-রেফারেন্সের মাধ্যমে এবং পাস-বাই-রেফারেন্স ছাড়াই আপনি সিরিয়াসভাবে সি ++ ভেঙে দিয়েছিলেন এবং নিষেধাজ্ঞার পক্ষে কোনও ধারণা রাখবেন না।
গ্রেগগো

22

আমি জানি এই প্রশ্নটি সি সম্পর্কে, তবে সি ++ এর একই প্রশ্নটি এই প্রশ্নের সঠিক নকল হিসাবে বন্ধ করা হয়েছিল। এই উত্তরটি সি এর জন্য প্রয়োগ করতে পারে না may


সি ++ 11 স্ট্যান্ডার্ডের সর্বশেষ খসড়া, N3485 , এটি 7.1.1 / 3 এ বলেছে:

একটি registerনির্দিষ্টকারী বাস্তবায়নের জন্য একটি ইঙ্গিত যা ঘোষিত ভেরিয়েবলটি ভারী ব্যবহৃত হবে। [ দ্রষ্টব্য: ইঙ্গিতটি উপেক্ষা করা যেতে পারে এবং বেশিরভাগ প্রয়োগে ভেরিয়েবলের ঠিকানা নিলে তা উপেক্ষা করা হবে। এই ব্যবহার অবচিত ... -end নোট ]

C ++ (কিন্তু না সি), মান নেই রাষ্ট্রীয় যে আপনি একটি পরিবর্তনশীল এর ঠিকানা নিতে পারবেন না বলে ঘোষণা register; তবে, কারণ একটি সিপিইউ রেজিস্টারে তার আজীবন জুড়ে থাকা কোনও ভেরিয়েবলের সাথে এটির কোনও স্মৃতি অবস্থান সম্পর্কিত নয়, তার ঠিকানা নেওয়ার চেষ্টা করা অবৈধ হবে, এবং সংকলক registerঠিকানাটি গ্রহণের জন্য কীওয়ার্ডটিকে অগ্রাহ্য করবে ।


17

এটি কমপক্ষে 15 বছর ধরে প্রাসঙ্গিক হয়নি কারণ অপ্টিমাইজাররা আপনার চেয়ে যতটা ভাল সিদ্ধান্ত নিতে পারেন। এমনকি এটি প্রাসঙ্গিক হওয়ার পরেও, এটি সিপিইউ আর্কিটেকচারে অনেকগুলি রেজিস্টার যেমন স্পার্ক বা এম 68000 এর তুলনায় এটি ইন্টেলের সাথে তার নিবন্ধের অভাবের সাথে অনেক বেশি রেজিস্ট্রি করে, যার বেশিরভাগই তার নিজস্ব উদ্দেশ্যে সংরক্ষণ করা হয় own


13

প্রকৃতপক্ষে, রেজিস্টার সংকলককে বলে যে ভেরিয়েবল প্রোগ্রামের অন্য কোনও কিছু (এমনকি চরেরও নয়) সাথে উরিফ দেয় না।

এটি বিভিন্ন পরিস্থিতিতে আধুনিক সংকলকরা কাজে লাগাতে পারে এবং জটিল কোডটিতে এই সংকলকটিকে বেশ খানিকটা সহায়তা করতে পারে - সহজ কোডে সংকলকরা এটি নিজেরাই আবিষ্কার করতে পারে।

অন্যথায়, এটি কোনও উদ্দেশ্য করে না এবং এটি রেজিস্টার বরাদ্দের জন্য ব্যবহৃত হয় না। এটি নির্দিষ্ট করতে সাধারণত পারফরম্যান্স অবক্ষয় হয় না, যতক্ষণ আপনার সংকলক যথেষ্ট আধুনিক modern


"সংকলককে বলে .." না, তা হয় না। সমস্ত অটো ভেরিয়েবলের সেই সম্পত্তি থাকে, আপনি যদি তার ঠিকানা না নেন এবং নির্দিষ্ট বিশ্লেষণযোগ্য ব্যবহারের চেয়ে বেশি এমন উপায়ে ব্যবহার না করেন। সুতরাং, সংকলক কোডটি থেকে এটি জানে, আপনি নিবন্ধক কীওয়ার্ডটি ব্যবহার করেন না কেন of এটি এমনটি ঘটে যে 'রেজিস্টার' কীওয়ার্ডটি এ জাতীয় নির্মাণকে লেখা অবৈধ করে তোলে, তবে আপনি যদি কীওয়ার্ডটি ব্যবহার না করেন এবং ঠিকানাটি এইভাবে গ্রহণ করেন না , তবে সংকলকটি এখনও জানে যে এটি নিরাপদ। এই জাতীয় তথ্য অপ্টিমাইজেশনের পক্ষে গুরুত্বপূর্ণ।
গ্রেগো

1
@ গ্রেগগো: ঠিকঠাক registerগ্রহণ করা একেবারেই খারাপ নিষেধ, অন্যথায় কোনও কম্পাইলার কোনও ক্ষেত্রে কোনও ভেরিয়েবলের ঠিকানা বহিরাগত কার্যক্রমে পাস করার পরেও রেজিস্ট্রার অপ্টিমাইজেশান প্রয়োগ করতে সক্ষম হবে সে ক্ষেত্রে এটি সংঘটিতকারীদের জানাতে কার্যকর হতে পারে (ভেরিয়েবলটি করতে হবে সেই বিশেষ কলটির জন্য স্মৃতিতে ঝাপিয়ে পড়ুন , তবে ফাংশনটি ফিরে আসার পরে, সংকলকটি আবার এটি পরিবর্তনশীল হিসাবে বিবেচনা করতে পারে যার ঠিকানা কখনও নেওয়া হয়নি)।
সুপারক্যাট

@ সুপের্যাট আমার মনে হয় কম্পাইলারটির সাথে এখনও একটি খুব চতুর কথোপকথন হবে। আপনি যদি এইটি সংকলকটি বলতে চান তবে আপনি এটি প্রথম ভেরিয়েবলটিকে দ্বিতীয় এবং যার '&' তে নেই তার অনুলিপি করে তা করতে পারেন এবং তারপরে আর প্রথমটি আর কখনও ব্যবহার করবেন না।
গ্রেগো

1
@greggo: এই বলে যে যদি barএকটি হয় registerপরিবর্তনশীল, একটি কম্পাইলার তার অবসর সময়ে পারে প্রতিস্থাপন foo(&bar);সঙ্গে int temp=bar; foo(&temp); bar=temp;, কিন্তু এর ঠিকানা গ্রহণ barসবচেয়ে অন্যান্য প্রসঙ্গে নিষিদ্ধ করা হবে একটি মাত্রাতিরিক্ত জটিল নিয়ম ভালো বলে মনে হচ্ছে না। যদি ভেরিয়েবলটি অন্যথায় একটি রেজিস্টারে রাখা যায় তবে বিকল্পটি কোডটি আরও ছোট করে তুলবে। যদি চলকটি যেভাবেই র‌্যামে রাখা দরকার হয় তবে বিকল্পটি কোডটি আরও বড় করে তুলবে। সংকলক পর্যন্ত বিকল্প প্রতিস্থাপন করা হবে কিনা এই প্রশ্ন ছেড়ে যাওয়া উভয় ক্ষেত্রেই আরও ভাল কোডের দিকে পরিচালিত করবে।
সুপারক্যাট

1
@ গ্রেগগো: registerগ্লোবাল ভেরিয়েবলগুলিতে যোগ্যতার অনুমতি দেওয়া , সংকলক ঠিকানাটি গ্রহণের অনুমতি দেয় বা না দেয়, এমন ক্ষেত্রে এমন কিছু ক্ষেত্রে সুন্দর অপ্টিমাইজেশনের অনুমতি দেবে যেখানে বৈশ্বিক চলক ব্যবহার করা একটি অন্তর্নিহিত ফাংশনটি একটি লুপে বারবার বলা হয়। আমি লুপ পুনরাবৃত্তির মধ্যে একটি ভেরিয়েবল একটি রেজিস্টারে রাখা যাক অন্য কোন উপায় চিন্তা করতে পারি না - আপনি পারেন?
সুপারক্যাট

13

আমি পড়েছি এটি অনুকূলিতকরণের জন্য ব্যবহৃত হয় তবে কোনও মানেই এটি পরিষ্কারভাবে সংজ্ঞায়িত হয় না।

আসলে এটা করা হয় পরিষ্কারভাবে সি মান দ্বারা সংজ্ঞায়িত। N1570 খসড়া বিভাগটি 6..7.১ অনুচ্ছেদ Qu উদ্ধৃত করা হয়েছে (অন্যান্য সংস্করণগুলিতে একই শব্দাবলি রয়েছে):

স্টোরেজ-ক্লাস স্পেসিফায়ারযুক্ত কোনও সামগ্রীর জন্য শনাক্তকারীর একটি ঘোষণার registerপরামর্শ দেয় যে বস্তুর অ্যাক্সেস যত দ্রুত সম্ভব। এই ধরনের পরামর্শ কার্যকর করার পরিমাণটি বাস্তবায়ন-সংজ্ঞায়িত।

অ্যানারি &অপারেটরটি কোনও সংজ্ঞায়িত অবজেক্টে প্রয়োগ করা যাবে না registerএবং registerবাহ্যিক ঘোষণায় এটি ব্যবহার করা যাবে না।

আরও কয়েকটি (মোটামুটি অস্পষ্ট) নিয়ম রয়েছে যা registerযোগ্যতাযুক্ত অবজেক্টগুলির জন্য নির্দিষ্ট :

  • একটি অ্যারের অবজেক্টের সাথে registerসংজ্ঞায়িত করে দেওয়া আচরণ রয়েছে und
    সংশোধন: এটির সাথে একটি অ্যারে অবজেক্টটি সংজ্ঞায়িত করা আইনী register, তবে আপনি এই জাতীয় কোনও বস্তুর সাহায্যে দরকারী কিছু করতে পারবেন না (অ্যারেতে ইনডেক্সিং এর প্রাথমিক উপাদানটির ঠিকানা নেওয়া দরকার)।
  • _Alignasসুনির্দিষ্টভাবে উল্লেখ করা (C11 নতুন) যেমন একটি বস্তু প্রয়োগ করা যেতে পারে।
  • যদি va_startম্যাক্রোতে পাস করা প্যারামিটারের নামটি registerযোগ্যতাযুক্ত হয়, তবে আচরণটি নির্ধারিত।

আরও কয়েকজন থাকতে পারে; স্ট্যান্ডার্ডের একটি খসড়া ডাউনলোড করুন এবং আপনার আগ্রহী হলে "রেজিস্টার" সন্ধান করুন।

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

এর মূল স্পষ্ট প্রভাবটি registerএটি কোনও বস্তুর ঠিকানা নেওয়ার যে কোনও প্রয়াসকে বাধা দেয়। এটি একটি অপ্টিমাইজেশন ইঙ্গিত হিসাবে বিশেষভাবে কার্যকর নয়, যেহেতু এটি কেবল স্থানীয় ভেরিয়েবলগুলিতে প্রয়োগ করা যেতে পারে, এবং একটি অনুকূলকরণ সংকলক নিজেই দেখতে পারে যে এই জাতীয় কোনও বস্তুর ঠিকানা নেওয়া হয়নি।


সুতরাং এই প্রোগ্রামের আচরণটি কি সি স্ট্যান্ডার্ড অনুযায়ী সত্যই অপরিজ্ঞাত? এটি কি সি ++ এ ভাল সংজ্ঞায়িত হয়েছে? আমি মনে করি এটি সি ++ এ ভালভাবে সংজ্ঞায়িত হয়েছে।
ধ্বংসকারী

@ পরিচালক: এটি কেন সংজ্ঞায়িত হবে? কোনও registerযোগ্যতার অ্যারে অবজেক্ট নেই, যদি আপনি এটি ভাবছেন।
কিথ থমসন

ওহ দুঃখিত, আমি মূল () এ অ্যারে ডিক্লোরেশনে রেজিস্টার কীওয়ার্ড লিখতে ভুলে গেছি। এটি কি সি ++ এ ভাল সংজ্ঞায়িত হয়েছে?
ডিসট্রাক্টর

registerঅ্যারে অবজেক্টগুলি সংজ্ঞায়িত করার বিষয়ে আমি ভুল ছিলাম ; আমার উত্তরে আপডেট হওয়া প্রথম বুলেট পয়েন্টটি দেখুন। এই জাতীয় কোনও বিষয় সংজ্ঞায়িত করা আইনী তবে আপনি এটি দিয়ে কিছুই করতে পারবেন না। আপনি যোগ তাহলে registerসংজ্ঞা sমধ্যে আপনার উদাহরণ , প্রোগ্রাম (ক বাধ্যতা লঙ্ঘন) অবৈধ সি সি ++ এ একই বিধিনিষেধ স্থান নেই register, তাই প্রোগ্রাম বৈধ সি হবে ++, (কিন্তু ব্যবহার registerঅর্থহীন হবে)।
কিথ থমসন

@ কিথথম্পসন: মূলশব্দটি registerকার্যকর উদ্দেশ্য হিসাবে কাজ করতে পারে যদি এই জাতীয় পরিবর্তনের ঠিকানা নেওয়া বৈধ ছিল তবে কেবলমাত্র যখন ক্ষেত্রে পদার্থগুলি তার ঠিকানাটি গ্রহণ করা হয় তখন অস্থায়ীটিতে ভেরিয়েবলটি অনুলিপি করে অস্থায়ী থেকে পুনরায় লোড করা যায় cases পরবর্তী ক্রম বিন্দুতে। এটি কম্পাইলাররা ধরে নিতে পারে যে ভেরিয়েবলটি নিরাপদে সমস্ত পয়েন্টার অ্যাক্সেসের জন্য একটি রেজিস্টারে রাখা যেতে পারে তবে শর্ত দেওয়া হয় যে এটি যে কোনও স্থানে তার ঠিকানা নেওয়া হয়েছে তাতে এটি ফ্লাশ হয়েছে।
সুপারক্যাট

9

গল্পের সময়!

সি, একটি ভাষা হিসাবে, একটি কম্পিউটারের বিমূর্ততা। এটি আপনাকে কম্পিউটারগুলি যা করতে পারে তার শর্তে জিনিসগুলি করার অনুমতি দেয়, তা হ'ল মেমোরিটি হেরফের করা, গণিত করা, জিনিসগুলি প্রিন্ট করা ইত্যাদি in

তবে সি কেবল একটি বিমূর্ততা। এবং শেষ পর্যন্ত, এটা কি থেকে আহরণের এর আপনি পরিষদের ভাষা। এসপিএল হ'ল ভাষা হ'ল সিপিইউ পঠিত ভাষা, এবং যদি আপনি এটি ব্যবহার করেন, আপনি সিপিইউ-এর শর্তে জিনিসগুলি করেন। সিপিইউ কী করে? মূলত, এটি মেমরি থেকে পড়ে, গণিত করে এবং মেমরিতে লেখে। সিপিইউ কেবল স্মৃতিতে সংখ্যায় গণিত করে না। প্রথমত, আপনাকে সিপিইউর ভিতরে মেমোরি থেকে মেমরিতে একটি নম্বর স্থানান্তর করতে হবে যা রেজিস্টার বলে। একবার এই সংখ্যায় আপনার যা যা করা দরকার তা করার পরে, আপনি এটিকে স্বাভাবিক সিস্টেমের মেমোরিতে ফিরিয়ে আনতে পারেন। কেন সিস্টেম মেমরি মোটেই ব্যবহার করবেন? রেজিস্টার সংখ্যা সীমিত। আপনি কেবলমাত্র আধুনিক প্রসেসরগুলিতে প্রায় একশো বাইট পাবেন, এবং পুরানো জনপ্রিয় প্রসেসরগুলি আরও দুর্দান্তভাবে সীমাবদ্ধ ছিল (6502 আপনার বিনামূল্যে ব্যবহারের জন্য 3 8-বিট রেজিস্টার ছিল)। সুতরাং, আপনার গড় গণিত অপারেশন দেখে মনে হচ্ছে:

load first number from memory
load second number from memory
add the two
store answer into memory

এর অনেকটাই ... গণিত নয়। এই লোড এবং স্টোর অপারেশনগুলিতে আপনার প্রক্রিয়াকরণের সময় অর্ধেক সময় নিতে পারে। সি, কম্পিউটারগুলির বিমূর্ততা হিসাবে প্রোগ্রামারকে রেজিস্টারগুলি ব্যবহার এবং জাগল করার উদ্বেগকে মুক্ত করে এবং যেহেতু কম্পিউটারের মধ্যে নম্বর এবং প্রকারেরতমতা থাকে, সি কেবলমাত্র সংকলকটিতে রেজিস্টার বরাদ্দের দায়িত্ব রাখে। একটি ব্যতিক্রম ছাড়া।

আপনি যখন ভেরিয়েবল ঘোষণা করেন register, আপনি সংকলককে বলছেন "ইয়ো, আমি এই পরিবর্তনশীলটি প্রচুর ব্যবহার করা এবং / বা স্বল্প জীবনযাপনের ইচ্ছা করি I আমি যদি আপনি থাকতাম তবে আমি এটি একটি রেজিস্টারে রাখার চেষ্টা করতাম।" যখন সি স্ট্যান্ডার্ড বলে যে কম্পাইলারগুলিকে আসলে কিছু করতে হবে না, কারণ সি স্ট্যান্ডার্ডটি জানে না আপনি কোন কম্পিউটারের জন্য সংকলন করছেন এবং এটি উপরের 6502 এর মতো হতে পারে, যেখানে কেবলমাত্র পরিচালনা করার জন্য সমস্ত 3 নিবন্ধকের প্রয়োজন হয় , এবং আপনার নম্বর রাখার জন্য কোনও অতিরিক্ত নিবন্ধ নেই। যাইহোক, যখন এটি বলে যে আপনি ঠিকানাটি নিতে পারবেন না, কারণ এটি রেজিস্টারের ঠিকানা নেই। তারা প্রসেসরের হাত। যেহেতু সংকলকটি আপনাকে কোনও ঠিকানা দিতে হবে না এবং যেহেতু এটির কোনও ঠিকানা কখনও পাওয়া যায় না, তাই বেশ কয়েকটি অপ্টিমাইজেশন এখন সংকলকটির জন্য উন্মুক্ত। এটি বলা যেতে পারে, সর্বদা একটি রেজিস্টারে নম্বর রাখতে পারে। এটা না এটি কম্পিউটার মেমরিতে কোথায় সঞ্চিত তা নিয়ে চিন্তা করতে হবে (এটি আবার ফিরে পাওয়ার প্রয়োজনের বাইরে)। এমনকি এটি এটি অন্য ভেরিয়েবলের মধ্যে শোধ করতে পারে, অন্য প্রসেসরের কাছে এটি দিতে পারে, এটি একটি পরিবর্তিত স্থান দিতে পারে ইত্যাদি could

tl; dr: স্বল্প-কালীন ভেরিয়েবলগুলি যা প্রচুর গণিত করে। একবারে খুব বেশি ঘোষণা করবেন না।


5

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

মূল শব্দটি দীর্ঘ, দীর্ঘ পিছনে ব্যবহৃত হয়েছিল। যখন কেবলমাত্র খুব কম রেজিস্টার ছিল যেগুলি আপনার তর্জনী ব্যবহার করে সেগুলি গণনা করতে পারে।

তবে, যেমনটি আমি বলেছি, হ্রাসের অর্থ এই নয় যে আপনি এটি ব্যবহার করতে পারবেন না।


13
পুরানো কিছু হার্ডওয়্যারটিতে আধুনিক ইন্টেল মেশিনগুলির চেয়ে বেশি রেজিস্টার ছিল। রেজিস্টার গণনার বয়স এবং সিপিইউ আর্কিটেকচারের সাথে করার মতো কিছুই করার নেই।
আমার সঠিক মতামতটি

2
@ JUSTMYcorrectOPINION প্রকৃতপক্ষে, এক্স 86 এর মূলত ছয়টি রয়েছে, 'নিবন্ধকরণ' উত্সর্গের জন্য সর্বাধিক 1 বা 2 রেখে গেছে। প্রকৃতপক্ষে, যেহেতু এতগুলি কোড লিখিত বা নিবন্ধক-দরিদ্র মেশিনে পোর্ট করা হয়েছে, তাই আমি সন্দেহ করি যে এটি 'রেজিস্টার' কীওয়ার্ডটি একটি স্থানের হয়ে ওঠার ক্ষেত্রে যথেষ্ট অবদান রেখেছিল - যখন রেজিস্টার নেই তখন ইঙ্গিত দেওয়ার কোনও মানে নেই। এখানে আমরা 4+ বছর পরে আছি এবং ধন্যবাদ x86_64 এটিকে 14 এ উন্নীত করেছে, এবং এআরএম এখন খুব বড় জিনিস।
গ্রেগো

4

একটু ডেমো (যে কোন বাস্তব জগতের উদ্দেশ্যে ছাড়া) তুলনা জন্য যখন সরানোর registerপ্রতিটি পরিবর্তনশীল সামনে কীওয়ার্ড, কোড এই টুকরা 3.41 সেকেন্ড আমার আই 7 (জিসিসি) উপর, লাগে সঙ্গে register 0.7 সেকেন্ডের মধ্যে একই কোড সমাপ্ত হবে।

#include <stdio.h>

int main(int argc, char** argv) {

     register int numIterations = 20000;    

     register int i=0;
     unsigned long val=0;

    for (i; i<numIterations+1; i++)
    {
        register int j=0;
        for (j;j<i;j++) 
        {
            val=j+i;
        }
    }
    printf("%d", val);
    return 0;
}

2
জিসিসি 4.8.4 এবং -O3 সহ, আমি কোনও পার্থক্য পাই না। -O3 এবং 40000 পুনরাবৃত্তিও ছাড়া, আমি পেতে হয়তো 50 MS একটি 1.5s মোট সময় কম, কিন্তু আমি এটা যথেষ্ট সময়ের চালানো হয়নি জানাতে চাই যে, যদি এমনকি statistaclly উল্লেখযোগ্য ছিল।
zstewart

ক্ল্যাং 5.0 এর সাথে কোনও পার্থক্য নেই, প্ল্যাটফর্মটি AMD64। (আমি ASM আউটপুট চেক করেছি))
ern0

4

আমি নিম্নলিখিত কোডটি ব্যবহার করে কিউএনএক্স 6.5.0 এর অধীনে রেজিস্টার কীওয়ার্ডটি পরীক্ষা করেছি:

#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#include <sys/neutrino.h>
#include <sys/syspage.h>

int main(int argc, char *argv[]) {
    uint64_t cps, cycle1, cycle2, ncycles;
    double sec;
    register int a=0, b = 1, c = 3, i;

    cycle1 = ClockCycles();

    for(i = 0; i < 100000000; i++)
        a = ((a + b + c) * c) / 2;

    cycle2 = ClockCycles();
    ncycles = cycle2 - cycle1;
    printf("%lld cycles elapsed\n", ncycles);

    cps = SYSPAGE_ENTRY(qtime) -> cycles_per_sec;
    printf("This system has %lld cycles per second\n", cps);
    sec = (double)ncycles/cps;
    printf("The cycles in seconds is %f\n", sec);

    return EXIT_SUCCESS;
}

আমি নিম্নলিখিত ফলাফল পেয়েছি:

-> 807679611 চক্র অতিক্রান্ত

-> এই সিস্টেমে প্রতি সেকেন্ডে 3300830000 চক্র রয়েছে

-> সেকেন্ডে চক্রটি 0.244600 ডলার

এবং এখন নিবন্ধ ছাড়াই:

int a=0, b = 1, c = 3, i;

আমি পেয়েছি:

-> 1421694077 চক্র অতিক্রান্ত হয়েছে

-> এই সিস্টেমে প্রতি সেকেন্ডে 3300830000 চক্র রয়েছে

-> সেকেন্ডে চক্রটি 0.430700 ডলার


2

রেজিষ্টারটি সংকলককে অবহিত করবে যে কোডার বিশ্বাস করে যে এই পরিবর্তনশীলটি পরিবর্তনশীল ব্যবহারের জন্য উপলব্ধ কয়েকটি রেজিস্টরের একটিতে এটির স্টোরেজকে ন্যায়সঙ্গত করার জন্য যথেষ্ট পরিমাণে লেখা / পড়া হবে। রেজিস্টারগুলি থেকে পড়া / লেখা সাধারণত দ্রুত হয় এবং এটির জন্য একটি ছোট অপ-কোড সেট প্রয়োজন।

আজকাল, এটি খুব কার্যকর নয়, কারণ বেশিরভাগ সংকলকগুলির অপ্টিমাইজারগুলি এই পরিবর্তনশীলটির জন্য কোনও রেজিস্টার ব্যবহার করা উচিত এবং কতক্ষণের জন্য তা নির্ধারণ করার চেয়ে আপনার চেয়ে ভাল।


2

সত্তরের দশকে, সি ভাষার একেবারে গোড়ার দিকে, প্রোগ্রামারকে সংকলকটিকে ইঙ্গিত দেওয়ার অনুমতি দেওয়ার জন্য রেজিস্টার কীওয়ার্ডটি চালু করা হয়েছিল, এটি উল্লেখ করে যে ভেরিয়েবলটি প্রায়শই ব্যবহার করা হবে, এবং এটি জ্ঞানী হওয়া উচিত প্রসেসরের অভ্যন্তরীণ রেজিস্ট্রারের একটিতে এর মান রাখুন।

আজকাল, রেজিস্টারগুলিতে রাখার সম্ভাবনা বেশি এমন ভেরিয়েবলগুলি নির্ধারণ করতে প্রোগ্রামারগুলির চেয়ে অপ্টিমাইজারগুলি আরও বেশি দক্ষ এবং অপ্টিমাইজার সবসময় প্রোগ্রামারের ইঙ্গিতটিকে বিবেচনায় রাখে না।

তাই অনেক লোক ভুলভাবে রেজিস্টার কীওয়ার্ডটি ব্যবহার না করার পরামর্শ দেয়।

দেখা যাক কেন!

রেজিস্টার কীওয়ার্ডের একটি সম্পর্কিত পার্শ্ব প্রতিক্রিয়া রয়েছে: আপনি কোনও রেজিস্টার টাইপ ভেরিয়েবলটি উল্লেখ করতে (ঠিকানা পেতে পারেন) can

অন্যদের রেজিস্টার ব্যবহার না করার পরামর্শ দেওয়া লোকেরা এটি অতিরিক্ত যুক্তি হিসাবে ভুলভাবে গ্রহণ করে।

তবে, আপনি কোনও রেজিস্টার ভেরিয়েবলের ঠিকানা নিতে পারবেন না তা জানার সাধারণ ঘটনাটি সংকলককে (এবং তার অপ্টিমাইজারকে) এটি জানতে দেয় যে এই ভেরিয়েবলের মান অপ্রত্যক্ষভাবে কোনও পয়েন্টারের মাধ্যমে পরিবর্তন করা যায় না।

যখন নির্দেশের স্ট্রিমের নির্দিষ্ট বিন্দুতে, কোনও প্রসেসরের রেজিস্টারে একটি রেজিস্টার ভেরিয়েবলের মান নির্ধারিত হয় এবং অন্য ভেরিয়েবলের মান পেতে রেজিস্টারটি ব্যবহার করা হয় নি, সংকলক জানে যে এটি পুনরায় লোড করার প্রয়োজন নেই comp যে রেজিস্টারে ভেরিয়েবলের মান। এটি ব্যয়বহুল অকেজো মেমরি অ্যাক্সেস এড়াতে দেয়।

আপনার নিজের পরীক্ষা করুন এবং আপনি আপনার সবচেয়ে অভ্যন্তরীণ লুপগুলিতে উল্লেখযোগ্য পারফরম্যান্সের উন্নতি পাবেন।

c_register_side_effect_performance_boost


1

সমর্থিত সি সংকলকগুলিতে কোডটি অনুকূলিত করার চেষ্টা করে যাতে ভেরিয়েবলের মান প্রকৃত প্রসেসরের রেজিস্টারে রাখা হয় in


1

মাইক্রোসফ্টের ভিজ্যুয়াল সি ++ সংকলক registerকীওয়ার্ডটিকে উপেক্ষা করে যখন বিশ্বব্যাপী নিবন্ধ-বরাদ্দ অপ্টিমাইজেশন (/ Oe সংকলক পতাকা) সক্ষম করা হয়।

এমএসডিএন-তে নিবন্ধ কীওয়ার্ড দেখুন See


1

রেজিস্টার কীওয়ার্ড সিপইউ নিবন্ধগুলিতে নির্দিষ্ট ভেরিয়েবলটি সংরক্ষণ করতে সংকলককে বলে যাতে এটি দ্রুত অ্যাক্সেসযোগ্য হয়। প্রোগ্রামারের দৃষ্টিকোণ থেকে রেজিস্টার কীওয়ার্ডটি ভেরিয়েবলগুলির জন্য ব্যবহৃত হয় যা কোনও প্রোগ্রামে প্রচুর পরিমাণে ব্যবহৃত হয়, যাতে সংকলক কোডটি দ্রুত করতে পারে can যদিও এটি সিপিইউ রেজিস্টারগুলিতে পরিবর্তনশীল রাখতে হবে বা মূল স্মৃতিতে সংকলকটির উপর নির্ভর করে।


0

নিবন্ধগুলি নিবন্ধগুলিতে নিবন্ধগুলিতে সেই নির্দিষ্ট ভেরিয়েবলটি মেমরিতে রেখে সংরক্ষণের মাধ্যমে এই কোডটি অনুকূল করতে সংকলককে নির্দেশ করে। সংকলক করার অনুরোধ, সংকলক এই অনুরোধটি বিবেচনা করতে পারে বা নাও পারে। আপনার কিছু পরিবর্তনশীল খুব ঘন ঘন অ্যাক্সেস হচ্ছে এমন ক্ষেত্রে আপনি এই সুবিধাটি ব্যবহার করতে পারেন। প্রাক্তন হিসাবে: একটি লুপিং।

আরও একটি বিষয় হ'ল আপনি যদি ভেরিয়েবলটিকে রেজিস্টার হিসাবে ঘোষণা করেন তবে এটির ঠিকানা আপনি মেমরিতে সঞ্চয় না করে পেতে পারেন না। এটি সিপিইউ রেজিস্ট্রারে তার বরাদ্দ পায়।


0

অপ্টিমাইজেশন ফ্ল্যাগ ব্যবহার না করে জিসিসি 9.3 এসএম আউটপুট (এই উত্তরের প্রতিটিই অপ্টিমাইজেশান ফ্ল্যাগ ছাড়া মানক সংকলনকে বোঝায়):

#include <stdio.h>
int main(void) {
  int i = 3;
  i++;
  printf("%d", i);
  return 0;
}
.LC0:
        .string "%d"
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], 3
        add     DWORD PTR [rbp-4], 1
        mov     eax, DWORD PTR [rbp-4]
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        mov     eax, 0
        leave 
        ret
#include <stdio.h>
int main(void) {
  register int i = 3;
  i++;
  printf("%d", i);
  return 0;
}
.LC0:
        .string "%d"
main:
        push    rbp
        mov     rbp, rsp
        push    rbx
        sub     rsp, 8
        mov     ebx, 3
        add     ebx, 1
        mov     esi, ebx
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    printf
        add     rsp, 8
        pop     rbx
        pop     rbp
        ret

এটি ebxগণনার জন্য ব্যবহার করার জন্য বল প্রয়োগ করে, এর অর্থ এটি স্ট্যাকের দিকে ঠেলাঠেলি করা এবং ফাংশন শেষে পুনরুদ্ধার করা প্রয়োজন কারণ এটি কলি সেভ হয়েছে। registerকোডের আরও লাইন তৈরি করে এবং 1 মেমরি লিখন এবং 1 মেমরি পড়ুন (যদিও বাস্তবে, হিসাবটি সম্পন্ন করা হত যদি এটি 0 আর / ডাব্লুতে অনুকূলিত করা যেতে পারে esi, যা সি ++ এর ব্যবহার করে ঘটেছিল const register)। registerকারণ 2 রাইট এবং 1 রিড ব্যবহার না করা (যদিও লোড ফোরওয়ার্ডিং স্টোরটি পড়তে হবে)। এটি হ'ল মানটি সরাসরি স্ট্যাকের সাথে উপস্থিত থাকতে হবে এবং আপডেট করতে হবে যাতে সঠিক মান ঠিকানা (পয়েন্টার) দ্বারা পঠন করা যায়। registerএই প্রয়োজনীয়তা নেই এবং নির্দেশ করা যাবে না। constএবং registerমূলত এর বিপরীত volatileএবং ব্যবহার হয়volatileফাইল এবং ব্লক স্কোপে registerকনস্টের অপটিমাইজেশন এবং ব্লক-স্কোপে অপ্টিমাইজেশন ওভাররাইড করবে । const registerএবং registerঅভিন্ন আউটপুট উত্পাদন করবে কারণ ব্লক-স্কোপে registerকনস্টিটেড সি তে কিছুই করে না, সুতরাং কেবলমাত্র অপটিমেশনগুলি প্রয়োগ হয়।

ঝনঝন তারিখে, registerউপেক্ষা করা হয় কিন্তু constoptimisations এখনও দেখা যায়।

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