Megosztás a következőn keresztül:


Igazítás (C11)

A C egyik alacsony szintű funkciója, hogy megadhatja az objektumok pontos igazítását a memóriában, hogy maximálisan kihasználhassa a hardverarchitektúra előnyeit.

A processzorok hatékonyabban olvassák és írják a memóriát, ha az adatokat az adatméret többszörösét tartalmazó címen tárolják. Egy 4 bájtos egész szám például hatékonyabban érhető el, ha egy 4-et többszörösen tartalmazó címen tárolja. Ha az adatok nincsenek igazítva, a PROCESSZOR több címszámítási munkát végez az adatok eléréséhez.

A fordító alapértelmezés szerint mérete alapján igazítja az adatokat: char 1 bájtos határon, short 2 bájtos határon, floatintlong4 bájtos határon, double 8 bájtos határon stb.

Emellett a gyakran használt adatoknak a processzor gyorsítótárvonal-méretével való igazításával javíthatja a gyorsítótár teljesítményét. Tegyük fel például, hogy 32 bájtnál kisebb méretű struktúrát definiál. Érdemes lehet 32 bájtos igazítást használni a struktúra összes példányának hatékony gyorsítótárazásához.

Általában nem kell aggódnia az igazítás miatt. A fordító általában a célprocesszoron és az adatok méretén alapuló természetes határokhoz igazítja az adatokat. Az adatok 32 bites processzorokon legfeljebb 4 bájtos, 64 bites processzorokon pedig 8 bájtos határokhoz vannak igazítva. Bizonyos esetekben azonban teljesítménybeli javulást vagy memóriamegtakarítást érhet el, ha egyéni igazítást ad meg az adatstruktúrákhoz.

A C11 kulcsszóval _Alignof lekérheti egy típus vagy változó előnyben részesített igazítását, és _Alignas egyéni igazítást adhat meg egy változóhoz vagy felhasználó által definiált típushoz.

A kényelmi makrók alignof és alignasa benne <stdalign.h>meghatározottak közvetlenül a _Alignof megfelelőre, _Alignasilletve azokra képeznek le leképezést. Ezek a makrók megfelelnek a C++-ban használt kulcsszavaknak. A C kulcsszavak helyett a makrók használata hasznos lehet a kód hordozhatósága szempontjából, ha bármilyen kódot megoszt a két nyelv között.

alignas és _Alignas (C11)

Egyéni igazítás használata alignas vagy _Alignas megadása változóhoz vagy felhasználó által megadott típushoz. Alkalmazhatók egy szerkezetre, egyesítésre, enumerálásra vagy változóra.

alignas szintaxis

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

Megjegyzések

_Alignas nem használható típusdef, bitmező, függvény, függvényparaméter vagy a kijelölővel deklarált objektum deklarációjában register .

Adjon meg egy olyan igazítást, amely két hatványú, például 1, 2, 4, 8, 16 stb. Ne használjon a típus méreténél kisebb értéket.

struct és union a típusok igazítása megegyezik bármely tag legnagyobb igazításával. Az egyes tagigazítási követelmények teljesülése érdekében a rendszer párnázási bájtokat ad hozzá struct .

Ha egy deklarációban több alignas meghatározó is szerepel (például struct több olyan taggal, amelyek eltérő alignas meghatározókkal rendelkeznek), az igazítás struct legalább a legnagyobb meghatározó értéke lesz.

alignas példa

Ez a példa a kényelmes makrót alignof használja, mert c++-ra hordozható. A viselkedés ugyanaz, ha használja _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 és _Alignof (C11)

_Alignof és az aliasa alignof a megadott típus bájtjaiban adja vissza az igazítást. Típusértéket size_tad vissza.

alignof szintaxis

alignof(type)
_Alignof(type)

alignof példa

Ez a példa a kényelmes makrót alignof használja, mert c++-ra hordozható. A viselkedés ugyanaz, ha használja _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
    */
}

Követelmények

Fordítsa le a(z) /std:c11.

Windows SDK 10.0.20348.0 (2104-es verzió) vagy újabb. A legújabb SDK letöltéséhez tekintse meg a Windows SDK-t. A C11-hez és C17-hez készült SDK telepítésével és használatával kapcsolatos utasításokat a C11 és C17 telepítése a Visual Studióban című témakörben találja.

Lásd még

/std (A Language Standard verzió megadása)
C++ alignof és alignas
Az adatok igazítását végző fordító