Errori, bug, domande - pagina 2503

 
Alexey Viktorov:

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:

#include <iostream>
struct alignas(4) A
{
  short j;
};

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}

L'errore probabilmente non è qui?

 
Vict:

Mi dispiace, ma se scrivi questo, non capisci l'argomento.

No, sembra che lei non capisca.

//g++  5.4.0

#include <iostream>
#pragma  pack (push, 4)
struct A
{
  short j;
};
#pragma  pack (pop)

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 4
   return 0;
}
 
TheXpert:

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ù:

#include <iostream>
struct A
{
  short j;
} __attribute__((aligned(4)));

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}
 
Vict:

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; // 4
   return 0;
}

#pragma pack funziona bene anche su gcc, e quello che hai scritto è solo un attributo interno di gcc che funziona diversamente da aligned.

 
TheXpert:

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:

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à.

 
Vict:

Cosa mostra questo esempio? Che non hai capito come usare gli allineamenti?

Sono d'accordo, ho fatto un casino.

Ecco il codice giusto.

#include <iostream>
struct alignas(4) A
{
  short j;
}  ;

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}

quindi l'allineamento non è analogo all'imballaggio.

perché nello stesso gcc (quindi senza smallsoft) il multiplo predefinito di imballaggio è 8

perché:

#include <iostream>
struct A
{
  short j;
};

struct B
{
  short j;
  long long k;
};

int main()
{
   A q[2];
   B r[2];
   std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 4 32
   return 0;
}

ma con alignas(8)

#include <iostream>
struct alignas(8) A
{
  short j;
};

struct alignas(8) B
{
  short j;
  long long k;
};

int main()
{
   A q[2];
   B r[2];
   std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 16 32
   return 0;
}
 
E notate che questo è un comportamento predefinito, non per compatibilità con i software
 
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.

 
Vict:

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.

 
Gente, condividete qualche informazione. Per cosa usi l'allineamento?