Il pacchetto #pragma della roba smallmicrosoft è una cosa molto particolare (il modo in cui funziona ora mi sorprende, ad essere onesti). Non sorprende che l'alignas standard funzioni diversamente.
Qui c'è di più:
#include <iostream>
struct A
{
short j;
} __attribute__((aligned(4)));
int main()
{
A q[2];
std::cout << sizeof(q) << std::endl; // 8return0;
}
Il pacchetto #pragma dei piccoli software è una cosa molto particolare (il modo in cui funziona mi sorprende ora, per essere onesti). Non c'è da stupirsi che l'alignas funzioni diversamente nello standard.
Avanti )
#include <iostream>
struct A
{
short j;
} alignas(4) ;
int main()
{
A q[2];
std::cout << sizeof(q) << std::endl; // 4return0;
}
#pragma pack funziona bene anche su gcc, e quello che hai scritto è solo un attributo interno di gcc che funziona diversamente da aligned.
#pragma pack funziona bene anche su gcc, e quello che hai scritto è solo un attributo interno di gcc che non funziona allo stesso modo di aligned.
Cosa mostra questo esempio? Che non hai capito l'uso degli allineamenti? Anche il compilatore giura sul codice:
1.cc:7:3: warning: attribute ignored in declaration of 'struct A' [-Wattributes]
7 | } alignas(4) ;
| ^~~~~~~
1.cc:7:3: note: attribute for 'struct A' must follow the 'struct' keyword
Il pacchetto #pragma è una strana creazione softtie che gcc supporta solo per compatibilità.
TheXpert: E si noti che questo è il comportamento predefinito, non per la compatibilità smallmicrosoft
Non capisco l'idea. Tutto va bene nell'esempio, non vedo problemi. Default - allineamento della struttura == prendere l'allineamento più stretto tra i membri.
struct {char;} == 1, struct {char;short} == 2, struct {char;int} == 4, ecc. È così ovunque. E long long == otto, quindi alignas non ha effetto.
Allora, qual è il bug?
Si dichiara un array di due elementi con due byte ciascuno e si ottengono 4 byte come dovrebbe essere. Dov'è l'insetto? Che cos'è?
È questo.
Allineate 4 e 2 elementi occuperanno 2*8 byte.
Scusa, ma se scrivi questo, non capisci l'argomento.
Analogo alle croci:
L'errore probabilmente non è qui?
Mi dispiace, ma se scrivi questo, non capisci l'argomento.
No, sembra che lei non capisca.
No, sembra che lei non capisca.
Il pacchetto #pragma della roba smallmicrosoft è una cosa molto particolare (il modo in cui funziona ora mi sorprende, ad essere onesti). Non sorprende che l'alignas standard funzioni diversamente.
Qui c'è di più:
Il pacchetto #pragma dei piccoli software è una cosa molto particolare (il modo in cui funziona mi sorprende ora, per essere onesti). Non c'è da stupirsi che l'alignas funzioni diversamente nello standard.
Avanti )
#pragma pack funziona bene anche su gcc, e quello che hai scritto è solo un attributo interno di gcc che funziona diversamente da aligned.
Dai, su).
#pragma pack funziona bene anche su gcc, e quello che hai scritto è solo un attributo interno di gcc che non funziona allo stesso modo di aligned.
Cosa mostra questo esempio? Che non hai capito l'uso degli allineamenti? Anche il compilatore giura sul codice:
Il pacchetto #pragma è una strana creazione softtie che gcc supporta solo per compatibilità.
Cosa mostra questo esempio? Che non hai capito come usare gli allineamenti?
Sono d'accordo, ho fatto un casino.
Ecco il codice giusto.
quindi l'allineamento non è analogo all'imballaggio.
perché nello stesso gcc (quindi senza smallsoft) il multiplo predefinito di imballaggio è 8
perché:
ma con alignas(8)
E si noti che questo è il comportamento predefinito, non per la compatibilità smallmicrosoft
Non capisco l'idea. Tutto va bene nell'esempio, non vedo problemi. Default - allineamento della struttura == prendere l'allineamento più stretto tra i membri.
struct {char;} == 1, struct {char;short} == 2, struct {char;int} == 4, ecc. È così ovunque. E long long == otto, quindi alignas non ha effetto.
Non capisco l'idea. Tutto va bene nell'esempio, non vedo il problema.
Sì, hai ragione, l'esempio non è un indicatore.
La linea di fondo è che mql pack funziona come #pragma pack e non alignas.