هل من الآمن تسلسل دفعة الخام :: البديل؟
-
19-09-2019 - |
سؤال
دفعة :: البديل يدعي أنها نوع القيمة. هل هذا يعني أنه من الآمن كتابته ببساطة كتابة التمثيل الخام لتعزيز :: متغير وتحميله لاحقا، طالما أنه يحتوي فقط على أنواع جراب؟ افترض أنه سيتم إعادة تحميله بواسطة الرمز الذي تم جمعه بواسطة نفس المترجم، ونفس إصدار دفعة، على نفس الهندسة المعمارية.
أيضا، (ربما) معادل، يمكن أن يعزز :: البديل يستخدم في الذاكرة المشتركة؟
المحلول
فيما يتعلق بالتسلسل: يجب أن تعمل، نعم. ولكن لماذا لا تستخدم boost::variant
آلية الزيارة لكتابة النوع الفعلي الوارد في البديل؟
struct variant_serializer : boost::static_visitor<void> {
template <typename T>
typename boost::enable_if< boost::is_pod<T>, void>::type
operator()( const T & t ) const {
// ... serialize here, e.g.
std::cout << t;
}
};
int main() {
const boost::variant<int,char,float,double> v( '1' );
variant_serializer s;
boost::apply_visitor( s, v );
return 0;
}
فيما يتعلق بالذاكرة المشتركة: boost::variant
لا يقوم بتخصيص كومة الكومة، حتى تتمكن من وضعه في الذاكرة المشتركة تماما مثل int
, ، على افتراض المزامنة المناسبة، بالطبع.
وغني عن القول، كما قلت، ما سبق صالح فقط إذا كان البديل يمكن أن يحتوي فقط على أنواع جراب.
نصائح أخرى
حاول فقط بما في ذلك زيادة / التسلسل / variant.hpp؛ يفعل العمل من أجلك.