Erreurs, bugs, questions - page 2503

 
Vict:

Je suis désolé, mais si vous écrivez ça, vous ne comprenez pas le sujet.

Non, vous ne semblez pas comprendre.

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

Non, vous ne semblez pas comprendre.

Le paquet #pragma du truc smallmicrosoft est une chose très particulière (la façon dont il fonctionne maintenant me surprend, pour être honnête). Il n'est pas surprenant que l'alignas standard fonctionne différemment.

En voici d'autres :

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

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

Le pack #pragma des petits logiciels est une chose très particulière (la façon dont il fonctionne me surprend maintenant, pour être honnête). Pas étonnant que les alignas fonctionnent différemment dans le standard.

Allez !)

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

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

#pragma pack fonctionne bien sur gcc aussi, et ce que vous avez écrit est juste un attribut interne de gcc qui fonctionne différemment de aligned.

 
TheXpert:

Allez, déjà.)

#pragma pack fonctionne bien sur gcc également, et ce que vous avez écrit n'est qu'un attribut interne de gcc qui ne fonctionne pas de la même manière qu'aligné.

Que montre donc cet exemple ? Que vous n'avez pas compris l'utilité des alignements ? Même le compilateur jure sur le code :

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

Le paquet #pragma est une étrange petite création softie que gcc ne supporte que par compatibilité.

 
Vict:

Que montre donc cet exemple ? Que vous n'avez pas compris comment utiliser les alignements ?

Je suis d'accord, j'ai fait une erreur.

Voici le bon code.

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

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

donc alignas n'est pas analogue à l'emballage.

parce que dans le même gcc (donc sans smallsoft) le multiple par défaut de l'empaquetage est de 8

parce que :

#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;
}

mais avec 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;
}
 
Et notez que c'est un comportement par défaut, pas pour la compatibilité avec les logiciels.
 
TheXpert:
Et notez que c'est le comportement par défaut, pas pour la compatibilité de smallmicrosoft

Je ne comprends pas. Tout va bien dans l'exemple, je ne vois pas de problème. Défaut - alignement de la structure == prendre l'alignement d'exigence le plus strict entre les membres.

struct {char;} == 1, struct {char;short} == 2, struct {char;int} == 4, etc. C'est comme ça partout. Et long long == huit, donc alignas n'a aucun effet.

 
Vict:

Je ne comprends pas. Tout va bien dans l'exemple, je ne vois pas le problème.

Oui, vous avez raison, l'exemple n'est pas un indicateur.

L'essentiel est que mql pack fonctionne comme #pragma pack et non comme alignas.

 
Les gens, partagez quelques informations. Pourquoi utilisez-vous l'alignement ?
 
Francuz:
Les gens, partagez quelques informations. Pourquoi utilisez-vous l'alignement ?

c'est une programmation orientée raton laveur!

Hélas, on ne peut pas s'en passer ;)