কাঠামো প্যাডিং এবং প্যাকিং


209

বিবেচনা:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;

কাঠামোর আকার যথাক্রমে 12 এবং 8 হয়।

এই স্ট্রাকচারগুলি প্যাডড বা প্যাক করা হয়েছে?

প্যাডিং বা প্যাকিং কখন হয়?



24
সি স্ট্রাকচার প্যাকিংয়ের
পাওলো

paddingজিনিস বড় করে তোলে। packingজিনিসগুলি আরও ছোট করে তোলে। সম্পূর্ণ ভিন্ন.
smwikedia

উত্তর:


264

প্যাডিং কাঠামোর সদস্যদের "প্রাকৃতিক" ঠিকানা সীমানায় প্রান্তিক করে তোলে - বলুন, intসদস্যদের অফসেট থাকবে, যা mod(4) == 032-বিট প্ল্যাটফর্মে রয়েছে। ডিফল্টভাবে প্যাডিং চলছে। এটি আপনার "প্রথম কাঠামোতে নিম্নলিখিত" ফাঁকগুলি "োকায়:

struct mystruct_A {
    char a;
    char gap_0[3]; /* inserted by compiler: for alignment of b */
    int b;
    char c;
    char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;

অন্যদিকে প্যাকিং সংকলককে প্যাডিং করা থেকে বিরত করে - এটি পরিষ্কারভাবে অনুরোধ করতে হবে - এটি জিসিসির অধীনে __attribute__((__packed__)), সুতরাং নিম্নলিখিত:

struct __attribute__((__packed__)) mystruct_A {
    char a;
    int b;
    char c;
};

632-বিট আর্কিটেকচারে আকারের কাঠামো তৈরি করে।

যদিও একটি নোট - স্বাক্ষরবিহীন মেমরি অ্যাক্সেস আর্কিটেকচারে ধীরে ধীরে এটি অনুমোদন করে (x86 এবং amd64 এর মতো), এবং স্পার্কের মতো কঠোর প্রান্তিককরণ আর্কিটেকচারে স্পষ্টভাবে নিষিদ্ধ ।


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

14
ঠিক এই কারণেই, আপনি যদি আইপি, ইউডিপি এবং টিসিপি শিরোনামের বিন্যাসগুলি দেখেন তবে আপনি দেখতে পাবেন যে সমস্ত পূর্ণসংখ্যার ক্ষেত্র সারিবদ্ধ হয়েছে।
নিকোলাই ফেটিসসোভ

17
"সি স্ট্রাকচার প্যাকিংয়ের লস্ট আর্ট" প্যাডিং এবং প্যাকিংয়ের প্রলোভন ব্যাখ্যা করে - catb.org/esr/struct-packing
রব 11311

3
প্রথম সদস্য কি প্রথম আসতে হবে? আমি ভেবেছিলাম আরেজেশন সম্পূর্ণরূপে বাস্তবায়নের উপর নির্ভর করে এবং এর উপর নির্ভর করা যায় না (এমনকি সংস্করণ থেকে সংস্করণে)।
এলিওরকোড

4
+ allyourcode স্ট্যান্ডার্ড গ্যারান্টি দেয় যে সদস্যদের ক্রম সংরক্ষণ করা হবে এবং প্রথম সদস্য 0 অফসেটে শুরু হবে।
মার্টিনকুনেভ

64

( উপরের উত্তরগুলি কারণটি বেশ স্পষ্টভাবে ব্যাখ্যা করেছে, তবে প্যাডিংয়ের আকার সম্পর্কে সম্পূর্ণ পরিষ্কার নয় বলে আমি লস্ট আর্ট অফ স্ট্রাকচার প্যাকিং থেকে যা শিখেছি সে অনুসারে আমি একটি উত্তর যুক্ত করব , তবে এটি সীমাবদ্ধ নয় C, তবে বিকশিত হয়েছে) এছাড়াও প্রযোজ্য Go, Rust )


মেমরি সারিবদ্ধ (কাঠামোর জন্য)

নিয়মাবলী:

  • প্রতিটি পৃথক সদস্যের আগে, এখানে প্যাডিং থাকবে যাতে এটি কোনও ঠিকানায় শুরু করতে যাতে আকারের সাথে বিভাজ্য।
    যেমন bit৪ বিট সিস্টেমের মধ্যে, int4 দিয়ে বিভাজ্য ঠিকানা থেকে শুরু করা উচিত এবং long8 shortদ্বারা 2 দ্বারা।
  • charএবং char[]বিশেষ, কোনও মেমরি ঠিকানা হতে পারে, তাই তাদের আগে প্যাডিংয়ের দরকার নেই।
  • জন্য struct, প্রতিটি পৃথক সদস্যের প্রান্তিককরণের প্রয়োজন ব্যতীত, সম্পূর্ণ কাঠামোর আকার নিজেই বড় আকারের পৃথক সদস্যের আকার দ্বারা বিভাজ্য আকারে প্রান্তিককরণ করা হবে, শেষে প্যাডিংয়ের মাধ্যমে।
    যেমন স্ট্রাক্টের বৃহত্তম সদস্য যদি long8 দ্বারা বিভাজ্য হয় intতবে 4 দ্বারা, shortতারপরে 2 দ্বারা by

সদস্যের আদেশ:

  • সদস্যের ক্রমটি কাঠামোর প্রকৃত আকারকে প্রভাবিত করতে পারে, তাই এটি মনে রাখবেন। উদাহরণস্বরূপ stu_cএবং stu_dনীচের উদাহরণ থেকে একই সদস্য রয়েছে তবে বিভিন্ন ক্রমে, এবং ফলস্বরূপ 2 টি স্ট্রাক্টের জন্য বিভিন্ন আকারের ফলস্বরূপ।

স্মৃতিতে ঠিকানা (কাঠামোর জন্য)

নিয়মাবলী:

  • 64 বিট সিস্টেম
    স্ট্রাক্ট ঠিকানা (n * 16)বাইট থেকে শুরু হয় । ( আপনি নীচের উদাহরণে দেখতে পারেন, structs এর সব মুদ্রিত হেক্স ঠিকানাগুলি দিয়ে শেষ 0 )
    কারণ : সম্ভব বৃহত্তম পৃথক struct হয় সদস্য 16 বাইট ( long double)।
  • (আপডেট) যদি কোনও স্ট্রাক্টে কেবলcharসদস্য হিসাবেথাকে তবেএর ঠিকানাটি কোনও ঠিকানায় শুরু হতে পারে।

খালি স্থান :

  • 2 স্ট্রকের মধ্যে ফাঁকা স্থানটি নন-স্ট্রাক্ট ভেরিয়েবলগুলি ব্যবহার করতে পারে যা মাপসই হতে পারে below
    উদাহরণস্বরূপ test_struct_address()নীচে, ভেরিয়েবলটি xসংলগ্ন স্ট্রাক্ট gএবং h। ঘোষিত
    হোক xবা না হোক , hঠিকানার ঠিকানা পরিবর্তন হবে না, xকেবল gঅপচয় করা শূন্য স্থানটি পুনরায় ব্যবহার করেছেন ।
    অনুরূপ ক্ষেত্রে y

উদাহরণ

( bit৪ বিট সিস্টেমের জন্য )

memory_align.c :

/**
 * Memory align & padding - for struct.
 * compile: gcc memory_align.c
 * execute: ./a.out
 */ 
#include <stdio.h>

// size is 8, 4 + 1, then round to multiple of 4 (int's size),
struct stu_a {
    int i;
    char c;
};

// size is 16, 8 + 1, then round to multiple of 8 (long's size),
struct stu_b {
    long l;
    char c;
};

// size is 24, l need padding by 4 before it, then round to multiple of 8 (long's size),
struct stu_c {
    int i;
    long l;
    char c;
};

// size is 16, 8 + 4 + 1, then round to multiple of 8 (long's size),
struct stu_d {
    long l;
    int i;
    char c;
};

// size is 16, 8 + 4 + 1, then round to multiple of 8 (double's size),
struct stu_e {
    double d;
    int i;
    char c;
};

// size is 24, d need align to 8, then round to multiple of 8 (double's size),
struct stu_f {
    int i;
    double d;
    char c;
};

// size is 4,
struct stu_g {
    int i;
};

// size is 8,
struct stu_h {
    long l;
};

// test - padding within a single struct,
int test_struct_padding() {
    printf("%s: %ld\n", "stu_a", sizeof(struct stu_a));
    printf("%s: %ld\n", "stu_b", sizeof(struct stu_b));
    printf("%s: %ld\n", "stu_c", sizeof(struct stu_c));
    printf("%s: %ld\n", "stu_d", sizeof(struct stu_d));
    printf("%s: %ld\n", "stu_e", sizeof(struct stu_e));
    printf("%s: %ld\n", "stu_f", sizeof(struct stu_f));

    printf("%s: %ld\n", "stu_g", sizeof(struct stu_g));
    printf("%s: %ld\n", "stu_h", sizeof(struct stu_h));

    return 0;
}

// test - address of struct,
int test_struct_address() {
    printf("%s: %ld\n", "stu_g", sizeof(struct stu_g));
    printf("%s: %ld\n", "stu_h", sizeof(struct stu_h));
    printf("%s: %ld\n", "stu_f", sizeof(struct stu_f));

    struct stu_g g;
    struct stu_h h;
    struct stu_f f1;
    struct stu_f f2;
    int x = 1;
    long y = 1;

    printf("address of %s: %p\n", "g", &g);
    printf("address of %s: %p\n", "h", &h);
    printf("address of %s: %p\n", "f1", &f1);
    printf("address of %s: %p\n", "f2", &f2);
    printf("address of %s: %p\n", "x", &x);
    printf("address of %s: %p\n", "y", &y);

    // g is only 4 bytes itself, but distance to next struct is 16 bytes(on 64 bit system) or 8 bytes(on 32 bit system),
    printf("space between %s and %s: %ld\n", "g", "h", (long)(&h) - (long)(&g));

    // h is only 8 bytes itself, but distance to next struct is 16 bytes(on 64 bit system) or 8 bytes(on 32 bit system),
    printf("space between %s and %s: %ld\n", "h", "f1", (long)(&f1) - (long)(&h));

    // f1 is only 24 bytes itself, but distance to next struct is 32 bytes(on 64 bit system) or 24 bytes(on 32 bit system),
    printf("space between %s and %s: %ld\n", "f1", "f2", (long)(&f2) - (long)(&f1));

    // x is not a struct, and it reuse those empty space between struts, which exists due to padding, e.g between g & h,
    printf("space between %s and %s: %ld\n", "x", "f2", (long)(&x) - (long)(&f2));
    printf("space between %s and %s: %ld\n", "g", "x", (long)(&x) - (long)(&g));

    // y is not a struct, and it reuse those empty space between struts, which exists due to padding, e.g between h & f1,
    printf("space between %s and %s: %ld\n", "x", "y", (long)(&y) - (long)(&x));
    printf("space between %s and %s: %ld\n", "h", "y", (long)(&y) - (long)(&h));

    return 0;
}

int main(int argc, char * argv[]) {
    test_struct_padding();
    // test_struct_address();

    return 0;
}

ফাঁসির ফলাফল - test_struct_padding():

stu_a: 8
stu_b: 16
stu_c: 24
stu_d: 16
stu_e: 16
stu_f: 24
stu_g: 4
stu_h: 8

ফাঁসির ফলাফল - test_struct_address():

stu_g: 4
stu_h: 8
stu_f: 24
address of g: 0x7fffd63a95d0  // struct variable - address dividable by 16,
address of h: 0x7fffd63a95e0  // struct variable - address dividable by 16,
address of f1: 0x7fffd63a95f0 // struct variable - address dividable by 16,
address of f2: 0x7fffd63a9610 // struct variable - address dividable by 16,
address of x: 0x7fffd63a95dc  // non-struct variable - resides within the empty space between struct variable g & h.
address of y: 0x7fffd63a95e8  // non-struct variable - resides within the empty space between struct variable h & f1.
space between g and h: 16
space between h and f1: 16
space between f1 and f2: 32
space between x and f2: -52
space between g and x: 12
space between x and y: 12
space between h and y: 8

সুতরাং প্রতিটি ভেরিয়েবলের ঠিকানা সূচনা হ'ল g: d0 x: dc h: e0 y: e8

এখানে চিত্র বর্ণনা লিখুন


4
"বিধি" আসলে এটি খুব স্পষ্ট করে দিয়েছিল, আমি কোথাও সোজা নিয়ম খুঁজে পাইনি। ধন্যবাদ।
পারভেজ আলম

2
@ পারভেজআলাম বইটি <The Lost Art of C Structure Packing>, নিয়মগুলি বেশ ভালভাবে ব্যাখ্যা করেছে, এমনকি এই ভেবেছিল যে এই উত্তরটির চেয়ে কিছুটা দীর্ঘ। বইটি অবাধে অনলাইনে পাওয়া যাচ্ছে: catb.org/esr/struct-packing
এরিক ওয়াং

আমি এটি দিয়ে চেষ্টা করব, বিটিডব্লিউ এটা কি স্ট্রাকচার প্যাকিংয়ের মধ্যে সীমাবদ্ধ? আমি বইতে ব্যাখ্যা পছন্দ হিসাবে ঠিক কৌতূহল।
পারভেজ আলম

1
@ পারভেজআলাম এটি একটি খুব সংক্ষিপ্ত বই, মূলত এমন প্রযুক্তিতে ফোকাস করুন যা সি প্রোগ্রামের মেমরির পদচিহ্ন হ্রাস করবে, পড়া শেষ করতে বেশ কয়েক দিন সময় লাগে।
এরিক ওয়াং

1
@ ভালিদসকুলাস হ্যাঁ, এর অর্থ 16 বাইট সারিবদ্ধ হয়েছে।
এরিক ওয়াং

44

আমি জানি এই প্রশ্নটি পুরানো এবং বেশিরভাগ উত্তর এখানে প্যাডিংকে সত্যিই ভালভাবে ব্যাখ্যা করেছে তবে নিজেই এটি বোঝার চেষ্টা করার সময় আমি বুঝতে পেরেছিলাম যে ঘটছে তার "ভিজ্যুয়াল" চিত্রটি সাহায্য করেছে।

প্রসেসর একটি নির্দিষ্ট আকারের (শব্দ) "অংশ" এ মেমরিটি পড়ে। প্রসেসরের শব্দটি 8 বাইট লম্বা বলে। এটি 8 বাইট বিল্ডিং ব্লকের একটি বড় সারি হিসাবে স্মৃতিটিকে দেখবে। যতবারই এটি মেমরি থেকে কিছু তথ্য পাওয়ার প্রয়োজন হয়, এটি সেই ব্লকগুলির মধ্যে একটিতে পৌঁছবে এবং এটি পাবে।

পরিবর্তনশীল প্রান্তিককরণ

উপরের চিত্রটিতে যেমন মনে হচ্ছে, চরের (1 বাইট দীর্ঘ) কোথায় আছে তা বিবেচনাধীন নয়, যেহেতু এটি blocks ব্লকের একটির মধ্যে থাকবে, এতে সিপিইউকে কেবল 1 টি শব্দের প্রক্রিয়া করতে হবে।

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

একইটি 8-বাইট ডাবলের ক্ষেত্রে প্রযোজ্য, এখন বাদে এটি 8 এর মেমরি একাধিক একাধিক হওয়া আবশ্যক গ্যারান্টিযুক্ত এটি সর্বদা কোনও ব্লকের মধ্যে থাকবে।

এটি একটি 8-বাইট শব্দের প্রসেসর বিবেচনা করে তবে ধারণাটি অন্যান্য আকারের শব্দের ক্ষেত্রে প্রযোজ্য।

প্যাডিং সেই সমস্ত ব্লকের সাথে একত্রিত হয়েছে তা নিশ্চিত করার জন্য সেই ডেটাগুলির মধ্যে ফাঁকগুলি পূরণ করে কাজ করে, এইভাবে মেমরিটি পড়ার সময় কর্মক্ষমতা উন্নত করে।

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


3
এটি স্ট্রাকচার প্যাকিংয়ের ব্যাখ্যা দেয় না তবে এটি সিপিইউ ওয়ার্ড প্রান্তিককরণটি খুব সুন্দরভাবে চিত্রিত করে।
ডেভিড ফোরস্টার


1
@ সিরোসন্টিলি 9০৯ 大 抓捕 六四 事件 法轮功, এটি জিম্পে ছিল, তবে আমার ধারণা
হাহাহা

1
ওপেন সোর্স (ওয়াই) থেকে আরও ভাল
সিরো সান্তিলি 法轮功 冠状 病 六四 事件 法轮功

21

স্ট্রাকচার প্যাকিং স্ট্রাকচার প্যাডিংকে দমন করে, প্রান্তিককরণ সর্বাধিক গুরুত্বপূর্ণ হলে প্যাডিং ব্যবহৃত হয়, স্থান সর্বাধিক গুরুত্বপূর্ণ হলে প্যাকিং ব্যবহৃত হয়।

কিছু সংকলক #pragmaপ্যাডিং দমন করতে বা এটিকে n সংখ্যক বাইটে প্যাক করার জন্য সরবরাহ করে। কিছু এটি করার জন্য কীওয়ার্ড সরবরাহ করে। সাধারণত প্রগমা যা কাঠামোর প্যাডিং সংশোধন করার জন্য ব্যবহৃত হয় তা নীচের বিন্যাসে হবে (সংকলকের উপর নির্ভর করে):

#pragma pack(n)

উদাহরণস্বরূপ এআরএম __packedস্ট্রাকচার প্যাডিং দমন করার জন্য কীওয়ার্ড সরবরাহ করে । এ সম্পর্কে আরও জানতে আপনার সংকলক ম্যানুয়ালটি দেখুন।

সুতরাং একটি প্যাক করা কাঠামো প্যাডিং ছাড়াই একটি কাঠামো।

সাধারণত প্যাকড স্ট্রাকচারগুলি ব্যবহার করা হবে

  • স্থান বাঁচাতে

  • কিছু প্রোটোকল ব্যবহার করে নেটওয়ার্কের মাধ্যমে প্রেরণ করার জন্য কোনও ডেটা স্ট্রাকচারকে ফর্ম্যাট করতে (এটি অবশ্যই ভাল অভ্যাস নয় কারণ আপনাকে
    এন্ডিয়েন্সিটি মোকাবেলা করতে হবে )


5

প্যাডিং এবং প্যাকিং একই জিনিসটির দুটি মাত্র দিক:

  • প্যাকিং বা প্রান্তিককরণ হ'ল আকার যা প্রতিটি সদস্যকে বৃত্তাকার বন্ধ করে দেওয়া হয়
  • অ্যালাইনমেন্টের সাথে মেলে অতিরিক্ত প্যাডিং অতিরিক্ত স্থান

ইন mystruct_A, 4 একটি ডিফল্ট প্রান্তিককরণ অভিমানী, প্রতিটি সদস্য 4 বাইট এর গুণিতক উপর প্রান্তিককৃত হয়। আকারটি যেহেতু char1, তাই প্যাডিং 4 aএবং c1 = 3 বাইটের এবং কোনও প্যাডিংয়ের প্রয়োজন নেই int bযার জন্য ইতিমধ্যে 4 বাইট রয়েছে। এটি একইভাবে কাজ করে mystruct_B


1

স্ট্রাকচার প্যাকিং কেবল তখনই করা হয় যখন আপনি আপনার সংকলকটিকে কাঠামোটি প্যাক করতে স্পষ্টভাবে বলবেন। প্যাডিং যা আপনি দেখছেন। আপনার 32-বিট সিস্টেমটি প্রতিটি ক্ষেত্রকে শব্দ বিন্যাসে প্যাড করছে। যদি আপনি আপনার সংকলকটিকে কাঠামোটি প্যাক করতে বলেছিলেন তবে সেগুলি যথাক্রমে 6 এবং 5 বাইট হবে। যদিও এটি করবেন না। এটি পোর্টেবল নয় এবং সংকলকগুলি অনেক ধীর (এবং কখনও কখনও এমনকি বগি) কোডও জেনারেট করে।


1

এটি সম্পর্কে কোনও বুট নেই! যারা বিষয়টি বুঝতে চান তাদের অবশ্যই নিম্নলিখিত বিষয়গুলি করতে হবে,

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

1

প্যাডিংয়ের নিয়ম:

  1. কাঠামোর প্রতিটি সদস্যের একটি আকারে তার আকার অনুসারে বিভাজ্য হওয়া উচিত। এই নিয়মটি পূরণ হয়েছে তা নিশ্চিত করার জন্য উপাদানগুলির মধ্যে বা কাঠামোর শেষে প্যাডিং inোকানো হয়। এটি হার্ডওয়্যার দ্বারা সহজ এবং আরও কার্যকর বাস অ্যাক্সেসের জন্য করা হয়।
  2. কাঠামোর শেষে প্যাডিং কাঠামোর বৃহত্তম সদস্যের আকারের ভিত্তিতে সিদ্ধান্ত নেওয়া হয়।

বিধি 2 কেন: নিম্নলিখিত কাঠামোটি বিবেচনা করুন,

কাঠামো 1

যদি আমরা এই কাঠামোর একটি অ্যারে (2 স্ট্র্টের) তৈরি করতে পারি তবে শেষে কোনও প্যাডিং প্রয়োজন হবে না:

স্ট্রাক্ট 1 অ্যারে

সুতরাং, কাঠামোর আকার = 8 বাইট

ধরে নিন আমরা নীচের মতো আরও একটি কাঠামো তৈরি করব:

কাঠামো 2

যদি আমরা এই কাঠামোর একটি অ্যারে তৈরি করে থাকি, তবে শেষে প্যাডিংয়ের বাইট সংখ্যার 2 টি সম্ভাবনা রয়েছে।

উ: আমরা যদি শেষে 3 টি বাইট যুক্ত করি এবং এটি দীর্ঘস্থায়ী না করে জন্য সারিবদ্ধ করি:

স্ট্রাক্ট 2 অ্যারে ইনট এ সারিবদ্ধ

বি। আমরা যদি শেষে 7 বাইট যুক্ত করি এবং লংয়ের জন্য এটি সারিবদ্ধ করি:

স্ট্রাক্ট 2 অ্যারে লং এ সারিবদ্ধ

দ্বিতীয় অ্যারের সূচনা ঠিকানাটি 8 (অর্থাত্ 24) এর একাধিক। কাঠামোর আকার = 24 বাইট

সুতরাং, কাঠামোর পরবর্তী অ্যারের প্রারম্ভিক ঠিকানাটিকে বৃহত্তর সদস্যের একাধিকের সাথে প্রান্তিককরণের মাধ্যমে (যেমন আমরা যদি এই কাঠামোর একটি অ্যারে তৈরি করি, তবে দ্বিতীয় অ্যারের প্রথম ঠিকানাটি অবশ্যই একটি ঠিকানায় শুরু হওয়া উচিত যা একাধিক কাঠামোর বৃহত্তম সদস্য হিসাবে এটি এখানে 24 (3 * 8%), আমরা শেষে প্রয়োজনীয় প্যাডিং বাইটগুলি গণনা করতে পারি।


-1

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

  1. মেমোরিতে ডাটা প্রান্তিককরণের জন্য, মেমরির ঠিকানাগুলির মধ্যে এক বা একাধিক খালি বাইট (ঠিকানা) সন্নিবেশ করা হয় (বা খালি রেখে দেওয়া হয়) যা মেমরির বরাদ্দের সময় অন্য কাঠামোর সদস্যদের জন্য বরাদ্দ করা হয়। এই ধারণাকে কাঠামো প্যাডিং বলা হয়।
  2. কম্পিউটার প্রসেসরের আর্কিটেকচার এমনভাবে হয় যে এটি একবারে 1 শব্দ (32 বিট প্রসেসরে 4 বাইট) পড়তে পারে memory
  3. প্রসেসরের এই সুবিধাটি ব্যবহার করার জন্য, ডেটা সর্বদা 4 বাইট প্যাকেজ হিসাবে সংযুক্ত থাকে যা অন্য সদস্যের ঠিকানার মধ্যে খালি ঠিকানা সন্নিবেশ করে।
  4. এই কাঠামোর প্যাডিং ধারণাটি সি হিসাবে, কাঠামোর আকার সর্বদা আমরা যা ভাবি তার মতো হয় না।

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