2013-04-05 20 views
11

sto leggendo N3485 C++ Draft Standard e nella sezione sull'allineamento, si comunica quanto segue:C++ allineamento - stretta e debole

3.11 Allineamento [basic.align]

1. .. Un allineamento è un valore intero definito dall'implementazione che rappresenta il numero di byte tra gli indirizzi successivi a cui è possibile allocare un determinato oggetto. Un tipo di oggetto impone un requisito di allineamento su ogni oggetto di quel tipo; È possibile richiedere un allineamento più rigoroso utilizzando l'identificatore di allineamento (7.6.2).

Qui si afferma quale allineamento è, e ho capito. Significa che se hai un sistema a 32 bit (4 byte), leggerà in blocchi di 4 byte alla volta, quindi dovresti posizionare le cose in memoria a indirizzi di offset a 4 byte. Gran parte di questo è gestita da un buon compilatore, tuttavia C++ ti consente di dire la tua.

Lo specificatore di allineamento di cui parla è alignas.

È possibile passare un numero intero a alignas per specificare la vostra esigenza di allineamento o un tipo simile alignas(double)

Ora, avete debole o rigoroso allineamento, che è riportata ad essere i seguenti:

5 allineamenti avere un ordine da più debole o più forte o più rigido allineamenti. Gli allineamenti più rigidi hanno valori di allineamento maggiori. Un indirizzo che soddisfa un requisito di allineamento soddisfa anche qualsiasi requisito di allineamento valido più debole .

7 allineamenti Confrontando è significativo e fornisce i risultati evidenti:

- Due allineamenti sono uguali quando i loro valori numerici sono uguali.

- Due allineamenti sono diversi quando i loro valori numerici non sono uguali.

- Quando un allineamento è più grande di un altro rappresenta un allineamento più rigoroso.

Quindi, qui si afferma che un allineamento più rigoroso è un allineamento più grande. Significa solo che alignas(8) è più rigido di alignas(4)? Su un sistema a 32 bit (4 byte), la versione 8 significherebbe che il tipo int richiederebbe due letture invece di una e una con solo riempimento. Il rigore si riferisce al fatto che impone un potenziale sovraccarico sulla CPU, quando l'allineamento è "abusato", come in questo esempio sciocco?

Mi rendo conto che non tutti gli allineamenti sono validi su un determinato sistema e che gli allineamenti estesi devono essere validi per produrre un comportamento corretto.

Per me l'allineamento consiste nel consentire alla CPU di accedere ai dati della memoria in blocchi di dimensioni word, che è il modo più ottimale per una CPU di recuperare e scrivere dati da e verso la memoria.

Questo stretto allineamento, a quanto ho capito, potrebbe potenzialmente rovinarlo. Ho sbagliato? Qual è l'allineamento rigoroso rispetto all'allineamento debole?

risposta

8

Il "rigoroso" si riferisce semplicemente al fatto che i valori di allineamento più grandi sono più restrittivi in ​​termini di possibili indirizzi.

Ci sono solo la metà degli indirizzi validi per l'allineamento 8 quanti sono per l'allineamento 4, quindi un tipo con l'allineamento 8 è più limitato per quanto riguarda dove può essere posizionato.

+0

ah! Questo ha senso. –