共用方式為


對齊 (C11)

C 的其中一個低階功能是能夠指定記憶體中對象的精確對齊,以充分利用硬體架構。

CPU 在數據大小倍數的位址儲存數據時,CPU 會更有效率地讀取和寫入記憶體。 例如,如果 4 位元組整數儲存在 4 倍的位址,則會更有效率地存取。 當數據未對齊時,CPU 會執行更多地址計算工作來存取數據。

根據預設,編譯程式會根據其大小來對齊數據: char 在1位元組界限、 short 2 int位元組界限、、 longfloat 4位元組界限、8位元組界限 double 等。

此外,藉由將常用數據與處理器的快取行大小對齊,您可以改善快取效能。 例如,假設您定義大小小於 32 個字節的結構。 您可能想要使用 32 位元組對齊來確保結構的所有實例都會有效率地快取。

通常,您不需要擔心對齊。 編譯程式通常會根據目標處理器和數據的大小,在自然界限上對齊數據。 數據會對齊 32 位處理器的最多 4 位元組界限,而 64 位處理器上的 8 位元組界限則對齊。 不過,在某些情況下,您可以指定數據結構的自定義對齊方式,以達到效能改善或節省記憶體。

使用 C11 關鍵詞 _Alignof 取得類型或變數的慣用對齊方式,並 _Alignas 指定變數或使用者定義類型的自定義對齊方式。

在中定義的便利巨集alignofalignas,分別對應至 _Alignof_Alignas<stdalign.h> 這些巨集會比對C++中使用的關鍵詞。 因此,如果您使用巨集而非 C 關鍵詞,如果兩種語言之間共用任何程式代碼,可能會對程式代碼可移植性有所説明。

alignas_Alignas (C11)

使用 alignas_Alignas 來指定變數或使用者定義類型的自定義對齊方式。 它們可以套用至結構、等位、列舉或變數。

alignas 語法

alignas(type)
alignas(constant-expression)
_Alignas(type)
_Alignas(constant-expression)

備註

_Alignas 無法在 typedef、bit-field、function、function 參數或以 register 規範宣告的物件宣告中使用。

指定兩個乘冪的對齊方式,例如 1、2、4、8、16 等等。 請勿使用小於型別大小的值。

structunion 型別的對齊方式等於任何成員的最大對齊方式。 填補位元組會新增在 內 struct ,以確保符合個別成員對齊需求。

如果宣告中有數個規範(例如struct,具有數alignas個具有不同alignas規範的成員,則的struct對齊方式至少會是最大規範的值。

alignas

此範例會使用便利巨集 alignof ,因為它可移植到C++。 如果您使用 _Alignof,則行為會相同。

// Compile with /std:c11

#include <stdio.h>
#include <stdalign.h>

typedef struct 
{
    int value; // aligns on a 4-byte boundary. There will be 28 bytes of padding between value and alignas
    alignas(32) char alignedMemory[32]; // assuming a 32 byte friendly cache alignment
} cacheFriendly; // this struct will be 32-byte aligned because alignedMemory is 32-byte aligned and is the largest alignment specified in the struct

int main()
{
    printf("sizeof(cacheFriendly): %d\n", sizeof(cacheFriendly)); // 4 bytes for int value + 32 bytes for alignedMemory[] + padding to ensure  alignment
    printf("alignof(cacheFriendly): %d\n", alignof(cacheFriendly)); // 32 because alignedMemory[] is aligned on a 32-byte boundary

    /* output
        sizeof(cacheFriendly): 64
        alignof(cacheFriendly): 32
    */
}

alignof_Alignof (C11)

_Alignof 和其別名 alignof 會以指定類型的位元組為單位傳回對齊方式。 它會傳回 型別 size_t的值。

alignof 語法

alignof(type)
_Alignof(type)

alignof

此範例會使用便利巨集 alignof ,因為它可移植到C++。 如果您使用 _Alignof,則行為會相同。

// Compile with /std:c11

#include <stdalign.h>
#include <stdio.h>

int main()
{
    size_t alignment = alignof(short);
    printf("alignof(short) = %d\n", alignment); // 2
    printf("alignof(int) = %d\n", alignof(int)); // 4
    printf("alignof(long) = %d\n", alignof(long)); // 4
    printf("alignof(float) = %d\n", alignof(float)); // 4
    printf("alignof(double) = %d\n", alignof(double)); // 8

    typedef struct
    {
        int a;
        double b;
    } test;

    printf("alignof(test) = %d\n", alignof(test)); // 8 because that is the alignment of the largest element in the structure

    /* output
        
       alignof(short) = 2
       alignof(int) = 4
       alignof(long) = 4
       alignof(float) = 4
       alignof(double) = 8
       alignof(test) = 8
    */
}

需求

使用 /std:c11 編譯。

Windows SDK 10.0.20348.0 (版本 2104) 或更新版本。 請參閱 Windows SDK 以下載最新的 SDK。 如需安裝和使用適用於 C11 和 C17 開發的 SDK 的指示,請參閱在 Visual Studio 中安裝 C11 和 C17 支援

另請參閱

/std (指定語言標準版)
C++ alignofalignas
數據對齊的編譯程序處理