30

Ca remplace avantageusement les variables globales en section de code. Au moins là, c'est séparé. Il y aurait une section réservée pour ça, j'aurais pas à le faire.

31

C'est certes efficace, mais ça reste un abus des stack frames. wink (Cela dit, l'utilisation prévue n'est en général pas avantageuse, cf. -fomit-frame-pointer.)

Les désavantages d'un stack frame global sont les mêmes que ceux d'autres formes de variables globales: ce n'est pas modulaire (n'importe quelle fonction peut les modifier à n'importe quel moment), les fonctions récursives n'ont qu'une seule copie des variables etc.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

32

Kevin Kofler (./31) :
Cela dit, l'utilisation prévue n'est en général pas avantageuse, cf. -fomit-frame-pointer

pencil
Kevin Kofler (./31) :
n'importe quelle fonction peut les modifier à n'importe quel moment

D'un autre côté, si on veut de l'encapsulation, il faut pas faire de l'assembleur. A moins de programmer de manière complètement fonctionnelle, mais autant faire du C à ce moment-là. On perd sinon tout le bénéfice de la puissance de l'asm.
Kevin Kofler (./31) :
les fonctions récursives n'ont qu'une seule copie des variables etc.

Rien n'empêche d'utiliser un stack frame local à ce moment.

Cf là, l'évaluateur d'expression de mon assembleur, récursif évidemment :
;==================================================================
;	Eval
;------------------------------------------------------------------
; 	Evaluate an operand, an operator and an expression
;
;	input	a0	*expression
;		d0.l	operand
;		d1.w	operator
;	output	d0.l	value
;		a0	*first char after the expression
;	destroy	std
;------------------------------------------------------------------
;	Algo
;
;IMM Eval( IMM, OP, EXPR )
;
;Decompose( EXPR )					Create IMM2, OP2, EXPR2
;
;If OP2 == 0						No operator ?
;	OP( IMM, IMM2 )					So its just an operation do to
;Else
;	If OP >= OP2					Else if priority( OP1 ) > Priority( OP2 )
;		IMM3 = OP( IMM, IMM2 )			First perform the OP stuff
;		Eval( IMM3, OP2, EXPR2* )		Then evaluate the end of the expression
;	Else
;		OP( IMM, Eval( IMM2, OP2, EXPR2* ))	Else evaluate first the end of the expression,
;							then perform the OP stuff
;==================================================================

rah poutée faut que je m'y remette lovelovelove