কেন প্যাকড স্ট্রাকচারগুলি সি ভাষার অংশ নয়?


10

প্রতিটি সি সংকলক সি স্ট্রাকচারগুলি (যেমন __attribute__ ((__packed__)), বা #pragma pack()) "প্যাক" করার বিকল্প সরবরাহ করে । এখন, আমরা সকলেই জানি যে প্যাকিং প্রয়োজনীয়, যদি আমরা নির্ভরযোগ্য উপায়ে ডেটা প্রেরণ বা সঞ্চয় করতে চাই to সি ভাষার প্রথম দিন থেকেই এটি অবশ্যই প্রয়োজন ছিল।

সুতরাং আমি ভাবছি কেন প্যাকড স্ট্রাকচারগুলি সি ভাষা নির্দিষ্টকরণের অংশ নয়? সেগুলি এমনকি সি 99 বা সি 11 তে নেই যদিও তাদের থাকার প্রয়োজনীয়তা এখন কয়েক দশক ধরে পরিচিত? আমি কী মিস করছি? এটি সংকলক নির্দিষ্ট কেন?


2
তারা নয় বিশুদ্ধ সি কোড লিখতে প্রয়োজনীয়।
ব্যবহারকারী 253751

উত্তর:


7

আমার ধারণা এটি এর কারণ এটি ব্যবহৃত লক্ষ্য সিপিইউ / সংকলক সংমিশ্রণের উপর নির্ভর করে। এর অর্থ একটি ভাষার দিকের চেয়ে সংকলক নির্দেশিকা (এটি এর সাথে সম্পর্কিত) হওয়া ভাল কারণ এটি কীভাবে অনুমান করা যায়? তারা একমাত্র উপায় এটি করতে পারে ইউনিয়ন।

রেমন্ডের নিবন্ধটি কেন এটি সম্পর্কে কিছুটা অন্তর্দৃষ্টি দেয়: http://www.catb.org/esr/st संरचना-packing /


খুব আকর্ষণীয় নিবন্ধ। (+1)
জর্জিও

কোডটি বলার অনুমতি দেওয়ার ক্ষেত্রে কী অসুবিধা হবে "আমার 12 বাইট ধারণের কাঠামো দরকার; ফিল্ড এক্স অবশ্যই অফসেট 0-এ চারটি অক্টেট লিটল এন্ডিয়ান হিসাবে সঞ্চিত 32-বিট পূর্ণসংখ্যার হিসাবে আচরণ করবে; ফিল্ড ওয়াই অবশ্যই a৪-বিট পূর্ণসংখ্যা হিসাবে আচরণ করবে অফসেট 4 এ অষ্টেটস বাইটস লিটল-এন্ডিয়ান হিসাবে সঞ্চিত? যে কোনও প্ল্যাটফর্মে হ্যান্ডেল করার কোডটি বিটফিল্ডগুলির জন্য ইতিমধ্যে সংস্থাগুলির যে ধরণের জিনিস সংকলনকারীদের থাকতে হয়েছে তার চেয়ে খারাপ কিছু হওয়া উচিত নয় এবং যেখানে প্রোগ্রামার স্থানীয় মেশিনের সাথে মেলে এমন সারিবদ্ধতা নির্দিষ্ট করতে খুব বেশি কার্যকর হতে পারে। অন্যান্য মেশিনে, এটি কম দক্ষ তবে পোর্টেবল হবে।
সুপারক্যাট

5

তিনটি প্রধান কারণ আছে।

  1. কিছু প্রসেসর স্বাক্ষরবিহীন ডেটা অ্যাক্সেস করতে পারে না (উদাহরণস্বরূপ একটি পূর্ণসংখ্যা বা একটি বিজোড় ঠিকানায় শুরু ভাসা)। চেষ্টা করার চেষ্টা একটি ব্যতিক্রম ট্রিগার করে।
  2. কিছু প্রসেসর স্বাক্ষরবিহীন ডেটা অ্যাক্সেস করতে পারে তবে কার্য সম্পাদন ব্যয়ে।
  3. বেশিরভাগ কাঠামো সি / সি ++ উত্স কোডের একক সেট দ্বারা অ্যাক্সেস করা হয় এবং অন্যান্য ভাষার সাথে আন্তঃব্যবহারযোগ্যতা ব্যতিক্রম, নিয়ম নয়।

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

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


প্যাকড স্ট্রাকচারের বিরুদ্ধে যে কোনও যুক্তি বিটফিল্ডগুলি একটি alচ্ছিক বৈশিষ্ট্য তৈরির ন্যায্যতা প্রমাণ করতে ব্যবহৃত হতে পারে। প্যাকড স্ট্রাকচারের সদস্যদের অ্যাক্সেস কিছু প্রসেসরের উপর ধীর গতিতে হবে, অন্যদের পক্ষে দ্রুত, তবে সংকলকগণ আরও কার্যকর কোডের সাথে স্বাক্ষরবিহীন-অ্যাক্সেস বৈশিষ্ট্যগুলির অভাবের জন্য ব্যবহারকারী-কোড ওয়ার্করাউন্ডগুলি প্রতিস্থাপনের চেষ্টা করছেন যা কেবল প্রোগ্রামাররা প্রোগ্রামারদের নির্দিষ্টকরণের চেয়ে আরও জটিল is তাদের দরকার.
সুপারক্যাট

@ সুপের্যাট: আপনি কীসের পক্ষে যুক্তি দিচ্ছেন (বা বিপক্ষে)? আমি পাই না।
ডেভিড.পিএফএক্স

আমি মতামত নিয়েছি যে বিটফিল্ডগুলি alচ্ছিক হওয়া উচিত, তবে যদি বিটফিল্ডগুলি একটি বাধ্যতামূলক বৈশিষ্ট্য হতে চলেছে তবে তাদের এটিকে এমনভাবে প্রসারিত করা বুদ্ধিমানের কাজ হবে যা কাঠামো বিন্যাসের সুস্পষ্ট নিয়ন্ত্রণের অনুমতি দেয়। অন্যথায়, নেট এফেক্টটি হ'ল কম্পাইলারদের 90% কাজ করতে হবে যা লেআউটের সম্পূর্ণ নিয়ন্ত্রণের জন্য প্রয়োজন, তবে প্রোগ্রামাররা কেবলমাত্র 10% বেনিফিটই কাটাবেন।
সুপারক্যাট

@ সুপের্যাট: বিট-ফিল্ডগুলি পূর্ণসংখ্যা এবং একই বিট লেআউটটিকে ক্রম হিসাবে বিধিবিধানের নিয়মগুলি অনুসরণ করে: বাস্তবায়ন সংজ্ঞায়িত। স্ট্রাক্ট সদস্যদের ঘোষিত হিসাবে চরিত্রের সীমানায় অর্ডার করা হয়, সম্ভবত প্যাকিং inোকানো সহ। এগুলি ধারণাগতভাবে বেশ আলাদা। [আপনি যদি আপনার প্রস্তাবটি প্রসারিত করতে চান তবে আপনাকে আর একটি প্রশ্ন জিজ্ঞাসা করতে হবে, তবে আমার মনে হয় না এটি আদৌ কার্যকর হবে]]
ডেভিড.পিএফএক্স

0

এটি সংকলক-নির্দিষ্ট কারণ এটি স্ট্যান্ডার্ডে নেই। এবং এটি স্ট্যান্ডার্ডে নেই কারণ এমনভাবে সুনির্দিষ্টভাবে বলা কঠিন যে জোরযুক্ত প্রান্তিককরণ বিধিনিষেধের সাথে অস্পষ্ট প্ল্যাটফর্মগুলির সংকলকগুলির জন্য প্রচুর বাস্তবায়ন প্রচেষ্টা প্রয়োজন হবে না।

এবং সেই প্রচেষ্টাটির কোনওটিরই ন্যায়সঙ্গততা নেই, কারণ প্রতিটি সংকলক / প্ল্যাটফর্ম যা C89 বা পরবর্তী সংকলক যে কেউ ব্যবহার করে সে ইতিমধ্যে এটি প্রয়োগ করে ফেলেছে implemented


2
??? আপনি "কেন স্ট্যান্ডার্ড ভাষায় নেই" এই প্রশ্নের উত্তর দিয়েছিলেন "কারণ
আদর্শে নেই

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

1
বাইটের অ্যারে হিসাবে এ জাতীয় স্ট্রাক্ট প্রয়োগ করে এবং প্রতিটি ক্ষেত্রের মান পড়তে / লিখতে প্রয়োজনীয় বিট-শিফটিং এবং &/ |অপারেশন সম্পাদন করে এমন সিস্টেমে আন-স্বাক্ষরিত অ্যাক্সেস কাজ করা সম্ভব হবে যা হার্ডওয়ারে এটি সমর্থন করে না ।
dan04

1
@ ডান04: অনেক প্রসেসরের উপর, একটি সংকলক সইচাইনিল অ্যাক্সেসের জন্য কোড তৈরি করতে পারে যা বাইট রিড এবং শিফ্টের ক্রম ব্যবহারের চেয়ে আরও কার্যকর। এর জন্য একটি সিনট্যাক্স থাকা এ জাতীয় সংকলকদের পক্ষে দক্ষ কোড তৈরি করা সহজতর হবে, প্রোগ্রামাররা তাদের বিভিন্ন উপায়ে লম্বা প্রকারে একত্রিত করার জন্য কোড লেখার চেষ্টা করতে পারে all
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.