Annonces Google
Serveur IRC
Serveur : irc.portlane.se
Canal : #AmigaNG
Activité du Site

Pages vues depuis 25/07/2007 : 33 736 084

  • Nb. de membres 193
  • Nb. d'articles 1 329
  • Nb. de forums 19
  • Nb. de sujets 20
  • Nb. de critiques 24

Top 10  Statistiques

Index du forum »»  Création-Développement »» Langage C : les unions et l'optimisation

Langage C : les unions et l'optimisation

3 Modérateur(s)
K-LElwoodcorto
corto cortoicon_post
@thellier Oui, ça ne changerait pas l'assembleur, c'est juste que je trouve que :

pix.r = 0x66;  ou pix.red = 0x66;

est plus lisible que :

pix.B.ARGB[1] = 0x66;


A propos d'assembleur, avec des processeurs comme le PowerPC (et ses instructions de type "rotate left and mask") si tu manipules la valeur 32 bits (qui est dans un registre du CPU) alors lire ou écrire une des composantes ne prendra qu'un seul cycle.

thellier thelliericon_post
Soir'
>Et lire la composante rouge avec : pixel.r
Oui tout à fait meme si au final ça changera rien sur l'ASM généré

>une division par 2 alors qu'une multiplication par 0.5 c'est plus rapide
a) le >>1 est plus rapide qu'un (vrai) /2

b) ici c'est des entiers (UBYTE = unsigned byte = entier 8 bits signé) donc pas possible de faire * 0.5 avec un nombre sans virgule
Sauf si on le convertit mais là on perd notre optimisation

>Ton code me paraissait faux à cause [...] tableau non initialisé.

Il est vrai qu'il est pas intialisé mais bon si j'écrivais tout le code pour récupérer un pointeur sur les pixels de l'écran proprement depuis le système .... on serait pas rendu :-P
C'est un exemple abstrait

>car non déclaré comme pointeur sur un tableau.

Je le redis une fois de plus "en C un pointeur et un tableau à une dimension sont fondamentalement la meme chose lors de leur utilisation"
Si vous avez appris qque chose de différent à la fac alors votre prof parlait sans comprendre l'ASM ;-P

Ainsi pt[0].ARGB32 et pt->ARGB32 sont en fait la meme chose une fois compilee
Une fois assimilée ceci n'importe qui peut comprendre ce qu'est un pointeur


Alain





Sam440 - Sam460 - X5000 - PowerBookG4 - WinUAE - MiniMig
corto cortoicon_post
Même si on mettait "/ 2", le compilateur génèrerait un shift de 1 bit.

Sinon, tu peux même aller plus loin avec les unions, et c'est plus lisible :

union rgba3D{
ULONG argb32;
struct {
                UBYTE a;
                UBYTE r;
                UBYTE g;
                UBYTE b;
        };
};

Ainsi tu peux faire : pixel.argb32 = 0xaabbccdd;
Et lire la composante rouge avec : pixel.r

J'utilise ça pour manipuler des registres système (avec en plus des champs de bits dans la struct interne :-D )

Message édité par : corto / 19-01-2017 17:24
Olrick Olrickicon_post
Citation: YesCop 

Alain,
Ton code me paraissait faux à cause de pt[n], car non déclaré comme pointeur sur un tableau et non initialisé.

Vois [] comme un opérateur d'accès appliqué à un pointeur sur un type et pas comme une notation dédiée à un type tableau.
pt[n] te renvoie le n + 1 ième élément de type (union rgba3D) à partir de l'adresse contenue dans pt.
pt == &pt[0]
#NUL!
sadirux sadiruxicon_post
Si je ne dit pas de bétise, l'opérateur >> correspond à un décalage de bit, c'est une autre façon de faire une division et il s'agit à ma connaissance de méthode la plus rapide pour faire une division.

merci de me corriger si je me trompe :)
YesCop YesCopicon_post
Sinirus,
En fait ce n'est pas considéré comme une divsion mais un décalage de bits beaucoup plus rapide qu'une multiplication.
C'est pourquoi tu vois dans les sources des lignes comme a>>4 plutôt que a/16.

Alain,
Ton code me paraissait faux à cause de pt[n], car non déclaré comme pointeur sur un tableau et non initialisé.
D'après ce que tu as écrit, le compilateur compile comme tu le veux mais le fera-t'il à chaque fois indépendamment du compilateur et/ou de sa version?

Sam Flex 800 Mhz Amiga OS4.1 FE
sinisrus sinisrusicon_post
@Thellier

Pourquoi faire une division par 2 alors qu'une multiplication par 0.5 c'est plus rapide (les divisions sont à évité le plus possible)
--
Coin coin... amitheme.amiga-ng.org
Sam460 1,15Ghz - OS4.1FE - Radeon RX550 - 2Go de ram
Sharynn Sharynnicon_post
Super intéressant !!!

Merci pour cette manip !!


Projet AmOS4 - Retour vers l'Amos sous OS4...

SAM440EP - A1200 3.1 de base
thellier thelliericon_post

Ooouuups tu as tout a fait raison c'étais un >> (une division par 2) que je voulais mettre et non pas un >

L'idée c'est additionner les 2 couleurs (de valeur entre 0 et 255) puis diviser par 2 pour retomber sur une valeur entre 0 et 255 qui tienne à nouveau dans un UBYTE

Au final on a juste une lecture 32bits et une écriture 32 bits à la fin et les autres opérations entre ces deux accès se font sur les registres sans accès mémoire

A noter l'utilisation du pointeur "comme un tableau" en faisant pt[n]. dont on peut espérer que la conversion en assembleur (la compilation quoi) donnera un accès 32 bits indexé par un registre 

du genre

pix.L.ARGB32=pt[n].L.ARGB32;

qui donnerait  en 68000

MOVE.L D1, $0(A1, D0.L)  

ou un truc similaire en PPC


Alain



 

Sam440 - Sam460 - X5000 - PowerBookG4 - WinUAE - MiniMig
sadirux sadiruxicon_post
Je débute en C, du coup j'ai bien lu un passage sur les Union, mais je content d'en voir un exemple concret :) merci pour ce bout de code ! Même si je ne sais pas pourquoi tu additionnes la couleur primaire d'un pixel pour voir si elle est supérieur à 1 (attention, il est fort possible que je ne comprenne pas ta boucle) ;)


Petites Annonces

0 annonce(s) publiée(s)

Consulter

AmigaOS 4.1

Laissez-vous tenter par
AmigaOS 4.1
AmiTheme

AmiTheme