অন্যান্য উত্তরগুলির তুলনায় এটি আরও সূক্ষ্ম। আপনি কীভাবে এটি ঘোষণা করেন তার উপর ভিত্তি করে স্ট্যাকের ডেটা এবং হিপ সম্পর্কিত ডেটার মধ্যে কোনও নিখুঁত বিভাজন নেই। উদাহরণ স্বরূপ:
std::vector<int> v(10);
কোনও ফাংশনের মূল অংশে, vector
এটি স্ট্যাকের দশটি পূর্ণসংখ্যার একটি (গতিশীল অ্যারে) ঘোষণা করে । কিন্তু দ্বারা পরিচালিত স্টোরেজ vector
স্ট্যাকের মধ্যে নেই।
আহ, তবে (অন্যান্য উত্তরগুলি বোঝায়) সেই স্টোরেজটির জীবনকাল vector
নিজের জীবনকালের সাথে আবদ্ধ , যা এখানে স্ট্যাক-ভিত্তিক, তাই এটি কীভাবে প্রয়োগ করা যায় তাতে কোন পার্থক্য নেই - আমরা কেবল এটি স্ট্যাক-ভিত্তিক অবজেক্ট হিসাবে বিবেচনা করতে পারি মান শব্দার্থক সঙ্গে।
তাই না। ধরুন ফাংশনটি ছিল:
void GetSomeNumbers(std::vector<int> &result)
{
std::vector<int> v(10);
// fill v with numbers
result.swap(v);
}
সুতরাং কোনও swap
ফাংশনযুক্ত যে কোনও কিছু (এবং যে কোনও জটিল মানের ধরণের একটি থাকা উচিত) এমন কোনও সিস্টেমের অধীনে কিছু হ্যাপের ডেটাতে এক ধরণের প্রত্যাবর্তনযোগ্য রেফারেন্স হিসাবে পরিবেশন করতে পারে যা সেই ডেটার একক মালিককে গ্যারান্টি দেয়।
অতএব আধুনিক সি ++ পন্থা কখনই নয় হ্যাপ ডেটার ঠিকানাটি নগ্ন স্থানীয় পয়েন্টার ভেরিয়েবলগুলিতে সঞ্চয় করা উচিত নয়। সমস্ত স্তূপ বরাদ্দ অবশ্যই শ্রেণীর ভিতরে লুকানো থাকতে পারে।
যদি আপনি এটি করেন তবে আপনি আপনার প্রোগ্রামের সমস্ত ভেরিয়েবলগুলি এমন ভাবতে পারেন যে সেগুলি সাধারণ মানের ধরণের ছিল এবং পুরোপুরি গাদা সম্পর্কে ভুলে যেতে পারেন (কিছু হিপ ডেটার জন্য একটি নতুন মান-জাতীয় র্যাপার ক্লাস লেখার ব্যতীত, যা অস্বাভাবিক হওয়া উচিত) ।
আপনাকে অনুকূলিতকরণে সহায়তা করার জন্য আপনাকে কেবল একটি বিশেষ জ্ঞান বজায় রাখতে হবে: যেখানে সম্ভব, এর পরিবর্তে অন্যটিকে একটি ভেরিয়েবল নির্ধারণের পরিবর্তে:
a = b;
এগুলিকে এভাবে বদলে দিন:
a.swap(b);
কারণ এটি অনেক দ্রুত এবং এটি ব্যতিক্রম ছুঁড়ে না। একমাত্র প্রয়োজন হ'ল আপনাকে b
একই মান ধরে রাখা চালিয়ে যাওয়ার দরকার হবে না (এটি a
পরিবর্তে এর মান পাবে যা ট্র্যাশে ফেলা হবে a = b
)।
ক্ষতিটি হ'ল এই পদ্ধতির আপনাকে আসল প্রত্যাবর্তনের মানের পরিবর্তে আউটপুট প্যারামিটারগুলির মাধ্যমে ফাংশন থেকে মানগুলি ফেরত দিতে বাধ্য করে। কিন্তু তারা যে সঙ্গে সি ++ 0x মধ্যে স্থাপন করছি rvalue রেফারেন্স ।
সবার মধ্যে সবচেয়ে জটিল পরিস্থিতিতে আপনি এই ধারণাটি সাধারণ shared_ptr
চরমের দিকে নিয়ে যান এবং একটি স্মার্ট পয়েন্টার শ্রেণি ব্যবহার করবেন যা ইতিমধ্যে টিআর 1-এ রয়েছে। (যদিও আমি যুক্তি দিচ্ছি যে আপনার যদি এটির প্রয়োজন মনে হয় তবে আপনি সম্ভবত স্ট্যান্ডার্ড সি ++ এর প্রয়োগযোগ্যতার মিষ্টি স্পটের বাইরে চলে গিয়েছেন))