Desidero che la dimensione di una struct C sia multiplo di 16 byte (16B/32B/48B/..). Non importa a quale dimensione arriva, deve essere solo multiplo di 16B. Come posso far rispettare il compilatore per farlo? Grazie.Allineamento delle dimensioni della struct
risposta
La dimensione di una struttura C dipenderà dai membri della struttura, i loro tipi e quanti di essi sono. Non c'è davvero un modo standard per forzare il compilatore a fare in modo che le strutture siano multiple di una certa dimensione. Alcuni compilatori forniscono un pragma che ti consentirà di impostare il limite di allineamento, tuttavia questa è davvero una cosa diversa. E potrebbe esserci qualcuno che avrebbe una tale impostazione o fornire un tale pragma.
Tuttavia, se si insiste su questo metodo sarebbe quello di fare l'allocazione della memoria della struct e per forzare l'allocazione di memoria per arrotondare alla prossima dimensione di 16 byte.
Quindi, se si ha una struttura come questa.
struct _simpleStruct {
int iValueA;
int iValueB;
};
Quindi si potrebbe fare qualcosa come il seguente.
{
struct _simpleStruct *pStruct = 0;
pStruct = malloc ((sizeof(*pStruct)/16 + 1)*16);
// use the pStruct for whatever
free(pStruct);
}
Che questo sarebbe fare è di spingere la dimensione fino alla prossima dimensione di 16 byte per quanto tu fossi interessato. Tuttavia, ciò che l'allocatore di memoria può o non può essere di darvi un blocco che è in realtà quella dimensione. Il blocco di memoria potrebbe effettivamente essere più grande della tua richiesta.
Se stai per fare qualcosa di speciale con questo, per esempio diciamo che stai andando a scrivere questa struttura in un file e vuoi conoscere la dimensione del blocco, allora dovresti fare lo stesso calcolo usato nel malloc() piuttosto che usare l'operatore sizeof() per calcolare la dimensione della struct.
Così la prossima cosa sarebbe quella di scrivere il proprio operatore proprio sizeof() utilizzando una macro come ad esempio.
#define SIZEOF16(x) ((sizeof(x)/16 + 1) * 16)
quanto ne so non esiste un metodo affidabile per tirare la dimensione di un blocco allocato da un puntatore. Normalmente un puntatore avrà un blocco di allocazione di memoria che viene utilizzato dalle funzioni di gestione dell'heap della memoria che conterranno varie informazioni di gestione della memoria come la dimensione del blocco allocata che potrebbe essere effettivamente più grande della quantità di memoria richiesta. Tuttavia, il formato per questo blocco e dove si trova rispetto all'indirizzo di memoria effettivo fornito dipenderà dal tempo di esecuzione del compilatore C.
Si dovrebbe [non eseguire il cast del valore restituito da 'malloc()', in C] (http://stackoverflow.com/a/605858/28169). – unwind
Questo dipende interamente dal compilatore e da altri strumenti poiché l'allineamento non è specificato in profondità nello standard ISO C (specifica che l'allineamento può verificarsi ai compilatori, ma non entra nei dettagli su come applicarlo).
Avrete bisogno di esaminare la roba attuazione specifiche per la vostra toolchain del compilatore. Può fornire uno #pragma pack
(o align
o qualche altra cosa) che è possibile aggiungere alla definizione della struttura.
Essa può anche fornire questo come un'estensione del linguaggio. Ad esempio, gcc consente di aggiungere attributi a una definizione, una delle quali controlla l'allineamento:
struct mystruct { int val[7]; } __attribute__ ((aligned (16)));
Per Microsoft Visual C++:
#pragma pack(push, 16)
struct _some_struct
{
...
}
#pragma pack(pop)
Per GCC:
struct _some_struct { ... } __attribute__ ((aligned (16)));
Esempio:
#include <stdio.h>
struct test_t {
int x;
int y;
} __attribute__((aligned(16)));
int main()
{
printf("%lu\n", sizeof(struct test_t));
return 0;
}
compilato con gcc -o main main.c
verrà emesso 16
. Lo stesso vale per altri compilatori.
Per gcc __attribute__ allineato, sta forzando la dimensione della struct a essere multiplo di 16B? O semplicemente garantisce che l'indirizzo iniziale della struttura sia allineato a 16B? –
Sia l'indirizzo iniziale che la dimensione della struttura saranno allineati a 16B. Questo viene fatto per assicurare il corretto allineamento degli elementi dell'array di strutture. – Romeo
Questo non è vero. La macro __attribute (aligned (x))) alloca la struct su un limite di x-byte e non ha nulla a che fare con la dimensione della struct http://gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc /Variable-Attributes.html –
Si potrebbe forse fare un doppio struct, avvolgendo lo struct reale in un secondo che può aggiungere padding:
struct payload {
int a; /*Your actual fields. */
float b;
char c;
double d;
};
struct payload_padded {
struct payload p;
char padding[16 * ((sizeof (struct payload) + 15)/16)];
};
Poi si può lavorare con la struct imbottita:
struct payload_padded a;
a.p.d = 43.3;
Naturalmente , puoi fare uso del fatto che il primo membro di una struttura inizia a 0 byte da dove inizia la struttura e considera un puntatore a struct payload_padded
come se fosse un puntatore a un struct payload
(perché lo è):
float d_plus_2(const struct payload *p)
{
return p->d + 2;
}
/* ... */
struct payload_padded b;
const double dp2 = d_plus_2((struct payload *) &b);
- 1. Layout sequenziale delle strutture CLR: allineamento e dimensioni
- 2. struct allineamento C/C++
- 3. intesa C dimensioni ++ struct
- 4. di Struct per digitare dimensioni
- 5. Dimensioni della struttura data
- 6. Rilevamento delle dimensioni della finestra suddivisa
- 7. Come modificare l'ordine delle dimensioni della matrice
- 8. Allineamento verticale delle subfile LATEX
- 9. Python allineamento delle assegnazioni (stile)
- 10. Scopo della struct, typedef struct, in C++
- 11. Ottieni dimensioni delle dimensioni nell'array
- 12. android.support.v7.widget.Toolbar problema di allineamento delle icone
- 13. Ottenere dimensione della struct in C#
- 14. C: allineamento strutture dati
- 15. allineamento delle equazioni matematiche in Latex
- 16. Allineamento orizzontale delle voci di elenco
- 17. matplotlib: allineamento del titolo della legenda
- 18. Doppio allineamento
- 19. Limitazione delle dimensioni della trama? Android Open GL ES 2.0
- 20. Gridsplitter: limita le altezze delle file alle dimensioni della finestra
- 21. Dimensioni dell'icona della barra delle azioni in Android 4.2
- 22. impostazione delle dimensioni dell'icona della barra di navigazione ios
- 23. Elenco delle dimensioni dell'immagine della fotocamera comunemente supportate
- 24. SQL Server Determinare le dimensioni fisiche delle colonne della tabella
- 25. Riduzione delle dimensioni delle etichette UIL
- 26. PyTables che si occupano di dati con dimensioni molto più grandi delle dimensioni della memoria
- 27. Allineamento della cella di tabella con rowspan
- 28. Allineamento della memoria sui processori moderni?
- 29. Allineamento verticale del contenuto della riga DataGrid
- 30. Xcode Disabilita allineamento automatico allineamento punti
Che cos'è il compilatore? – Joe
Il titolo usa la parola allineamento, tuttavia il corpo della domanda parla della dimensione della struttura. Cosa vuoi veramente realizzare? E sono anche curioso del perché. –
E qui c'è un articolo esistente che fornisce una soluzione che utilizza un'unione per eseguire il rilievo su una determinata dimensione. Comunque quella soluzione richiede la conoscenza della dimensione della struct [Size of Struct] (http://stackoverflow.com/questions/8705665/force-specific-struct-size-in-c), tuttavia ciò che dovresti fare è usare un calcolo della dimensione per l'array di caratteri come (sizeof (struct it)/16 + 1) * 16 piuttosto che una costante numerica. –