Erreurs, bugs, questions - page 2498

 
fxsaber:

Pourquoi la taille ne serait-elle pas ici un multiple de quatre ?

Il s'avère que les classes peuvent aussi être alignées.

car il s'agit d'un alignement interne. La variable externe suivante sera très probablement placée avec un alignement de 8, quelle que soit lataille de la structure.

 
Andrei Trukhanovich:

car il s'agit d'un alignement interne

Alors j'ai peur que le but de l'alignement soit perdu.

struct A pack(4)
{
  short j;
};

void OnStart()
{
  Print(sizeof(A)); // 2
  
  const int handle = FileOpen(__FILE__, FILE_WRITE | FILE_BIN);
  
  if (handle != INVALID_HANDLE)
  {
    A a = {0};
    
    FileWriteStruct(handle, a);
    Print(FileTell(handle)); // 2
    
    FileClose(handle);
  }
}
 
fxsaber:

Alors j'ai peur que le but de l'alignement soit perdu.

l'intérêt de l'alignement est de faire en sorte que les adresses des variables internes soient un multiple de l'alignement.

 
Andrei Trukhanovich:

l'intérêt de l'alignement est de faire en sorte que les adresses des variables internes soient un multiple de l'alignement.

J'ai essayé de comparer votre déclaration avec la documentation, mais je ne comprends toujours pas.

 
Andrei Trukhanovich:

Une chose non sciée, apparemment. Il y a clairement déjà une erreur ici :

struct A pack(4)
{
  short j;
};

void OnStart()
{
   A q[2];
   Print(sizeof(q)); // 4
   return;
}
 
fxsaber:

J'ai essayé de comparer votre déclaration avec la documentation, mais je ne comprends pas.

Je pense que l'aide n'a pas été mise à jour, c'est-à-dire que dans la version avec support C# (en hiver ?) il y avait une description de la façon dont l'alignement fonctionne maintenant.

je viens de googler un article sur hobber à propos de l'alignement. je pense que cela fonctionnera de la même manière dans MT5 maintenanthttps://habr.com/ru/post/142662/

 
Igor Makanu:

Je pense que l'aide n'a pas été mise à jour, il semble que dans la version avec support C# (en hiver ?) il y avait une description de la façon dont l'alignement fonctionne maintenant.

J'ai googlé cet article sur hobber à propos de l'alignement. Il semble que la même chose fonctionnera dans MT5 maintenanthttps://habr.com/ru/post/142662/.

J'ai lu l'article et les commentaires. Je ne comprends pas du tout l'algorithme d'alignement. Il est réglé sur pack(4) mais pour une raison quelconque, quelque chose s'aligne sur 2 et quelque chose s'aligne sur 4.

 
fxsaber:

J'ai parcouru l'article et les commentaires qui s'y rapportent. Je ne comprends pas du tout l'algorithme d'alignement. C'est pack(4), mais pour une raison quelconque, quelque chose s'aligne sur 2, quelque chose sur 4.

A quoi bon ? L'alignement simple par défaut est le même qu'avant (et il est peu probable qu'il change), le spécificateur de paquet est tordu. Si vous en avez vraiment besoin, vous pouvez insérer vous-même le module complémentaire.

 
Vict:

A quoi bon ? L'alignement simple par défaut est le même qu'avant (et il est peu probable qu'il change), le spécificateur de paquet est tordu. Si vous en avez vraiment besoin, vous pouvez insérer le module complémentaire vous-même.

Je veux aller au fond des choses.

 
fxsaber:

J'aimerais aller au fond des choses.

l'alignement des données n'est pas

Print(sizeof(A)); // 2

apparemment, cela est fait en tenant compte de l'utilisation interne de sizeof(), c'est-à-dire quesizeof() ne tient pas compte de la mémoire physique, il additionne simplement chaque type en octets.

l'alignement est un arrangement des données dans la mémoire physique, comme écrit dans l'aide "pour transférer aux fonctions dll importées" - dans différents compilateurs et langages les types de données peuvent différer en taille ou plutôt comment ils sont stockés dans la mémoire, ainsi vous devriez utiliser struct A pack(4) de sorte que chaquemembre de la structure "ne soit pas monté au-delà de sa boîte" - bytes

Voici comment cela se présente sur le hubra dans l'article :

struct Foo
{
    char ch;
    int value;
};

1 octet : ch

2 octets : vide

3 octets : videCECI estchar ch

4 octets : vide


5 octets : valeur [0]

6 octets : valeur[1]Ceci est unevaleur int;

7 octets : valeur [2]

8 octets : valeur [3]


Raison: