Page 1 sur 2

#PB_Structure_AlignC ???

Publié : mer. 08/juil./2015 8:08
par Kwai chang caine
Bonjour à tous

Ca fait plusieurs fois en quelques jours que je tombe sur ça :

Code : Tout sélectionner

Structure NomDeLaStructure Align #PB_Structure_AlignC
8O

J'suis donc allé voir la doc qui dit ça:
Mot-clé 'Align' pour structure, avec #PB_Structure_AlignC qui imite les structures C
8O 8O
Comme dab...croulant sous les exemples, on en sait beaucoup plus :|
Je devais encore dormir le jour ou FRED a fait le cours à ce sujet :mrgreen:

Donc si quinquin à écouté, pris des notes, si ce quinquin a compris le fin mot de cette fonction, sur qu'est ce qui se doit d'etre "aligné" entre PB et le C ?
Si ce quinquin pouvait en plus donner un exemple simple.....j'irais jusqu'à dire trés simple, pour ne pas dire enfantin :oops:
Et si en plus, soyons fous, j'arrive à comprendre le dit exemple, alors là, je lui en serait reconnaissant pour trois génération 8)

Merci par avance et bonne journée

Re: #PB_Structure_AlignC ???

Publié : mer. 08/juil./2015 8:25
par microdevweb
Un début de réponse
http://purebasic.developpez.com/documen ... tures.html

C'est pour rendre les structures compatible lord d'un échange avec un logiciel développé en C, je penses

Re: #PB_Structure_AlignC ???

Publié : mer. 08/juil./2015 10:21
par falsam
■ Exemple d'une structure pas aligné

Code : Tout sélectionner

Structure friend
 name.s
       phone.s
    love.i
         EndStructure
■ Mais heureusement Fred fait bien les choses avec l'option #PB_Structure_AlignC

Code : Tout sélectionner

Structure friend Align #PB_Structure_AlignC
  name.s
  phone.s
  love.i
EndStructure
Bon ok c'est nul mais ça détend....

■ Fred a dit
fred a écrit :La valeur spéciale #PB_Structure_AlignC peut être utilisée pour aligner la structure telle qu'elle se ferait en langage C, utile lors de l'importation structures C utilisées avec des fonctions API.
utile lors de l'importation de structures C utilisées avec des fonctions API.

Ne pratiquant pas l'importation de structure, je n’émettrais qu'un avis: Ce paramètre va permettre d'ajuster l'alignement entre chaque champ de la structure comme cela devrait être en C.

■ La question est : Les structures en PureBasic ne sont pas alignées comme en C ? Ha bonnnnnnn ? Fred aime bien codé des sctructures anarchiques non alignées ?

Voyons voir par l'exemple : Je vais créer une structure d'amis et regarder la taille en mémoire (SizeOf) ainsi que la position du champ love (OffsetOf)

:arrow: Code et debug sans alignement.

Code : Tout sélectionner

Structure friend 
  name.s
  phone.s
  love.i
EndStructure

Debug "Structure Size " + SizeOf(friend)

Debug "Love Size: " + OffsetOf(friend\love)
debug
Structure Size 12
Love Size: 8
:arrow: - Code et debug avec alignement.

Code : Tout sélectionner

Structure friend Align #PB_Structure_AlignC
  name.s
  phone.s
  love.i
EndStructure

Debug "Structure Size " + SizeOf(friend)

Debug "Love Size: " + OffsetOf(friend\love)
debug
Structure Size 12
Love Size: 8
Mais heuuuuu ..... même résultat !!!! Ha moins qu'une structure soit aligné par défaut avec la valaur #PB_Structure_AlignC.

:idea: Parce qu'au cas ou tu ne le saurais pas, tu peux changer l'alignement des champs d'une structure.

Essaye ce code et ne me demande surtout pas à quoi ça sert.

Code : Tout sélectionner

Structure friend Align 10
  name.s
  phone.s
  love.i
EndStructure

Debug "Structure Size " + SizeOf(friend)

Debug "Love Size: " + OffsetOf(friend\love)
doc a écrit :Cela peut aider à améliorer les performances lors de l'accès aux champs de la structure, mais cela peut utiliser plus de mémoire, car un certain espace entre chaque champs sera perdu.
Aprés tu vas devoir faire la chasse aux bits perdus.

Ha ciao :)

Re: #PB_Structure_AlignC ???

Publié : mer. 08/juil./2015 11:39
par Mesa
Pour alignC, je pense que ça peut être utile lors de la création d'un DLL, surtout si celle-ci sera utilisée avec des soft codés en C.

Et pour Align, c'est intéressant quand on a une structure longue comme le bras, de type "base de données", si tout est aligné, on peut "poker" et "peeker" dans une variable structurée, à l'intérieur d'une boucle à vitesse grand v, sans avoir à coder ok\machin=... ok\bidule=..., etc.

M.

Re: #PB_Structure_AlignC ???

Publié : mer. 08/juil./2015 13:53
par Kwai chang caine
Merci à tous de vos réponses 8)

Pour ce qui est du mini tuto de Falsam, je vais le relire X fois et essayer de bien comprendre :wink:
Falsam a écrit :Bon ok c'est nul mais ça détend....
C'est malin j'avais déjà pris des notes :? :lol:

Peut être aussi une réorganisation entre les integer, long, les strings, etc...dans la même structure qui ne se ferait pas pareil entre le C et Pure... :?:
C'est bizzare, pour une fois que FRED y se la joue perso .... 8O

Re: #PB_Structure_AlignC ???

Publié : mer. 08/juil./2015 15:10
par Mesa
Je viens juste de trouver une autre application à #PB_Structure_AlignC, sur cette page http://www.purebasic.fr/english/viewtop ... 13&t=62549

Un code qui fait flasher une fenêtre réduite qui fonctionnait en x86 mais pas en 64 bits. Julian a redéfini une structure pour l'utiliser en 64b en ajoutant #PB_Structure_AlignC et le code s'est mis à fonctionner aussi bien en 32b qu'en 64b.

M.

Re: #PB_Structure_AlignC ???

Publié : mer. 08/juil./2015 15:34
par majikeyric
L'alignement des champs est fait par rapport aux adresses mémoires.

Si align 1, les champs sont les uns derrière les autres, sans alignement (ce qui correspond à l'alignement du C aussi normalement)
Si Align 2, chaque champ commence sur une adresse mémoire paire

Code : Tout sélectionner

Structure toto Align 2
	a.a
	b.b
EndStructure

Define s.toto
Debug @s\a ; -> adresse paire
Debug @s\b ; -> adresse paire
si align 4, chaque champ commence à une adresse qui est un multiple de 4

Les instructions ASM en fonction des différents modes d'adressage peuvent mettre plus de temps pour accéder à une adresse mémoire impaire plutôt qu'à une paire. C'est pour cela qu'on cherche à optimiser l'arrangement d'une structure.

Re: #PB_Structure_AlignC ???

Publié : jeu. 09/juil./2015 8:27
par Kwai chang caine
Incroyable cette histoire de nombre pair ou pas , ou de par x 8O

Je me doutais que la réponse serait plus puissante que mon niveau, mais ça m'intriguait trop cette ligne sans vouloir en connaître un peu plus.

Merci Majikeyric 8)

Re: #PB_Structure_AlignC ???

Publié : jeu. 09/juil./2015 11:42
par crisot
C'est exactement ça, les CPU peuvent être beaucoup plus lents à aller lire/ecrire une adresse alignée sur 16 bits que sur 32. A l'extrême j'ai même souvenir que certains CPU en seront incapables (PowerPC) mais ça reste rarissime (et je veux pas dire de bêtises).

C'est pas quelque chose de naturel quand on a jamais touché à l'ASM :-)

Re: #PB_Structure_AlignC ???

Publié : jeu. 09/juil./2015 12:23
par Kwai chang caine
Restera à savoir quand faut allignerc et quand il faut pas
Si c'est dangereux d'alignerC si c'est pas nécessaire. .
Et ben...moi qui commençais à comprendre les structures :|

Bon l'alignementC je vais le ranger dans (Expression GRomesque :wink: ) "le tiroir à" j'maitrise pas

L'avantage du copier coller...c'est qu'on est sur de pas se tromper :mrgreen: :oops:

En tout cas encore merci de vos explications 8)

Re: #PB_Structure_AlignC ???

Publié : jeu. 09/juil./2015 12:53
par crisot
Le seul risque (à ma connaissance) c'est juste de consommer un peu de mémoire supplémentaire.

Re: #PB_Structure_AlignC ???

Publié : jeu. 09/juil./2015 13:03
par falsam
Et surtout si tu ne fais pas appel à une dll écrite en C ou coder un DLL qui sera appelé par un programme en C faisant référence à cette structure, alors tu peux omettre ce paramétre.

Re: #PB_Structure_AlignC ???

Publié : jeu. 09/juil./2015 16:43
par Anonyme2
Salut KCC :D

Ca fait toujours plaisir de lire ta prose 8)

tout a été dit, l'alignement pour la vitesse est le critère.

Ensuite vient la position des éléments dans la structure et dans la réalité ce sont des adresses.

Si tu code en PB sans API ou sans dll etc. écrite en C, cela ne cause pas de problème.
Mais tu peux aligner toutes tes structures si tu le souhaites.

Par contre l'alignement (padding) est obligatoire si tu travailles avec les API MS.
Purebasic a beaucoup de structures déjà déclarées, donc pas de problème.


Voici La structure LV_COLUMN, on peut l'utiliser en 32 ou 64 bits, pas de problème Purebasic a fait l'alignement.

Code : Tout sélectionner

LV_COLUMN en 64 bits déclaré dans PB
Structure LV_COLUMN
      mask.l
      fmt.l
      cx.l
      PB_Alignment.b[4]
      *pszText
      cchTextMax.l
      iSubItem.l
      iImage.l
      iOrder.l
      cxMin.l
      cxDefault.l
      cxIdeal.l
EndStructure


LV_COLUMN en 32 bits déclaré dans PB
Structure LV_COLUMN
      mask.l
      fmt.l
      cx.l
      *pszText
      cchTextMax.l
      iSubItem.l
      iImage.l
      iOrder.l
      cxMin.l
      cxDefault.l
      cxIdeal.l
EndStructure
Tu remarques en 64 bits, il y a un alignement avant d'arriver au pointeur *pszText afin d'obtenir un multiple de 8 pour arriver à l'adresse du pointeur sinon on a l'adresse de base + 12 au lieu de +16 d'où l'alignement de 4 octets PB_Alignment.b[4]

Re: #PB_Structure_AlignC ???

Publié : jeu. 09/juil./2015 19:31
par nico
L'exemple de Falsam est un mauvais exemple, car la structure proposée est déjà aligné en 32 bit et compatible 64 bit car les 32 bits manquants sont rajoutés à la fin de la structure.

Voici un autre exemple plus parlant:

Code : Tout sélectionner

Structure test
  a.b
  b.l
EndStructure


Structure test2 Align #PB_Structure_AlignC
  a.b
  b.l
EndStructure


Debug "Structure Size " + SizeOf(test)

Debug "Structure Size " + SizeOf(test2)

Re: #PB_Structure_AlignC ???

Publié : jeu. 09/juil./2015 21:49
par Kwai chang caine
@Denis
Moi aussi ca me fait plaisir de voir "ta pomme" avec "baibise inside" :D

Ayaiiii cette fois, je commence à comprendre, avec le coups des 4 bits

@Nico
Content de te causer aussi...on se croirait presque dans le temps une reunion d'anciens 8)
Je testerai ton exemple sur un pc ...android aime pas notre pb, mais il me donne la chance de vous lire dans toutes les pièces, toutes les occasions et toutes les positions :mrgreen:

Merci à vous deux d'essayer à votre tour de générer une activité dans le bout de mou qui me sert de cerveau

Je vous souhaite une bonne soirée