"__ট্রিবিউট __ ((প্যাকড, সারিবদ্ধ (4%)))" এর অর্থ কী?


122

এটি সি ভাষা t এটি লেখা আছে যে:

typedef struct __attribute__((packed, aligned(4))) Ball {
    float2 delta;
    float2 position;
    //float3 color;
    float size;
    //int arcID;
    //float arcStr;
} Ball_t;
Ball_t *balls;

দয়া করে আমাকে এর কী অর্থ এবং কী কীভাবে এই শব্দটি ব্যবহার করবেন তা বলুন।


4
এটি একটি "টাইপ অ্যাট্রিবিউট" .. (গুগলে আমি এটি "সি অ্যাট্রিবিউট প্যাকড" দিয়ে পেয়েছি

1
এই প্রশ্নটি দেখুন - যদিও আপনার সাথে aligned(4)সম্ভবত খুব বেশি চিন্তা করার দরকার নেই।
কিথ থমসন 4

উত্তর:


157

উত্তর দেওয়ার আগে, আমি আপনাকে উইকি থেকে কিছু তথ্য দিতে চাই


ডেটা স্ট্রাকচার অ্যালাইনমেন্টটি কম্পিউটার মেমোরিতে ডেটা সাজানো এবং অ্যাক্সেস করার উপায়। এটি দুটি পৃথক তবে সম্পর্কিত সমস্যা নিয়ে গঠিত: ডেটা প্রান্তিককরণ এবং ডেটা স্ট্রাকচার প্যাডিং

একটি আধুনিক কম্পিউটার যখন মেমরির ঠিকানা থেকে পাঠ করে বা লিখতে থাকে, তখন এটি শব্দ আকারের খণ্ডে (উদাহরণস্বরূপ 32-বিট সিস্টেমে 4 বাইট অংশ) এটি করবে। ডেটা প্রান্তিককরণের অর্থ হ'ল মেমরি অফসেটে শব্দের আকারের কয়েকটি একাধিক সমান ডেটা স্থাপন করা, যা সিপিইউ মেমরি পরিচালনা করে এমনভাবে সিস্টেমের কর্মক্ষমতা বাড়ায়।

ডেটা সারিবদ্ধ করার জন্য, শেষ ডেটা স্ট্রাকচারের সমাপ্তি এবং পরবর্তীটির সূচনার মধ্যে কিছু অর্থহীন বাইট সন্নিবেশ করা প্রয়োজন, যা ডেটা স্ট্রাকচার প্যাডিং


জিসিসি স্ট্রাকচার প্যাডিং অক্ষম করতে কার্যকারিতা সরবরাহ করে। অর্থাত্ কিছু ক্ষেত্রে এই অর্থহীন বাইটগুলি এড়াতে। নিম্নলিখিত কাঠামো বিবেচনা করুন:

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}sSampleStruct;

sizeof(sSampleStruct)স্ট্রাকচার প্যাডিংয়ের কারণে 8 এর চেয়ে 12 হবে। ডিফল্টরূপে, X86-তে কাঠামোগুলি 4-বাইট প্রান্তিককরণে প্যাড করা হবে:

typedef struct
{
     char Data1;
     //3-Bytes Added here.
     int Data2;
     unsigned short Data3;
     char Data4;
     //1-byte Added here.

}sSampleStruct;

আমরা __attribute__((packed, aligned(X)))নির্দিষ্ট (এক্স) আকারের প্যাডিং জোর করতে ব্যবহার করতে পারি । এক্স দুটি শক্তির হওয়া উচিত। পড়ুন এখানে

typedef struct
{
     char Data1;
     int Data2;
     unsigned short Data3;
     char Data4;

}__attribute__((packed, aligned(1))) sSampleStruct;  

সুতরাং উপরে উল্লিখিত জিসিসি বৈশিষ্ট্যটি কাঠামোর প্যাডিংয়ের অনুমতি দেয় না। সুতরাং আকার 8 বাইট হবে।

আপনি যদি সমস্ত কাঠামোর জন্য একই কাজ করতে চান তবে কেবল আমরা অ্যালাইনমেন্ট মানটি স্ট্যাক করে চাপতে পারি #pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

6
যদি 4 বাইট খণ্ডে মেমরির স্টোর ডেটা থাকে তবে কেন এটি স্বাক্ষরযুক্ত শর্টে (2 বাইট দীর্ঘ) এর জন্য 2 প্যাডিং বাইট যুক্ত করবে না? বা সংকলক কেবল কাঠামোর 1 ম এবং শেষ সদস্যগুলিতে প্যাডিং বাইট যুক্ত করবেন? আপনি দয়া করে এটি পরিষ্কার করতে পারেন
ব্যবহারকারী

5
@ ব্যবহারকারী প্লিজ এটিও উল্লেখ করুন। আপনি যদি এখনও পরিষ্কার না হলে, Plz সাহায্যের জন্য আসা stackoverflow.com/questions/11772553/...
Jeyaram

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

86
  • packedএর অর্থ এটি সম্ভাব্যতম ক্ষুদ্রতম স্থানটি ব্যবহার করবে struct Ball- অর্থাত এটি প্যাডিং ছাড়াই একসাথে ক্ষেত্রগুলি ক্র্যাম করবে
  • alignedএর অর্থ প্রত্যেকটি struct Ball4 বাইট সীমানায় শুরু হবে - অর্থাত্ যে কোনওটির জন্য struct Ball, এর ঠিকানাটি 4 দিয়ে ভাগ করা যায়

এগুলি জিসিসি এক্সটেনশন, কোনও সি স্ট্যান্ডার্ডের অংশ নয়।


17

বৈশিষ্ট্যটির packedঅর্থ হ'ল সংকলকটি এর ক্ষেত্রগুলির মধ্যে প্যাডিং যুক্ত করবে না struct। প্যাডিং সাধারণত ক্ষেত্রগুলি তাদের প্রাকৃতিক আকারের সাথে একত্রিত করতে ব্যবহৃত হয়, কারণ কিছু স্থাপত্যগুলি স্বাক্ষরবিহীন অ্যাক্সেসের জন্য জরিমানা আরোপ করে বা একেবারেই অনুমতি দেয় না।

aligned(4) মানে স্ট্রাক্ট এমন কোনও ঠিকানার সাথে সংযুক্ত করা উচিত যা 4 দ্বারা বিভাজ্য।

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