কনস্ট এবং কনস্টের অস্থির মধ্যে পার্থক্য


90

আমরা যদি volatileপ্রতিবারের মতো নতুন চলচিত্রের আপডেট হওয়ার সাথে সাথে
একটি ভেরিয়েবল ঘোষণা করি তবে যদি আমরা কোনও ভেরিয়েবল ঘোষণা করি constতবে সেই ভেরিয়েবলের মান পরিবর্তন হবে না

তাহলে উপরের হিসাবে const volatile int temp;
ভেরিয়েবল ঘোষণার কী ব্যবহার temp?
আমরা হিসাবে ঘোষণা যদি কি হয় const int temp?


আপনি const volatile int temp;ব্লক স্কোপে (অর্থাত্ অভ্যন্তরীণ { }) ব্যবহার করবেন না , সেখানে এটির কোনও ব্যবহার নেই।
এমএম

উত্তর:


149

চিহ্নিত হিসাবে চিহ্নিত কোনও বস্তু const volatileকোড দ্বারা পরিবর্তিত হওয়ার অনুমতি পাবে না (যোগ্যতার কারণে ত্রুটি উত্থাপিত হবে const) - কমপক্ষে সেই নির্দিষ্ট নাম / পয়েন্টারের মাধ্যমে।

volatileকোয়ালিফায়ার মানে যে কম্পাইলার অপটিমাইজ করবেন করতে পারেন অথবা বস্তু পুনর্বিন্যাস অ্যাক্সেসের অংশ।

এম্বেড থাকা সিস্টেমে এটি সাধারণত হার্ডওয়্যার রেজিস্টারগুলিতে অ্যাক্সেস করতে ব্যবহৃত হয় যা পড়তে পারে এবং হার্ডওয়্যার দ্বারা আপডেট করা যায়, তবে লেখার কোনও অর্থ নেই (বা লিখতে সমস্যা হতে পারে)।

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

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

একটি দ্রুত উদাহরণ:

যদি এই পয়েন্টারগুলিকে হিসাবে চিহ্নিত না করা হয় তবে volatileএকটি দম্পতি সমস্যা হতে পারে:

  • যদিও লুপ পরীক্ষাটি কেবল একবার স্ট্যাটাস রেজিস্টারটি পড়তে পারে, যেহেতু সংকলকটি ধরে নিতে পারে যে এটি যা ইঙ্গিত করেছে তা কখনই পরিবর্তিত হবে না (লুপ পরীক্ষা বা লুপ নিজেই যে এটি পরিবর্তন করতে পারে) তেমন কিছুই নেই)। আপনি যখন ইউআরটি হার্ডওয়ারে কোনও অক্ষর অপেক্ষা না করে ফাংশনে প্রবেশ করেছিলেন, আপনি হয়ত একটি অসীম লুপে পৌঁছাতে পারেন যা কোনও অক্ষর পাওয়ার পরেও কখনও থামেনি।
  • রিসিভ রেজিস্টার পড়ার সময় সংকলক দ্বারা কিছুক্ষণ লুপের আগে স্থানান্তরিত হতে পারে - আবার কারণ ফাংশনে এমন কোনও কিছুই নেই যা ইঙ্গিত করে যে *recv_regলুপটি পরিবর্তিত হয়েছে, লুপে প্রবেশের আগে এটি পড়তে পারে না এমন কোনও কারণ নেই।

volatileকোয়ালিফায়ার নিশ্চিত এই অপ্টিমাইজেশন কম্পাইলার মাধ্যমে করা হয় না যে।


4
ব্যাখ্যার জন্য +1। এবং আমার একটি প্রশ্ন আছে: কনস্টের অস্থির পদ্ধতি সম্পর্কে কী? যদি আমার একটি ক্লাস থাকে, যা অনেকগুলি থ্রেড দ্বারা অ্যাক্সেস করা হয় (যদিও অ্যাক্সেসটি মুটেক্সের সাথে সিঙ্ক্রোনাইজ করা হয়) আমার কনস্টের পদ্ধতিগুলিও অস্থির হতে হবে (যেহেতু কিছু পরিবর্তনশীল অন্য থ্রেড দ্বারা পরিবর্তন করা যেতে পারে)
সাসা

41
  • volatile কম্পাইলারকে ভেরিয়েবল সম্পর্কিত কোডটি অপ্টিমাইজ না করার কথা বলবে, সাধারণত যখন আমরা জানি তখন এটি "বাইরের" থেকে পরিবর্তন করা যেতে পারে, যেমন অন্য কোনও থ্রেড দ্বারা।
  • const সংকলককে বলবে যে প্রোগ্রামটির পক্ষে ভেরিয়েবলের মান পরিবর্তন করা নিষিদ্ধ।
  • const volatileখুব সম্ভবত একটি বিশেষ জিনিস যা আপনি সম্ভবত আপনার জীবনে ঠিক 0 বার ব্যবহার করেছেন (টিএম)। যেমনটি আশা করা যায়, এর অর্থ হল প্রোগ্রামটি ভেরিয়েবলের মানটি পরিবর্তন করতে পারে না, তবে মানটি বাইরে থেকে পরিবর্তন করা যায়, সুতরাং ভেরিয়েবলটির উপর কোনও অপ্টিমাইজেশন করা হবে না।

12
আমি ভেবেছিলাম যে volatileভেরিয়েবলগুলি সাধারণত যখন হয় আপনি অন্যান্য থ্রেডের সাহায্যে হার্ডওয়ারের সাথে জগাখিচুড়ি শুরু করেন তখন কি হয়। যেখানে আমি const volatileব্যবহার দেখেছি তা মেমরি-ম্যাপযুক্ত স্থিতি রেজিস্ট্রার বা এর মতো জিনিসগুলিতে।
আমার সঠিক মতামত

4
অবশ্যই, আপনি একেবারে ঠিক বলেছেন, মাল্টিথ্রেডিং কেবল একটি উদাহরণ, তবে একমাত্র নয় :)।
মিংগোস

26
আপনি যদি এম্বেড থাকা সিস্টেমগুলির সাথে কাজ করেন তবে আপনি এটি প্রায়শই দেখতে পাবেন।
ড্যানিয়েল গ্রিলো

29

এটি পরিবর্তনশীল কনস্ট্যান্ট হওয়ার কারণে নয় যে এটি দুটি ক্রম বিন্দুর মধ্যে পরিবর্তিত হয়নি changed

দৃ Const়তা হল একটি প্রতিশ্রুতি যা আপনি মান পরিবর্তন করবেন না, মান এটি পরিবর্তন করা হবে না তা নয়।


10
constডেটা "ধ্রুবক" নয় তা নির্দেশ করার জন্য প্লাস ওয়ান ।
বোগদান আলেকজান্দ্রু

7

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

... ধ্রুবক মানকে পূর্বাভাস দিয়ে এবং তাত্ক্ষণিক সমাবেশ নির্দেশ ব্যবহার করে, বা কাছের স্থান থেকে ধ্রুবকটি লোড করে, যাতে কনফিগার ফ্ল্যাশ অঞ্চলের মূল CANID মানের কোনও আপডেট অগ্রাহ্য করা যায়। CANID কনস্ট্যান্ট অস্থির হতে হবে।


7

সি তে, constএবং volatileটাইপ কোয়ালিফায়ার এবং এই দুটি স্বতন্ত্র।

মূলত, এর constঅর্থ হল প্রোগ্রামটি দ্বারা মানটি পরিবর্তনযোগ্য নয়।

এবং এর volatileঅর্থ হ'ল মূল্য হঠাৎ পরিবর্তনের (সম্ভবত প্রোগ্রামের বাইরের থেকে) সাপেক্ষে।

আসলে, সি স্ট্যান্ডার্ড একটি বৈধ ঘোষণার একটি উদাহরণ দেয় যা উভয়ই constএবং volatile। উদাহরণটি হ'ল:

extern const volatile int real_time_clock;

যেখানে real_time_clockহার্ডওয়্যার দ্বারা সংশোধনযোগ্য হতে পারে তবে এ্যাসাইন, ইনক্রিমেন্ট বা হ্রাস করা যায় না।

সুতরাং আমাদের ইতিমধ্যে constএবং volatileপৃথকভাবে চিকিত্সা করা উচিত । এই টাইপ কোয়ালিফায়ার প্রয়োগ করা যেতে পারে struct, union, enumএবং typedefহিসাবে ভাল।


5

constএর অর্থ হল যে ভেরিয়েবলটি সি কোড দ্বারা পরিবর্তন করা যায় না, এটি পরিবর্তন করতে পারে না তা নয়। এর অর্থ হ'ল কোনও নির্দেশই চলকটিতে লিখতে পারে না, তবে এর মান এখনও পরিবর্তিত হতে পারে।

volatileএর অর্থ হল যে চলকটি যে কোনও সময় পরিবর্তিত হতে পারে এবং সুতরাং কোনও ক্যাশেড মান ব্যবহার করা যায় না; ভেরিয়েবলের প্রতিটি অ্যাক্সেস তার মেমরি ঠিকানায় চালিত করতে হয়।

যেহেতু প্রশ্নটি "এম্বেডড" ট্যাগ করা হয়েছে এবং মনে tempকরা একটি ব্যবহারকারী পরিবর্তনশীল হিসাবে ঘোষিত হয়েছে, তাই কোনও হার্ডওয়ার-সম্পর্কিত রেজিস্ট্রার নয় (যেহেতু এগুলি সাধারণত পৃথক .h ফাইলে পরিচালনা করা হয়) তাই বিবেচনা করুন:

একটি এম্বেড থাকা প্রসেসর যার উভয়ই অস্থির পঠন-লিখনের ডেটা মেমরি (র‌্যাম) এবং অ-উদ্বায়ী পঠনযোগ্য ডেটা মেমরি রয়েছে, উদাহরণস্বরূপ ভন-নিউম্যান আর্কিটেকচারে ফ্ল্যাশ মেমরি, যেখানে ডেটা এবং প্রোগ্রাম স্পেস একটি সাধারণ ডেটা এবং ঠিকানা বাস ভাগ করে।

যদি আপনি const tempকোনও মান (কমপক্ষে 0 থেকে আলাদা হয়) হিসাবে ঘোষণা করেন তবে সংকলকটি ফ্ল্যাশ স্পেসের কোনও ঠিকানাকে ভেরিয়েবল বরাদ্দ করবে, কারণ এটি কোনও র‌্যাম ঠিকানার জন্য নির্ধারিত হলেও, প্রাথমিক মান সংরক্ষণ করার জন্য এটি এখনও ফ্লেশ মেমরির প্রয়োজন ভেরিয়েবলের, সমস্ত ক্রিয়াকলাপ কেবল পঠনযোগ্য হওয়ায় র‍্যামের ঠিকানাটিকে স্থানের অপচয় হিসাবে তৈরি করে।

ফলে:

int temp;র‌্যামে সঞ্চিত একটি পরিবর্তনশীল, প্রারম্ভকালে (সিএসআর্ট) 0-এ শুরু হয়, ক্যাশেড মানগুলি ব্যবহার করা যেতে পারে।

const int temp;(পঠন-ওনি) ফ্ল্যাশ-এ সঞ্চিত একটি পরিবর্তনশীল, সংকলক সময়ে 0 থেকে শুরু করে, ক্যাশেড মানগুলি ব্যবহার করা যেতে পারে।

volatile int temp; র‌্যামে সঞ্চিত একটি পরিবর্তনশীল, প্রারম্ভকালে (সিএসআর্ট) 0-এ শুরু হয়, ক্যাশেড মানগুলি ব্যবহৃত হবে না।

const volatile int temp; এটি একটি পরিবর্তনশীল (পঠন-অনি) ফ্ল্যাশ-এ সঞ্চিত, সংকলক সময়ে 0 থেকে আরম্ভ করা, ক্যাশেড মানগুলি ব্যবহৃত হবে না

এখানে দরকারী অংশ আসে:

আজকাল বেশিরভাগ এম্বেড থাকা প্রসেসরের একটি বিশেষ ফাংশন মডিউল দ্বারা তাদের কেবল পঠনযোগ্য অ-উদ্বায়ী মেমরিতে পরিবর্তন করার ক্ষমতা রয়েছে, যা ক্ষেত্রে const int tempরানটাইমে পরিবর্তিত হতে পারে, সরাসরি নয় ought অন্যভাবে বলা হয়েছে, কোনও ফাংশন যেখানে tempঠিক আছে ঠিক সেই স্থানে মানটি সংশোধন করতে পারে ।

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

তবে এখানে পার্থক্য আসে:

যদি const int tempএক সময়ের-প্রোগ্রামযোগ্য সিরিয়াল নম্বর পরিবর্তে কোনও পরিবর্তনযোগ্য আইডি হয় এবং এটি ঘোষিত না হয় তবে volatileএকটি ক্যাশেড মানটি পরবর্তী বুট অবধি ব্যবহার করা যেতে পারে, যার অর্থ নতুন আইডি পরবর্তী রিবুট অবধি বৈধ হতে পারে না বা আরও খারাপ কিছু ফাংশন অন্যরা হয়ত নতুন মানটি ব্যবহার করতে পারে যখন অন্যরা পুরানো ক্যাশেড মানটি অবিরত পুনরায় ব্যবহার করতে পারে। যদি const int tempআইএস ঘোষিত হয় voltaileতবে আইডি পরিবর্তনটি তত্ক্ষণাত কার্যকর হবে।


বাহ এই উত্তরটি দীর্ঘ

5

আপনি constএবং volatileএকসাথে ব্যবহার করতে পারেন । উদাহরণস্বরূপ, যদি 0x30কেবলমাত্র বাহ্যিক অবস্থার দ্বারা পরিবর্তিত কোনও বন্দরটির মান হিসাবে ধরে নেওয়া হয় তবে নিম্নলিখিত ঘোষণাটি দুর্ঘটনাক্রমে পার্শ্ব প্রতিক্রিয়া হওয়ার কোনও সম্ভাবনা রোধ করবে:


3

এই নিবন্ধটি এমন দৃশ্যের বিষয়ে আলোচনা করেছে যেখানে আপনি কনস্ট এবং অস্থির যোগ্যতা অর্জন করতে চান।

http://e এম্বেডডগুরুস.com/ বারার- কোড / ২ / ১ / সাম্বিনগ্রন্থ -সিএস- ভোটাটাইল- এবং- কনস্ট- কিওয়ার্ডস /


2

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


1

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

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