[C] Porten (memmove)

Pagina: 1
Acties:

  • traviandus
  • Registratie: Februari 2001
  • Laatst online: 25-03-2025
Ik probeer een stukje C code (geschreven voor BSD Unix) aan de praat te krijgen onder VC++. Nu gaat dat vrij aardig, alleen 1 regel kom ik niet uit:

code:
1
2
3
4
5
6
    register unsigned char *cp;
    if ((int) cp & 3) {
            if (len > 0)
                memmove((int) cp & ~3, cp, len);
            cp = (unsigned char *) ((int) cp & ~3);
    }


Het gaat om die regel memmove.

Deze memmove was in de oorspronkelijke code OVBCOPY:
The macro OVBCOPY(src, dst, amt) is used to copy when src and dst overlap (i.e., when doing the 4-byte alignment copy).
De compiler geeft de volgende foutmelding:
error C2664: 'memmove' : cannot convert parameter 1 from 'int' to 'void *'.
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Eigenlijk snap ik de foutmelding wel, maar ik kan hem niet oplossen omdat ik niet weet wat de schrijver van de code bedoeld heeft met de betreffende regel. Misschien dat iemand dit ziet?

De complete code is te vinden in RFC 1144.

  • Quitter3
  • Registratie: Januari 2001
  • Laatst online: 13-02 16:30
Memmove vraagt om een pointer. Jij cast de pointer *cp om naar een int:
(int) cp waarna je de AND doet.
Ik denk dat je de uitkomst na de AND weer terug moet casten naar een pointer.
Misschien zo: Memmove(Char*((int) cp & 3), cp, len);

  • traviandus
  • Registratie: Februari 2001
  • Laatst online: 25-03-2025
Het compiled in ieder geval wel.. :)

Maar waar het voor dient?
Hm wacht. Volgens mij kun je op deze manier schuiven met geheugen. Ik denk dat ik em snap..

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:38
Hij maakt van de bovenste bits van cp een pointer die hij gebruikt om een stuk geheugen te kopieren.

Dat doet hij alleen als tenminste een van de de onderste drie bits hoog is.

Omdat cp een register variabele is kan deze waarschijnlijk aangepast worden door de hardware waarvoor het programma geschreven is.

[ Voor 5% gewijzigd door farlane op 06-02-2003 11:51 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Kwestie van goed casten lijkt me he... :)

>memmove((void *)((int) cp & ~3), cp, len);

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Nog even over de bedoeling van deze code: de code alignt de pointer cp op 64 bits als deze niet aligned is.

Als data goed aligned is is het lezen en schrijven ervan sneller, maar een redelijke compiler/library/runtime etc. zal automatisch je data al goed alignen, dus dit soort code heeft niet zoveel zin (het veroorzaakt voornamelijk verwarring, zoals je ziet).

Vooral voorbeeldcode lijkt me een vreemde plaats voor dit soort optimalisaties.

Verwijderd

Yup, premature optimization == the root of all evil :)

En voor zover ik weet hield zelfs de memmove van m'n ouwe Watcom-compiler al rekening met alignment..
Zou'k niet zelf meer doen.
Pagina: 1