Newsgroup: it.comp.lang.c++
Titolo: Allineamento: che bestia e'?

Salve a tutti.
Volevo farvi una semplice domanda: chi sa darmi informazioni esaurienti su
cosa sia l'allineamento di bit (o qualcosa del genere)? Mi rendo conto che
per un programmatore e' una domanda ridicola, nel senso che dovrei gia'
saperlo, pero' qui giu' negli inferi, i manuali che passano a noi hellhounds
fanno schifo! :) Rispondete numerosi sperando di non essere OT.
Salve!

 cosa sia l'allineamento di bit (o qualcosa del genere)?
Forse intendi l'allineamento di bytes non di bits, giusto? Si usa per
motivi di efficienza. Non dovrebbe interessare il programmatore se non
quando, ad esempio, si cerca di accedere a strutture (magari records
letti da file) create con allineamenti diversi. In pratica vengono
inseriti dei "filler" nelle strutture per fare in modo che i campi siano
allineati ad indirizzi multipli di 1/2/4 etc.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

Un programmatore C++, in genere, non dovrebbe interessarsi di problemi di
allineamento.
Io ho sentito parlare di allineamento in campo di "trucchi (irresponsabili
IMHO) per ottimizzare il codice".
Ti spiego subito: i moderni processori sono (quasi) tutti a "32 bit", il che
vuol dire che accedono alla memoria (e fanno un sacco di altra robba, credo,
ma non sono un esperto di codice binario! - gli esperti di ASM mi
perdonassero per l'imperfezione delle informazioni) tramite "registri" che
possono contenere fino a 32 bit di dati. Tradotto in termini semplici: i
processori utilizzano sempre degli unsigned long (chiamati anche DWORD) per
accedere alla memoria.
"E cosa me ne frega a me?" ti starai chiedendo... assolutamente NULLA. Tu
non programmi in ASM, ma in C++, quindi č il compilatore che pensa a
risolvere per te i problemi di allineamento.
Esempio: se allochi un array di 5 char il tuo compilatore preferito molto
probabilmente lo trasformerą (in modalitą Release) in un array di 8 char.
C'č chi dice che in genere sia meglio allocare sempre strutture che siano
"allineate", cioč che occupino una quantitą di memoria che sia un multiplo
esatto di una DWORD... in effetti č un buon consiglio, ma vedi di non
portarlo alle estreme conseguenze: se ti serve un bool alloca un bool e
basta, penserą il compilatore ad ottimizzare. Ma il compilatore non puņ
ottimizzare se non są ESATTAMENTE quello che vuoi, quindi se allochi un
DWORD al posto di un bool (come fanno molti) il compilatore sarą sempre
convinto che ti serva ESATTAMENTE un DWORD, e le ottimizzazioni andranno a
quel paese!
Cmq l'argomento (specialmente quello dei bool) č molto dibattuto, e troverai
molte persone a favore del DWORD al posto del bool... IMHO č un'abitudine
sbagliata, ma alla fine la differenza fra i due approcci č veramente minima,
quindi il tutto diventa solo una questione di opinioni, e il problema
dell'allineamento diventa un problema per filosofi e non per programmatori
(almeno a livelli non professionali)!!!
Quindi non preoccuparti di questi problemi e pensa solo a programmare bene i
tuoi algoritmi: IMHO č il modo migliore di ottimizzare un programma!

 molte persone a favore del DWORD al posto del bool...
Scusa, ma perché mischi tipi standard del C++ come bool e tipi non
standard come DWORD?


 standard come DWORD?
Come ti ho già detto, DWORD=unsigned long. Uso il termine DWORD solo perchè
è più corto. Forse (anzi, sicuramente) ho divagato un pò con gli esempi, ma
il concetto dell'allineamento è che il processore cerca sempre di ottenere
strutture dati di dimensione multipla di 4 byte (=32 bit), talvolta perdendo
un pò di efficienza. Tutto qui. :-)

Oooops... ti ho scambiato per Hellhound...
il discorso bool vs DWORD è il classico discorso che si fà in ambiente
Windows: "meglio bool o BOOL?". A me ha sempre dato fastidio utilizzare BOOL
(dichiaraz.: typedef int BOOL - non è un unsigned long ma sono cmq 32bit) al
posto di bool, poichè preferisco lasciare che sia il compilatore a fare le
dovute ottimizzazioni... tuttavia c'è chi sostiene che per il processore un
bool è più pesante perchè non è allineato a 32bit.
Questo (o, cmq, quello delle ottimizzazioni in genere) e' il contesto più
frequente (purtroppo!) in cui sento parlare di allineamento.
Ad ogni modo hai ragione a parlare di problemi di allineamento nei file: è
l'unico contesto in cui il programmatore C++ deve occuparsene (brutti
ricordi di quando non allineavo le scan-line di una bitmap in una funzione
per salvare immagini su disco!!!)

talvolta perdendo un pò di efficienza.
AFAIK, l'allineamento serve _proprio_ a garantire un accesso
_efficiente_ alla memoria. 
-- 
Andrea Laforgia
"640kb of memory should be enough for anyone." -- Bill Gates.

...

Per allineamento si intende il vincolo di collocare in memoria una
struttura dati ad un indirizzo di tipo particolare, ad esempio
multiplo di una particolare potenza di due, in genere uguale o
maggiore della dimensione della struttura dati di partenza.
Un esempio comune per le piattaforme a 32 bit e' la liberta' di
allocare strutture di 1 byte (ad es. char) a qualsiasi indirizzo,
strutture di 2 byte (ad es short) ad indirizzi pari e strutture di
dimensioni superiori ad indirizzi multipli di quattro.
A seconda delle architetture hardware i vincoli di allineamento
possono essere dettati da semplici questioni prestazionali, oppure
essere caratteristiche proprie (e quindi inviolabili) del sistema.
In generale programmando in C++ sono problemi gestiti automaticamente
dal compilatore; un'eccezione e' ad esempio l'uso di placement new in
un array di char non allocato dinamicamente, dove sta al programmatore
il rispettare i vincoli di allineamento.
Ciao,
Nicola