পরমাণুর ভেক্টরের সূচনা


12

বিবেচনা:

void foo() {
  std::vector<std::atomic<int>> foo(10);
  ...
}

Foo এর বিষয়বস্তু এখন বৈধ? বা এগুলি কী স্পষ্টভাবে ফাঁক করে শুরু করতে হবে? আমি গডবোল্টে দেখেছি এবং এটি ঠিক আছে, তবে মানটি এই বিষয়টিতে খুব বিভ্রান্ত বলে মনে হচ্ছে।

এসটিডি :: ভেক্টর কন্সট্রাকটর এটা সন্নিবেশ বলেছেন ডিফল্ট সন্নিবেশিত দৃষ্টান্ত std::atomic<int>, যা হয় ইনিশিয়ালাইজ মান বসানো মাধ্যমে new

আমি মনে করি মান আরম্ভের এই প্রভাবটি প্রযোজ্য:

2) টি যদি ডিফল্ট কনস্ট্রাক্টর সহ টি শ্রেণীবদ্ধ হয় যা ব্যবহারকারী-সরবরাহিত হয় না এবং মুছে ফেলা হয় না (অর্থাত্ এটি একটি বর্ণ-সংজ্ঞায়িত বা পূর্বনির্ধারিত ডিফল্ট কনস্ট্রাক্টর সহ একটি শ্রেণি হতে পারে), অবজেক্টটি শূন্য-আরম্ভ হয় এবং তারপরে এটি হয় ডিফল্ট-সূচনা যদি এটিতে একটি তুচ্ছ-ডিফল্ট ডিফল্ট নির্মাণকারী থাকে;

সুতরাং এটি আমার কাছে মনে হয় যে পরমাণুগুলি শূন্য-সূচনাযুক্ত। সুতরাং প্রশ্নটি হচ্ছে, কোনও শূন্য-সূচনাটি std::atomic<int>কোনও বৈধ অবজেক্টের ফলশ্রুতি দেয়?

আমি অনুমান করতে যাচ্ছি যে উত্তরটি "হ্যাঁ বাস্তবে তবে এটি সত্যই সংজ্ঞায়িত হয়নি"?

দ্রষ্টব্য: এই উত্তরটি সম্মত হয় যে এটি শূন্য-সূচনাযুক্ত, তবে এর অর্থ যদি অবজেক্টটি বৈধ হয় তবে সত্যই তা বলে না।

উত্তর:


7

আপনি চিন্তিত হতে সঠিক। মান অনুসারে পারমাণবিকের ডিফল্ট কনস্ট্রাক্টর বলা হয়, তবে সেগুলি আরম্ভ হয় নি । এটি কারণ ডিফল্ট কনস্ট্রাক্টর পরমাণু শুরু করে না:

ডিফল্ট- ইনিশিয়েলাইজডেstd::atomic<T> কোনও Tঅবজেক্ট থাকে না এবং এর একমাত্র বৈধ ব্যবহারগুলি স্টাড :: অ্যাটমিক_আইনাইট দ্বারা ধ্বংস এবং আরম্ভ হয়

এটি কিছুটা সাধারণ ভাষার নিয়ম লঙ্ঘন করে এবং কিছু বাস্তবায়ন যাইহোক (আপনারা যেমন উল্লেখ করেছেন) শুরু করে।

বলা হচ্ছে, আমি 100% নিশ্চিত হয়ে ওঠে যে তারা মান অনুসারে সঠিকভাবে আরম্ভ করা হয়েছে - 100% আপনি যদি একযোগে কাজ করে যাচ্ছেন যেখানে ব্যাগগুলি ট্র্যাক করা খুব কঠিন হতে পারে তার জন্য অতিরিক্ত পদক্ষেপ নেওয়ার পরামর্শ দেব।

রিপার ব্যবহার করে ইস্যুটি ডজ করার অনেকগুলি উপায় রয়েছে:

struct int_atomic {
   std::atomic<int> atomic_{0};//use 'initializing' constructor
};

বা আসলে ব্যবহার atomic_init। আপনাকে ইতিমধ্যে যে কোনও প্রশ্নে
কোডটির

ডিফল্ট কন্সট্রাকটর তাই এটি তুচ্ছ হয় না হয় যাহাই হউক না কেন (প্রশ্নে উদ্ধৃতি প্রতি) নামক
কক্ষপথে লঘিমা জাতি

@ লাইটনেসেসেস উইথমোনিকা এটিও একটি সম্ভাব্য, আমি কেবল মোড়কে হাইলাইট করতে চাই
দারুনে

@ লাইটনেসেসেস উইথমোনিকা এটি সাধারণ ভাষার নিয়মগুলির ব্যতিক্রম - যদিও কিছু সংকলক এই ব্যতিক্রমটি প্রয়োগ করে না। আমি নিশ্চিত না যে স্টোরটেলার উত্তরটি 100% সঠিক।
darune

2

এমনকি যদি ডিফল্ট কনস্ট্রাক্টরকে ডেকে আনা হয় (এটি নয়, কারণ এটি তুচ্ছ) এটি আসলে কিছুই করে না

জিরো-ইনিশিয়ালাইজেশন অবশ্যই একটি বৈধ পরমাণু উত্পাদন গ্যারান্টিযুক্ত হতে পারে না; এই শুধুমাত্র যদি কাজ করব সুযোগ দ্বারা একটি বৈধ পারমাণবিক তার সকল সদস্যদের শূন্য initialising করে নির্মিত হয়।

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

আপনার এখন পাত্রে এবং std::atomic_initপ্রতিটি উপাদানটি লুপ করা উচিত । আপনার যদি এটির চারপাশে লক করার দরকার হয় তবে এটি ঠিক আছে কারণ আপনি ইতিমধ্যে একই কারণে ভেক্টরের তৈরির কাজটি সিঙ্ক্রোনাইজ করছেন।


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