Envoyé par
guillemouze
! Surtout que ce sont des record, donc pas compatibles avec un registre. Sauf que ce sont des pointeurs qui sont reellement passés, donc ils sont bien mis dans les registres.
C'est effectivement curieux, faudrait voir le comportement si tu modifies les record dans ton create !
Parce que normalement, c'est un passage par valeur, donc si tu modifies à l'intérieur cela n'altère pas la valeur après la fonction, un système de Copy-On-Write ? Non, il y a que pour la String !!!
ou une compilation avec optimisation assez brutale ! Et c'est limite flippant !
ou alors tu nous cache, un const en mot clé dans le TMonChamp.Create ?
Et cela me semblerait bien plus cohérent !
@sjrd, si tu passes par là ...
C'est quoi un "record longs" dans "Les chaînes courtes, variants, tableaux et record longs, bien que plus grands que 4 octets, sont transmis par adresse, et entrent donc bien dans les registres" extrait du tutoriel
record longs => sizeof(record) > 4 octets ?
C'est pas si long que ça alors ! ça ne fait que 32 bits
Car perso, j'ai une grosse différence entre
1 2 3 4
| struct TMonRecord
{
int prop1; // step + 1
}; |
Mise en Registre ! OK !
1 2 3 4 5 6
| struct TMonRecord
{
double prop1; // step + 1
double prop2; // step + 0.1
double prop3; // step + 0.01
}; |
void __fastcall Affiche(TMonRecord i1, TMonRecord i2, TMonRecord i3, TMonRecord i4, TMonRecord i5, TMonRecord i6)
Et je n'ai plus de mise en registre !!! Oups ! Une Théorie qui s'envole !
1 2 3 4 5 6
| 1 1.1 1.01
2 1.2 1.02
3 1.3 1.03
4 1.4 1.04
5 1.5 1.05
6 1.6 1.06 |
void __fastcall Affiche(const TMonRecord &i1, const TMonRecord &i2, const TMonRecord &i3, const TMonRecord &i4, const TMonRecord &i5, const TMonRecord &i6)
Mise en Registre ! OK ! le mot clé const en delphi donne le même résultat que le passage par const référence
1 2 3 4 5 6 7
|
6 1.6 1.06
5 1.5 1.05
4 1.4 1.04
1 1.1 1.01
2 1.2 1.02
3 1.3 1.03 |
je suis en C++Builder mais __fastcall c'est le register pour compatibilité VCL !
On devrait avoir le même résultat !
Refais ton test avec la bonne structure !
Avec un type stockable sur 4 octets, cela peut fausser le test !
Effectivement, c'est tout à fait le genre de code où je vais mettre des variables temporaires ! En fait non, en me connaissant, j'aurais plutôt une méthode TMonChamp.LoadFromStream ou LoadFromSerializer qui appelerait successivement les deux ReadMonRecord !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| procedure TMonObjet.Load(ASerializer: TSerializer);
begin
FMonChamp := TMonChamp.Create();
FMonChamp.Load(ASerializer);
end;
procedure TMonChamp.Load(ASerializer: TSerializer);
begin
ReadMonRecord(FMonChamp.r1, ASerializer);
ReadMonRecord(FMonChamp.r2, ASerializer);
end;
procedure ReadMonRecord(var AMonRecord: TMonRecord; ASerializer: TSerializer);
begin
AMonRecord.prop1 := ASerializer.ReadFloat;
AMonRecord.prop2 := ASerializer.ReadFloat;
AMonRecord.prop3 := ASerializer.ReadFloat;
end; |
Surtout que je suppose que tu as un autre constructeur de TMonChamp qui initialize des valeurs par défaut lorsque fais la toute 1ere saisie !?
Moi, ça fait bien longtemps que je ne fais plus de fonction de sérialization, un objet qui héritent de TComponent, des propriétés publiées et nos amis ReadComponent\WriteComponent\ObjectTextToBinary\ObjectBinaryToText
Tu ne poses plus aucune question, c'est pas léger mais bien efficace !
Sinon, c'est de la DB et mes objets encapsule des DataSet !
Partager