Bagikan melalui


Masalah Pengemasan C-Compiler

Tingkat pengemasan memengaruhi tata letak memori tipe untuk MIDL dan pengompilasi C/C++ Microsoft dengan cara yang sama. Di lingkungan build Microsoft, seperti lingkungan build yang ditentukan oleh VC++ atau Kit Pengembangan Perangkat Lunak Platform (SDK), tingkat pengemasan default untuk kompilator MIDL dan C/C++ sama; tingkat pengemasan default untuk lingkungan build Windows 32-bit dan 64-bit adalah 8.

Perataan Alami

Untuk tipe dalam memori, penyelarasan default sama dengan penyelarasan alaminya.

  • Jenis dasar, seperti short, float, dan __int64, serta pointer diselaraskan secara alami jika representasinya dimulai pada alamat yang merupakan hasil pembagian dari ukurannya. Semua jenis dasar yang saat ini didukung memiliki ukuran 1, 2, 4 atau 8. Pointer memiliki ukuran 4 di lingkungan 32-bit dan 8 di lingkungan 64-bit.
  • Jenis senyawa diselaraskan secara alami jika masing-masing komponennya selaras secara alami relatif terhadap awal jenis, dan jika tidak ada celah (padding) yang tidak perlu di antara komponen. Komponen majemuk, seperti bidang atau elemen, direkursikan menjadi komponen jenis penunjuk atau jenis dasar.

Aturan sederhana untuk membantu mengingat perilaku ini adalah bahwa keselarasan alami dari suatu jenis sama dengan keselarasan terbesar komponennya.

Ada hubungan antara perataan dan ukuran memori tipe dalam bahasa seperti C atau C++ dan IDL, sebagaimana dinyatakan oleh operator sizeof(). Ukurannya adalah kelipatan dari perataan (kelipatan minimal yang meliputi tipe). Ini mengikuti dari representasi array dalam memori.

Penyelarasan alami penting karena mengakses data yang tidak selaras dapat menyebabkan pengecualian pada beberapa sistem. Data dapat ditandai untuk manipulasi yang aman ketika tidak selaras, tetapi biasanya itu melibatkan penalti kecepatan yang mungkin substansial di beberapa platform.

Nota

Dalam memori, objek dengan tipe yang memiliki keselarasan alami n dijamin diatur dengan tepat ketika ditempatkan pada alamat yang merupakan kelipatan dari n.

 

Pengemasan versus Perataan

Menentukan tingkat pengemasan yang lebih besar dari alignment alami suatu tipe tidak mengubah alignment tipe. Menentukan tingkat pengemasan yang lebih kecil dari perataan alami akan mengurangi perataan tipe ke tingkat pengemasan. Akibatnya, tipe yang dikemas dapat ditempatkan dalam memori di alamat yang merupakan kelipatan dari tingkat pengemasan (perataan yang dikurangi) tanpa menyebabkan ketidakselarasan. Ini mempengaruhi jenis sederhana dan jenis komponen. Untuk jenis majemuk, tata letak internal jenis dapat terpengaruh, karena berkurangnya keselarasan komponen dapat mengubah ukuran padding yang diperlukan untuk penyelarasan komponen yang tepat, sehingga mengurangi ukuran jenis.

Aturan sederhana untuk membantu mengingat perilaku ini adalah bahwa keselarasan baru dari jenis yang dikemas adalah yang lebih kecil dari tingkat pengemasan dan keselarasan alaminya. Ukuran huruf adalah kelipatan dari perataan baru. Operator sizeof() mengembalikan ukuran yang dikurangi untuk tipe tertata.

Misalnya, dengan tingkat penyelarasan 2, tipe data long menjadi sejajar di batas 2, sehingga dapat ditempatkan pada alamat memori genap mana pun, tidak hanya pada alamat yang merupakan kelipatan 4 seperti halnya dengan penyelarasan alami. Struktur dengan ukuran pendek dan panjang, yang diatur pada posisi 2, tidak memerlukan celah internal antara bagian pendek dan panjang berikutnya yang diperlukan untuk keselarasan alami; oleh karena itu, struktur tersebut tidak hanya diselaraskan pada posisi 2, tetapi juga ukurannya berkurang dari 8 menjadi 6.

Sebagai contoh, pertimbangkan tipe gabungan yang terdiri dari karakter 1-byte, bilangan bulat sepanjang 4 byte, dan karakter 1-byte.

struct mystructtype 
{    
    char c1;  /* requires 1 byte  */
              /* 3 bytes of padding with natural alignment only */
    long l2;  /* requires 4 bytes */
    char c3;  /* requires 1 byte  */
              /* 3 bytes of padding with natural alignment only */
 } mystruct;

Struktur ini secara alami selaras pada 4 dan memiliki ukuran alami 12.

Untuk tingkat pengemasan 4 atau lebih besar, struktur mystruct disejajarkan ke 4 dan sizeof(struct mystructtype) sama dengan 12. Struktur akan tidak sejajar jika ditempatkan di memori pada alamat yang bukan kelipatan 4.

Untuk kemasan tingkat 2, struktur selaras pada 2 dan ukurannya adalah 8. Struktur yang dikemas dengan level 2 akan tidak sejajar jika terletak di memori pada alamat yang bukan kelipatan 2.

Untuk tingkat pengemasan 1, struktur disejajarkan pada 1 dan besarnya adalah 6. Struktur yang dikemas dengan tingkat 1 dapat ditempatkan di mana saja tanpa menyebabkan kesalahan penyelarasan.

/Zp

/pack