Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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ó