সি ++ তে পিওডির প্রকারগুলি কী কী?


977

আমি এই শব্দটি POD- টাইপটি কয়েকবার এসেছি।
এর মানে কী?


1
এছাড়াও দেখুন http://stackoverflow.com/questions/2293796
লেজার

5
দয়া করে chat.stackoverflow.com/transcript/message/213026#213026 এবং পরের দিনের গৃহীত উত্তর সম্পর্কে আলোচনার জন্য বার্তাগুলি দেখুন
জোহানেস স্কাউব - lit


@ প্যাক্সোস ১৯7777: দয়া করে আপনার "সমাধান" নির্বাচন (বর্তমানে হিউগিলের উত্তর) নির্বাচন করুন যাতে মৌলিকভাবে ভুল উত্তর গুগলদের এখানে বিভ্রান্ত না করে doesn't
চিয়ার্স এবং এইচটিএইচ - Alf

আমরা এই সিদ্ধান্তে পৌঁছেছি যে সি-স্টাইলের স্ট্রিংটি কোনও পিওডি টাইপ নয় কারণ ১) পয়েন্টারটি স্ট্রিং ডেটার সাথে সামঞ্জস্যপূর্ণ নয় এবং ২) স্ট্রিংকে একটি পডটি তৈরি করার জন্য আপনাকে টাইপটি নিশ্চিত করতে হবে পিওডি প্রকারের পূর্বনির্ধারিত আকারের মধ্যে এটিতে নীল-মেয়াদী চর ছিল যা অপরিবর্তিত আচরণের দিকে পরিচালিত করে।

উত্তর:


694

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

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

সি ++ 98/03 এর উত্তরের আরও বৃহত্তর বিশদ পাওয়া যাবে । সি ++ 11 POD পার্শ্ববর্তী নিয়ম পরিবর্তিত তাদের ব্যাপকভাবে শক্তিহানিকর, এইভাবে এখানে একটি ফলো-আপ উত্তর গুরুত্বসহ এখন


34
একটি পার্থক্য আছে। অন্তর্নিহিত প্রকারগুলি হ'ল "বিল্টিন" ভাষার আদিম। পিওডির ধরণগুলি হ'ল এগুলি (এবং অন্যান্য পিওডি) এর আরও সমষ্টি।
অ্যাডাম রাইট

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

34
সি ++ 11 এ আপনি MyType POD কিনা তা জানাতে std :: is_pod <MyType> () করতে পারেন।
অ্যালিউরকোড 21 '24

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

6
−1 এই উত্তরটি এখনও 16 ই আগস্ট 2016 পর্যন্ত মৌলিকভাবে ভুল এবং বিভ্রান্তিমূলক: পিওডির ধরণগুলি শ্রেণির ধরণের হিসাবে সীমাবদ্ধ নয়।
চিয়ার্স এবং এইচটিএইচ - Alf

352

খুব অনানুষ্ঠানিকভাবে:

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

কম অনানুষ্ঠানিকভাবে:

  • int, char, wchar_t, bool, float, doublePods, যেমন হয় long/shortএবং signed/unsignedতাদের মধ্যে সংস্করণ।
  • পয়েন্টার (পয়েন্টার-টু ফাংশন এবং পয়েন্টার-থেকে-সদস্য সহ) পিওডি হ'ল,
  • enums পিওডি হ'ল
  • a constবা volatilePOD হলেন একটি POD is
  • class, structবা unionপিওডিগুলির একটি হ'ল একটি পিওড যা প্রদত্ত যে সমস্ত অ স্থিতিশীল ডেটা সদস্য হয় publicএবং এর কোনও বেস ক্লাস এবং কোনও নির্মাণকারী, ডেস্ট্রাক্টর বা ভার্চুয়াল পদ্ধতি নেই। স্থিতিশীল সদস্যরা এই নিয়মের অধীনে কোনও পিওড হওয়া বন্ধ করবেন না। এই নিয়মটি সি ++ 11 এ পরিবর্তিত হয়েছে এবং নির্দিষ্ট কিছু ব্যক্তিগত সদস্যের অনুমতি রয়েছে: সমস্ত ব্যক্তিগত সদস্য সহ কোনও শ্রেণি কি পিওডি ক্লাস হতে পারে?
  • উইকিপিডিয়া বলতে ভুল হয় যে কোনও পডের কাছে পয়েন্টার-টু-সদস্য সদস্য টাইপ সদস্য থাকতে পারে না। বা বরং, এটি সি ++ 98 শব্দটির জন্য সঠিক, তবে টিসি 1 স্পষ্ট করে জানিয়েছে যে পয়েন্টার-টু-সদস্য সদস্য হ'ল পিওডি।

আনুষ্ঠানিকভাবে (সি ++ 03 স্ট্যান্ডার্ড):

৩.৯ (১০): "গাণিতিক প্রকার (9.৯.১), গণনার প্রকার, পয়েন্টার প্রকার, এবং পয়েন্টার টু মেম্বার টাইপ (৩.৯.২) এবং সিভি-কোয়ালিটিড সংস্করণ (৩.৯.৩) সম্মিলিতভাবে কলার স্কেলার প্রকারগুলি। স্কেলার প্রকারগুলি, পিওডি-স্ট্রাক্ট প্রকারগুলি, পিওডি-ইউনিয়ন প্রকারগুলি (ধারা 9), এই জাতীয় ধরণের অ্যারে এবং সিভি-যোগ্য সংস্করণগুলির এই ধরণের (3.9.3) সম্মিলিতভাবে পিওডি প্রকারগুলি বলা হয় "

9 (4): "একটি পড-স্ট্রাক্ট একটি সামগ্রিক শ্রেণি যা নন-পিওডি-স্ট্রাক্ট, নন-পিওডি-ইউনিয়ন (বা এই জাতীয় ধরণের অ্যারে) বা রেফারেন্সের কোনও স্থিতিশীল ডেটা সদস্য নেই এবং এর কোনও ব্যবহারকারী- অনুলিপি অপারেটর এবং কোনও ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ডেস্ট্রাক্টরকে সংজ্ঞায়িত করুন Similarly একইভাবে একটি পড-ইউনিয়ন একটি সামগ্রিক ইউনিয়ন যা নন-পিওডি-স্ট্রাক্ট, নন-পিওডি-ইউনিয়ন (বা এই জাতীয় ধরণের অ্যারে) বা রেফারেন্সের কোনও স্থিতিশীল ডেটা সদস্য নয়, এবং কোনও ব্যবহারকারী-সংজ্ঞায়িত কপি অপারেটর এবং কোনও ব্যবহারকারী-সংজ্ঞায়িত ডেস্ট্রাক্টর নেই।

8.5.1 (1): "একটি সমষ্টি হ'ল একটি অ্যারে বা শ্রেণি (ধারা 9) কোনও ব্যবহারকারী-ঘোষিত কনস্ট্রাক্টর (12.1) নেই, কোনও ব্যক্তিগত বা সুরক্ষিত অ-স্থিতিশীল ডেটা সদস্য নয় (ধারা 11), কোনও বেস ক্লাস নেই (ধারা 10) এবং কোনও ভার্চুয়াল ফাংশন নেই (10.3) "


3
আপনার আনুষ্ঠানিক / কম ফর্মাল আছে। আপনি থাম্ব নিয়ম যোগ করতে পারে। প্রকারভেদে নির্মিত (বা এর মতো কিছু) এর প্রকার এবং সমষ্টিগুলিতে অন্তর্নির্মিত। সঠিক সংজ্ঞা পাওয়ার সাথে সাথে আমাদের জ্ঞানটি ব্যবহার করা সহজ করে তুলতে হবে।
মার্টিন ইয়র্ক

1
আপনি "অফসেটগুলিতে যখন অন্য ধরণের কাস্ট_তে " বিট কিছুটা ভুল । এই অফসেটগুলি বেস বা উত্পন্ন শ্রেণিতে কাস্ট করার সময় প্রয়োগ করা হয়। সুতরাং, যদি আপনি একটি POD বেস শ্রেণি পয়েন্টার থেকে একটি নন-পিওডি উদ্ভূত শ্রেণিতে কাস্ট করেন তবে আপনি এখনও একটি অ্যাডজাস্টমেন্টের সম্মুখীন হতে পারেন।
এমসাল্টারস

1
@ স্টিভ জেসোপ: কেন আমাদের পিওডি এবং নন-পিওডি'র মধ্যে একেবারে পার্থক্য করা দরকার?
লেজার

6
@ লেজার: এটি সম্পূর্ণ অন্য প্রশ্ন, "পিওডিরা কীভাবে আচরণ করে?" "পিওডির অর্থ কী?" এর বিপরীতে। সংক্ষেপে পার্থক্যটি আরম্ভের সাথে সম্পর্কিত হয় (সুতরাং ডুপ্লিকেট অবজেক্টগুলিতে ম্যাকপি ব্যবহার করা), সেই সংকলকটির জন্য সি স্ট্রাক্ট লেআউটের সাথে সামঞ্জস্যতা এবং পয়েন্টার আপ এবং ডাউন-কাস্টিং। পিওডগুলি "সি টাইপের মতো কাজ করে", নন-পিওডিগুলি এমনটি করার নিশ্চয়তা দেয় না। সুতরাং আপনি যদি চান যে আপনার ধরণটি সি স্ট্রাক্টের মতো বহনযোগ্যভাবে কাজ করতে পারে তবে আপনাকে অবশ্যই তা নিশ্চিত করতে হবে যে এটি পড। তাই আপনার পার্থক্যটি জানতে হবে।
স্টিভ জেসোপ

4
@ মন্টু: সত্যিই আমি উত্তরটিতে মন্তব্য দিয়েছিলাম যা উইকিপিডিয়া থেকে পুরানো তথ্য উদ্ধৃত করে। আমি উত্তরটি সম্পাদনা করতে পারলাম, আমি মনে করি, তবে আমি যতই সঠিক মনে করি না কেন, আমার সাথে একমত হওয়ার জন্য অন্য লোকের উত্তরগুলি সম্পাদনা করে ঘুরে বেড়াতে গেলে আমি সমস্যার গন্ধ পাচ্ছি।
স্টিভ জেসপ

20

সাধারণ তথ্য পুরানো

সংক্ষেপে বলতে গেলে, এটা সব বিল্ট-ইন ধরনের তথ্য (যেমন হয় int, char, float, long, unsigned char, double, ইত্যাদি) এবং সমস্ত POD ডেটার অ্যাগ্রিগেশন। হ্যাঁ, এটি একটি পুনরাবৃত্ত সংজ্ঞা। ;)

আরও স্পষ্ট করে বলতে গেলে একটি পিওডি হ'ল আমরা "স্ট্রাক্ট": একটি ইউনিট বা ইউনিটের একটি গ্রুপ যা কেবল ডেটা সঞ্চয় করে।


12
এটা সত্য যে আমরা তাদের মাঝে মাঝে 'স্ট্রাক্ট' বলি। তবে আমরা এটি করা সর্বদা ভুল, যেহেতু স্ট্রাক্ট অগত্যা পিওড-ধরণের নয়।
স্টিভ জেসোপ

6
স্পষ্টতই ... স্ট্রাক্ট এবং শ্রেণি প্রায় সমতুল্য, তবে "ব্যবসায়" তে আমরা 'স্ট্রাক্টকে' একটি সাধারণ ডেটা সংগ্রাহক বলে থাকি, সাধারণত সিটার এবং ডটর ছাড়াই সাধারণত মূল্য শব্দার্থবিজ্ঞান থাকে ...
ugasoft

2
আমার কাছে স্ট্রাক্টটিকে শ্রেণীবদ্ধ কীওয়ার্ডের সাথে একরকম করা বা তার কাছাকাছি করা ভুল ছিল: স্ট্রাক্ট কেবল শ্রেণিতে জনসাধারণের ডিফল্ট অ্যাক্সেস যুক্ত করে। আমি সি-এর মতো স্ট্রাক্ট তৈরি করা সহজ ছিল এবং আমাদের সি ++ এর 0 নম্বরে পিওডি হত।
ব্যবহারকারী1708042

উগাসোফট: আপনার উত্তরটি বিভ্রান্তিমূলক হতে পারে - আপনার মন্তব্যে অনুপস্থিত বিশদটি ব্যাখ্যা করা হয়েছে যে এটি স্ট্যান্ডার্ডের পরিবর্তে অনুশীলনে যেমন ব্যবহার করা হয়। ওহ, 8 বছর, আপনি কি এখানে আছেন? ;-)
হুরন

স্ট্রিং ব্যতিক্রম ছাড়া আপনি প্রথমে স্ট্রিংয়ের দৈর্ঘ্য নির্ধারণ না করে এটিকে ম্যাকপি দিয়ে অনুলিপি করতে পারবেন না।

12

আমি যেমন বুঝি পিওডি (প্লেইন ওল্ড ডেটা) কেবল একটি কাঁচা ডেটা - এটির দরকার নেই:

  • নির্মাণ করা হবে,
  • ধ্বংস করা,
  • কাস্টম অপারেটর আছে।
  • ভার্চুয়াল ফাংশন থাকা উচিত নয়,
  • এবং অপারেটরদের ওভাররাইড করা উচিত নয়।

কোনও পিওড আছে কিনা তা কীভাবে পরীক্ষা করবেন? ঠিক আছে, এটির জন্য একটি কাঠামো রয়েছে std::is_pod:

namespace std {
// Could use is_standard_layout && is_trivial instead of the builtin.
template<typename _Tp>
  struct is_pod
  : public integral_constant<bool, __is_pod(_Tp)>
  { };
}

(শিরোনামের টাইপ_ট্রেটগুলি থেকে)


রেফারেন্স:


2
ভুল, একটি পিওডি টাইপের সদস্য ফাংশন বা ওভারলোডেড অপারেটর থাকতে পারে। (তবে এটিতে ভার্চুয়াল সদস্য ফাংশন নাও থাকতে পারে))
কলিন ডি বেনেট

@ কলিনডিবেনেট হ্যাঁ, এটি সত্য। বিভ্রান্তির জন্য দুঃখিত. আনসারটিতে / আউট সম্পাদিত।
0

10

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

প্লেইন ওল্ড ডেটা প্রকারের মধ্যে একটিও থাকতে হবে না:

  • ভার্চুয়াল ফাংশন (হয় তাদের নিজস্ব, বা উত্তরাধিকারসূত্রে প্রাপ্ত)
  • ভার্চুয়াল বেস ক্লাস (প্রত্যক্ষ বা পরোক্ষ)

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

একটি সাধারণ (যদিও কঠোরভাবে সঠিক নয়) সংজ্ঞাটি হ'ল একটি প্লেনওলডেটা টাইপ এমন কোনও জিনিস যা একটি VeeTable নেই।


ইয়ুর উত্তর খুব ভাল, তবে এই প্রশ্নটি 8 বছর আগে উত্তর গ্রহণ করেছে, এবং আরও বেশ কয়েকটি ভাল উত্তর। আপনি এখনও উত্তর না দেওয়া প্রশ্নগুলির জবাব দিতে যদি আপনার জ্ঞান ব্যবহার করেন তবে আপনি
এসওকে

10

কেন আমাদের POD এর এবং নন-পডের মোটেই পার্থক্য করা দরকার?

সি ++ সি এর সম্প্রসারণ হিসাবে এর জীবন শুরু করেছিল যদিও আধুনিক সি ++ এখন আর সি এর কঠোর সুপারস্টেট নয়, লোকেরা এখনও উভয়ের মধ্যে উচ্চ স্তরের সামঞ্জস্যের আশা করে।

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

সি এর সাথে সামঞ্জস্য রাখতে আমাদের দুটি সীমাবদ্ধতা পূরণ করতে হবে।

  1. লেআউটটি অবশ্যই সংশ্লিষ্ট সি টাইপের মতো হতে হবে।
  2. প্রকারটি অবশ্যই অনুরূপ সি টাইপের মতো ফাংশন থেকে প্রেরণ এবং ফিরে আসতে হবে।

কিছু নির্দিষ্ট সি ++ বৈশিষ্ট্য এটির সাথে বেমানান।

ভার্চুয়াল পদ্ধতিগুলির জন্য ভার্চুয়াল পদ্ধতির টেবিলগুলিতে এক বা একাধিক পয়েন্টার সন্নিবেশ করানোর জন্য সংকলক প্রয়োজন, এমন কিছু যা সি তে বিদ্যমান নয় something

ব্যবহারকারী-সংজ্ঞায়িত অনুলিপি কন্সট্রাক্টর, মুভ কনস্ট্রাক্টর, কপি অ্যাসাইনমেন্ট এবং ডিস্ট্রাক্টরগুলির প্যারামিটারটি পাসিং এবং ফেরত দেওয়ার জন্য প্রভাব রয়েছে। অনেক সি এবিআই রেজিস্টারে ছোট প্যারামিটারগুলি পাস এবং ফিরিয়ে দেয় তবে ব্যবহারকারীর সংজ্ঞায়িত কনস্ট্রাক্টর / অ্যাসিগমেন্ট / ডেস্ট্রাক্টরকে দেওয়া রেফারেন্সগুলি কেবল মেমরির অবস্থানগুলির সাথেই কাজ করতে পারে।

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


8

static_assertসি ++ 11 থেকে সি ++ 17 এবং পিওডি এফেক্ট সহ সমস্ত নন-পিওডির উদাহরণ

std::is_pod সি ++ 11 এ যুক্ত করা হয়েছিল, সুতরাং এখনই সেই স্ট্যান্ডার্ডটি বিবেচনা করা যাক।

std::is_podhttps://stackoverflow.com/a/48435532/895245 তে উল্লিখিত হিসাবে C ++ 20 থেকে সরানো হবে , প্রতিস্থাপনগুলির জন্য সমর্থন আসার সাথে সাথে এটি আপডেট করুন।

স্ট্যান্ডার্ডটি বিকশিত হওয়ার সাথে সাথে পিওডি বিধিনিষেধ আরও বেশি স্বাচ্ছন্দ্য হয়ে উঠেছে, আমি উদাহরণস্বরূপ সমস্ত শিথিলকরণকে ifdefs এর মাধ্যমে কভার করার লক্ষ্য রাখি।

libstdc ++ এর এখানে পরীক্ষার সামান্য বিট রয়েছে: https://github.com/gcc-mirror/gcc/blob/gcc-8_2_0-release/libstdc%2B%2B-v3/testsuite/20_util/is_pod/value.cc তবে এটি খুব সামান্য। রক্ষণাবেক্ষণকারীরা: আপনি এই পোস্টটি পড়লে দয়া করে এটি মার্জ করুন। আমি এখানে উল্লিখিত সমস্ত সি ++ টেস্টসুইট প্রকল্পগুলি দেখতে অলস রয়েছি: /software/199708/is-there-a-comp अनुसरण-test-for-c-compilers

#include <type_traits>
#include <array>
#include <vector>

int main() {
#if __cplusplus >= 201103L
    // # Not POD
    //
    // Non-POD examples. Let's just walk all non-recursive non-POD branches of cppreference.
    {
        // Non-trivial implies non-POD.
        // https://en.cppreference.com/w/cpp/named_req/TrivialType
        {
            // Has one or more default constructors, all of which are either
            // trivial or deleted, and at least one of which is not deleted.
            {
                // Not trivial because we removed the default constructor
                // by using our own custom non-default constructor.
                {
                    struct C {
                        C(int) {}
                    };
                    static_assert(std::is_trivially_copyable<C>(), "");
                    static_assert(!std::is_trivial<C>(), "");
                    static_assert(!std::is_pod<C>(), "");
                }

                // No, this is not a default trivial constructor either:
                // https://en.cppreference.com/w/cpp/language/default_constructor
                //
                // The constructor is not user-provided (i.e., is implicitly-defined or
                // defaulted on its first declaration)
                {
                    struct C {
                        C() {}
                    };
                    static_assert(std::is_trivially_copyable<C>(), "");
                    static_assert(!std::is_trivial<C>(), "");
                    static_assert(!std::is_pod<C>(), "");
                }
            }

            // Not trivial because not trivially copyable.
            {
                struct C {
                    C(C&) {}
                };
                static_assert(!std::is_trivially_copyable<C>(), "");
                static_assert(!std::is_trivial<C>(), "");
                static_assert(!std::is_pod<C>(), "");
            }
        }

        // Non-standard layout implies non-POD.
        // https://en.cppreference.com/w/cpp/named_req/StandardLayoutType
        {
            // Non static members with different access control.
            {
                // i is public and j is private.
                {
                    struct C {
                        public:
                            int i;
                        private:
                            int j;
                    };
                    static_assert(!std::is_standard_layout<C>(), "");
                    static_assert(!std::is_pod<C>(), "");
                }

                // These have the same access control.
                {
                    struct C {
                        private:
                            int i;
                            int j;
                    };
                    static_assert(std::is_standard_layout<C>(), "");
                    static_assert(std::is_pod<C>(), "");

                    struct D {
                        public:
                            int i;
                            int j;
                    };
                    static_assert(std::is_standard_layout<D>(), "");
                    static_assert(std::is_pod<D>(), "");
                }
            }

            // Virtual function.
            {
                struct C {
                    virtual void f() = 0;
                };
                static_assert(!std::is_standard_layout<C>(), "");
                static_assert(!std::is_pod<C>(), "");
            }

            // Non-static member that is reference.
            {
                struct C {
                    int &i;
                };
                static_assert(!std::is_standard_layout<C>(), "");
                static_assert(!std::is_pod<C>(), "");
            }

            // Neither:
            //
            // - has no base classes with non-static data members, or
            // - has no non-static data members in the most derived class
            //   and at most one base class with non-static data members
            {
                // Non POD because has two base classes with non-static data members.
                {
                    struct Base1 {
                        int i;
                    };
                    struct Base2 {
                        int j;
                    };
                    struct C : Base1, Base2 {};
                    static_assert(!std::is_standard_layout<C>(), "");
                    static_assert(!std::is_pod<C>(), "");
                }

                // POD: has just one base class with non-static member.
                {
                    struct Base1 {
                        int i;
                    };
                    struct C : Base1 {};
                    static_assert(std::is_standard_layout<C>(), "");
                    static_assert(std::is_pod<C>(), "");
                }

                // Just one base class with non-static member: Base1, Base2 has none.
                {
                    struct Base1 {
                        int i;
                    };
                    struct Base2 {};
                    struct C : Base1, Base2 {};
                    static_assert(std::is_standard_layout<C>(), "");
                    static_assert(std::is_pod<C>(), "");
                }
            }

            // Base classes of the same type as the first non-static data member.
            // TODO failing on GCC 8.1 -std=c++11, 14 and 17.
            {
                struct C {};
                struct D : C {
                    C c;
                };
                //static_assert(!std::is_standard_layout<C>(), "");
                //static_assert(!std::is_pod<C>(), "");
            };

            // C++14 standard layout new rules, yay!
            {
                // Has two (possibly indirect) base class subobjects of the same type.
                // Here C has two base classes which are indirectly "Base".
                //
                // TODO failing on GCC 8.1 -std=c++11, 14 and 17.
                // even though the example was copy pasted from cppreference.
                {
                    struct Q {};
                    struct S : Q { };
                    struct T : Q { };
                    struct U : S, T { };  // not a standard-layout class: two base class subobjects of type Q
                    //static_assert(!std::is_standard_layout<U>(), "");
                    //static_assert(!std::is_pod<U>(), "");
                }

                // Has all non-static data members and bit-fields declared in the same class
                // (either all in the derived or all in some base).
                {
                    struct Base { int i; };
                    struct Middle : Base {};
                    struct C : Middle { int j; };
                    static_assert(!std::is_standard_layout<C>(), "");
                    static_assert(!std::is_pod<C>(), "");
                }

                // None of the base class subobjects has the same type as
                // for non-union types, as the first non-static data member
                //
                // TODO: similar to the C++11 for which we could not make a proper example,
                // but with recursivity added.

                // TODO come up with an example that is POD in C++14 but not in C++11.
            }
        }
    }

    // # POD
    //
    // POD examples. Everything that does not fall neatly in the non-POD examples.
    {
        // Can't get more POD than this.
        {
            struct C {};
            static_assert(std::is_pod<C>(), "");
            static_assert(std::is_pod<int>(), "");
        }

        // Array of POD is POD.
        {
            struct C {};
            static_assert(std::is_pod<C>(), "");
            static_assert(std::is_pod<C[]>(), "");
        }

        // Private member: became POD in C++11
        // /programming/4762788/can-a-class-with-all-private-members-be-a-pod-class/4762944#4762944
        {
            struct C {
                private:
                    int i;
            };
#if __cplusplus >= 201103L
            static_assert(std::is_pod<C>(), "");
#else
            static_assert(!std::is_pod<C>(), "");
#endif
        }

        // Most standard library containers are not POD because they are not trivial,
        // which can be seen directly from their interface definition in the standard.
        // /programming/27165436/pod-implications-for-a-struct-which-holds-an-standard-library-container
        {
            static_assert(!std::is_pod<std::vector<int>>(), "");
            static_assert(!std::is_trivially_copyable<std::vector<int>>(), "");
            // Some might be though:
            // /programming/3674247/is-stdarrayt-s-guaranteed-to-be-pod-if-t-is-pod
            static_assert(std::is_pod<std::array<int, 1>>(), "");
        }
    }

    // # POD effects
    //
    // Now let's verify what effects does PODness have.
    //
    // Note that this is not easy to do automatically, since many of the
    // failures are undefined behaviour.
    //
    // A good initial list can be found at:
    // /programming/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special/4178176#4178176
    {
        struct Pod {
            uint32_t i;
            uint64_t j;
        };
        static_assert(std::is_pod<Pod>(), "");

        struct NotPod {
            NotPod(uint32_t i, uint64_t j) : i(i), j(j) {}
            uint32_t i;
            uint64_t j;
        };
        static_assert(!std::is_pod<NotPod>(), "");

        // __attribute__((packed)) only works for POD, and is ignored for non-POD, and emits a warning
        // /programming/35152877/ignoring-packed-attribute-because-of-unpacked-non-pod-field/52986680#52986680
        {
            struct C {
                int i;
            };

            struct D : C {
                int j;
            };

            struct E {
                D d;
            } /*__attribute__((packed))*/;

            static_assert(std::is_pod<C>(), "");
            static_assert(!std::is_pod<D>(), "");
            static_assert(!std::is_pod<E>(), "");
        }
    }
#endif
}

গিটহাব উজানের দিকে

এর সাথে পরীক্ষিত:

for std in 11 14 17; do echo $std; g++-8 -Wall -Werror -Wextra -pedantic -std=c++$std pod.cpp; done

উবুন্টু 18.04, জিসিসি 8.2.0 এ।


4

পিওডির ধারণা এবং ধরণের বৈশিষ্ট্যটি std::is_podসি ++ ২০ এ অবমুক্ত করা হবে। আরও তথ্যের জন্য এই প্রশ্নটি দেখুন ।


-7

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


6
পডিটারগুলি পিওডি স্ট্রাক্টগুলিতে অনুমোদিত। তথ্যসূত্র নেই।
j_random_hacker

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