Bagikan melalui


Masalah Pengemasan C-Compiler

Tingkat pengemasan memengaruhi tata letak memori jenis untuk MIDL dan pengkompilasi Microsoft C/C++ dengan cara yang sama. Di lingkungan build Microsoft, seperti lingkungan build yang ditentukan oleh VC++ atau Platform Software Development Kit (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 jenis dalam memori, perataan default sama dengan perataan alaminya.

  • Jenis dasar, seperti pendek, float dan __int64, dan pointer diselaraskan secara alami jika representasinya dimulai pada alamat yang berukuran modulo. 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 majemuk selaras secara alami jika masing-masing komponennya selaras secara alami relatif terhadap awal jenis, dan jika tidak ada celah yang tidak perlu (padding) antar komponen. Komponen majemuk, seperti bidang atau elemen, diulang ke komponen jenis penunjuk atau dasar.

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

Ada koneksi antara perataan dan ukuran memori jenis dalam bahasa seperti C atau C++ dan IDL seperti yang dinyatakan oleh ukuran operatorof(). Ukurannya adalah kelipatan perataan (kelipatan minimal yang mencakup jenis). Ini mengikuti dari representasi array dalam memori.

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

Catatan

Dalam memori, objek jenis dengan keselarasan alami n dijamin akan diselaraskan dengan benar ketika ditempatkan di alamat yang merupakan kelipatan n.

 

Pengemasan versus Perataan

Menentukan tingkat pengemasan yang lebih besar dari perataan alami jenis tidak mengubah perataan jenis. Menentukan tingkat pengemasan yang lebih kecil dari perataan alami mengurangi perataan jenis ke tingkat pengemasan. Akibatnya, jenis yang dikemas dapat ditempatkan dalam memori di alamat yang merupakan kelipatan 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 lebih kecil dari tingkat pengemasan dan keselarasan alaminya. Ukuran jenis adalah kelipatan perataan baru. Operator sizeof() mengembalikan ukuran yang dikurangi untuk jenis kemasan.

Misalnya, dengan kemasan tingkat 2 panjang menjadi selaras pada 2, dan oleh karena itu dapat ditempatkan pada alamat yang merata, tidak hanya di alamat yang merupakan kelipatan 4 seperti halnya dengan keselarasan alami. Struktur dengan pendek dan panjang, dikemas pada 2, tidak memerlukan kesenjangan internal antara panjang pendek dan berikut yang diperlukan untuk keselarasan alami; oleh karena itu, tidak hanya struktur yang sekarang selaras pada 2, ukurannya juga berkurang dari 8 menjadi 6.

Sebagai contoh, pertimbangkan jenis majemuk yang terdiri dari karakter 1-byte, panjang bilangan bulat 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 kemasan tingkat 4 atau lebih besar, struktur mystruct selaras pada 4 dan sizeof(struct mystructtype) sama dengan 12. Struktur akan tidak sejajar jika terletak di memori di alamat yang bukan kelipatan 4.

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

Untuk kemasan tingkat 1, struktur selaras pada 1 dan ukurannya adalah 6. Struktur yang dikemas dengan tingkat 1 dapat ditempatkan di mana saja tanpa menyebabkan kesalahan penyelarasan.

/Zp

/Paket