অস্থির পরিবর্তনশীল ঘোষণার অর্থ কী?


9

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


1
আপনি যদি নিজের বয়সটি volatileভেরিয়েবলের বাইরে পড়তে থাকেন এবং এটি 5 বলে, এবং আপনি পরের বছর আবার এটি পড়েন, আপনি 6 পাওয়ার নিশ্চয়তা
পেয়েছেন

@ 5gon12eder, আমি বুঝতে পারি অস্থির অর্থ কিছু দ্রুত এবং সহজ পরিবর্তনের সাপেক্ষে তবে, কীভাবে এটি কাজ করে? : এস
ভিকাটন

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

উত্তর:


11

volatile এর অর্থ অন্য কোনও প্রসেসর বা আই / ও ডিভাইস বা কোনও কিছু আপনার নীচে থেকে চলকটি পরিবর্তন করতে পারে।

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

তবে আপনি এটি হিসাবে পড়তে পারেন 5, তারপরে সম্ভবত সিস্টেমটি সেই মেমরিতে ডিস্ক থেকে ডেটা লোড করে, এতে পরিবর্তন করে 500। আপনি যদি নিজের প্রোগ্রামটি সতেজ মানটি পড়তে চান 500তবে পূর্বে-পঠিত ব্যবহারটি সম্পর্কে খুব স্মার্ট না হওয়ার জন্য আপনার সংকলকটি দরকার 5। আপনাকে প্রতিবার মানটি পুনরায় লোড করার জন্য এটি বলতে হবে। এটা কি volatileকরে।

5 বছর বয়সের বাচ্চাদের জন্য একটি সাদৃশ্য ধরা
যাক আপনি কোনও টেবিলে একটি বড় কাগজ রেখেছিলেন। কাগজের এক কোণে, আপনি একটি চলমান গেমের বর্তমান স্কোর লিখুন 3 to 4,। তারপরে আপনি টেবিলের বিপরীত দিকে যান এবং গেমটি সম্পর্কে একটি গল্প লেখা শুরু করেন। আপনার বন্ধুটি যিনি গেমটি দেখছেন গেমটি এগিয়ে যাওয়ার সাথে সাথে সেই কোণায় স্কোর আপডেট করে। তিনি মুছে ফেলেন 3 to 4এবং লেখেন 3 to 5

আপনি যখন আপনার গল্পে গেমের স্কোর রাখতে যান, আপনি হয় তা করতে পারেন:

  1. আপনি পড়া শেষ স্কোর লিখুন 3 to 4, আনন্দের সাথে ধরে নিবেন যে এটি পরিবর্তন হয়নি (বা যদি তা হয় তবে কিছু মনে করেন না), বা
  2. বর্তমান স্কোরটি পড়ার জন্য টেবিলের বিপরীত দিকে ঘুরুন (যা 3 to 5এখন ঘটে ) এবং ফিরে হাঁটুন। এভাবেই একটি volatileপরিবর্তনশীল কাজ করে।

11

volatile অর্থ দুটি জিনিস:

  1. ভেরিয়েবলের মান কোনও কোড পরিবর্তন না করে পরিবর্তিত হতে পারে। সুতরাং যখনই সংকলক ভেরিয়েবলের মান পড়বে তখন এটি ধরে নিতে পারে না যে এটি শেষবারের মতো পড়া হয়েছিল, বা এটি সঞ্চিত সর্বশেষ মানের সমান, তবে এটি আবার পড়তে হবে।

  2. একটি মানকে একটি উদ্বায়ী ভেরিয়েবলের কাছে সঞ্চয় করার কাজটি "পার্শ্ব প্রতিক্রিয়া" যা বাইরে থেকে লক্ষ্য করা যায়, তাই সংকলককে কোনও মান সংরক্ষণের অ্যাক্টটি সরাতে দেওয়া হয় না; উদাহরণস্বরূপ, যদি দুটি মান একটি সারিতে সঞ্চিত থাকে, তবে সংকলকটিকে অবশ্যই দুটিবার মানটি সঞ্চয় করতে হবে।

উদাহরণ হিসাবে:

i = 2; 
i = i; 

সংকলকটিকে অবশ্যই দুটি নম্বর সংরক্ষণ করতে হবে , ভেরিয়েবলটি পড়তে হবে, ভেরিয়েবলটি আইতে পড়বে।

অন্য একটি পরিস্থিতি রয়েছে: যদি কোনও ফাংশন ব্যবহার করে setjmpএবং তারপরে longjmpডাকা হয় তবে ফাংশনের সমস্ত অস্থির স্থানীয় ভেরিয়েবলের সর্বশেষ মান সংরক্ষণের গ্যারান্টিযুক্ত - অ-উদ্বায়ী স্থানীয় ভেরিয়েবলগুলির ক্ষেত্রে এটি নয়।


এখানে কিছু সূক্ষ্ম সমস্যা আছে। একটি সূক্ষ্ম সমস্যা হ'ল আপনি যখন পরিবর্তনশীলটির বৈশিষ্ট্য হিসাবে অস্থির পাঠকে চিহ্নিত করেন তখন বাস্তবে তারা পরিবর্তনশীল কীভাবে অ্যাক্সেস করা যায় তার একটি বৈশিষ্ট্য । আমাদের যদি ভেরিয়েবল iএবং মান থাকে pi = &iতবে x = *piতার থেকে একটি পঠন করা যায় iতবে সেই পঠনটি অস্থির শব্দার্থে গ্যারান্টিযুক্ত নয়।
এরিক লিপার্ট

1
@ এরিকলিপার্ট: যদি iসেই হিসাবে ঘোষণা করা হয় volatile int iতবে তা piঅবশ্যই ঘোষণা করতে হবে , কোন volatile int *piক্ষেত্রে *piএকটি উদ্বায়ী প্রবেশাধিকার আছে, না?
জন পূর্ব

2

বিমূর্ত ব্যাখ্যা
C এবং C ++ উভয়েরই একটি বিমূর্ত মেশিনের ধারণা রয়েছে । কোডটি যখন কিছু ভেরিয়েবলের মান ব্যবহার করে, তখন অ্যাবস্ট্রাক্ট মেশিনটি বলে যে বাস্তবায়নের ক্ষেত্রে সেই ভেরিয়েবলের মান অ্যাক্সেস করতে হবে। ফর্মের কোডটি statement_A; statement_B; statement_C;নির্দিষ্ট আদেশ অনুসারে কার্যকর করতে হবে। এই তিনটি বিবৃতিতে সাধারণ অভিব্যক্তিগুলি প্রতিবার ঘটেছিল তা পুনরায় গণনা করতে হবে।

বিমূর্তির ক্রম প্রদত্ত বিমূর্ত মেশিনগুলি অনুসারে, statement_A; statement_B; statement_C;বাস্তবায়নটি প্রথমে statement_Aতার সম্পূর্ণতা statement_Bএবং তারপরে অবশ্যই সম্পাদন করতে হবে statement_C। বাস্তবায়ন মনে করতে পারে না যে আপনি age5 এর মান নির্ধারণ করেছেন। প্রতিটি বিবৃতি যা রেফারেন্সের ageপরিবর্তে সেই পরিবর্তকের মানটি অ্যাক্সেস করতে হবে।

volatileঅ্যাবস্ট্রাক্ট মেশিনের স্পেসিফিকেশন অনুসারে যদি প্রয়োগগুলি কঠোরভাবে সি বা সি ++ কোড কার্যকর করে তবে কীওয়ার্ডটির প্রয়োজন হবে না । সি এবং সি ++ অ্যাবস্ট্রাক্ট মেশিনে নিবন্ধগুলির কোনও ধারণা নেই, সাধারণ সুবে এক্সপ্রেশনগুলির কোনও ধারণা নেই এবং কার্যকর করার আদেশ কঠোর।

উভয় ভাষারও বিধি - বিধান রয়েছে। কোনও বাস্তবায়ন এতক্ষণ মানের সাথে সঙ্গতিপূর্ণ যে বাস্তবায়ন এমনভাবে আচরণ করে যেন এটি বিমূর্ত মেশিনের স্পেসিফিকেশন অনুসারে জিনিসগুলি কার্যকর করে। সংকলকটি অনুমান করতে পারে যে অ-উদ্বায়ী ভেরিয়েবলগুলি অ্যাসাইনমেন্টের মধ্যে মান পরিবর্তন করে না। যতক্ষণ না এটি as-ifনিয়ম ভঙ্গ করে , ক্রমটি কিছু statement_A; statement_B; statement_C;অংশ statement_C, তার কিছু অংশ statement_A, তারপরে সমস্ত statement_B, তারপরে বাকী statement_Aএবং অবশেষে বাকী অংশগুলি প্রয়োগ করে প্রয়োগ করা যেতে পারে statement_C

সেগুলি যদি নিয়মগুলি volatileভেরিয়েবলের ক্ষেত্রে প্রযোজ্য না । বিষয়ে volatileভেরিয়েবল এবং ফাংশন, একটি বাস্তবায়ন ঠিক কি আপনি এটা বলেন না, এবং ঠিক অনুক্রমে আপনি কিছু করার এটা বলা কি আছে।

বিমূর্ত মেশিনের স্পেসিফিকেশনের একটি খারাপ দিক রয়েছে: এটি আস্তে আস্তে। অন্যান্য ভাষার তুলনায় সি এবং সি ++ এর একটি ইতিবাচক দিক হ'ল এগুলি বেশ দ্রুত। এই বিমূর্ত মেশিনে কোড কার্যকর করা হলে এটি হবে না। যেমন-যদি নিয়ম কি সক্ষম সি এবং সি ++ এত দ্রুত হতে হয়।

ELI5 উত্তর

সংকলক যখন মেমরি ঠিকানাটি "অনুকূলিত করে" না দেয় তার অর্থ কী?

একটি মেমরি ঠিকানার "অপ্টিমাইজ করা" একটি উন্নত ধারণা, এমন একটি জিনিস যা পাঁচ বছরের পুরানো ক্ষমতার ক্ষেত্রের মধ্যে নেই। পাঁচ বছর বয়সী বয়সের অনুসারী আপনি তাদের যা করতে বলছেন ঠিক তেমনই করবে, আর কিছু হবে না, কমও থাকবে না। এর সাথে volatile, আপনি বাস্তবায়নটিকে পাঁচটির মতো কাজ করতে বলছেন: চিন্তা নেই, অভিনব অপ্টিমাইজেশন নেই। পরিবর্তে, বাস্তবায়নটি কোডটি যা করতে বলছে ঠিক তাই করবে।


1

(অ-) অস্থিরতা কীভাবে কোডটি অপ্টিমাইজ করা যায় তা সংকলকটির জন্য একটি ইঙ্গিত (উত্পন্ন সমাবেশ-কোড দৃষ্টিকোণ থেকে):

  • অস্থিরতার অর্থ হ'ল আপনার বর্তমান সংকলক স্থির করে যে চলকটি কোথায় অবস্থিত হবে বা কীভাবে ভেরিয়েবল-এর মান সাবরুটিনে স্থানান্তরিত হবে dec
    • একটি নির্দিষ্ট মেমরি ঠিকানায়,
    • স্ট্যাক [প্রসেসরের বর্তমান স্ট্যাকপয়েন্টার সম্পর্কিত]]
    • স্তূপে [প্রসেসরের বর্তমান বেসপয়েন্টার সম্পর্কিত)
    • প্রসেসরের রেজিস্টারে,
    • ...
  • অস্থির মানে হ'ল সংকলকটি পরিবর্তনশীলটিকে অনুকূল করতে পারে না কারণ মূল-সিপিইউ-এস কন্ট্রোলের বাইরে অন্য কোনও কিছু (যেমন একটি পৃথক আইও-প্রসেসর) এই মানটি পরিবর্তন করতে পারে।

0

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

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

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

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

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