...someplace, where there isn't any trouble? Do you suppose there is such a place, Toto?

Integer Swapping ohne temporäre Variable

Kürzlich bin ich beim kursorischen Durchkucken der Sourcen eines Kollegen auf ein Makro gestoßen, das die Werte zweier Integervariablen vertauschen soll. Die Implementation sah in etwa folgendermaßen aus:

#define SWAP(a,b,type){type iIdunno = a; a=b; b=iIdunno;}

und wurde beispielsweise so angewendet:

  int i1 = rand();
  int i2 = rand();
  PrintValues(i1, i2);
  SWAP(i1, i2, int);
  PrintValues(i1, i2);

Diese naive Implementation muss nicht unbedingt die beste sein. Will man beispielsweise die temporäre Variable vermeiden und ein universelles Makro ohne Angabe des Typs haben, kann man auch drei aufeinanderfolgene XOR-Operation ausführen:

#define SWAP(a,b){a^=b;b^=a;a^=b;}

Je nachdem, wie schnell eine XOR-Operation im Vergleich zu einer MOV Operation auf dem gegebenen Prozessor ist (also wieviele Maschinenzyklen gebraucht werden) und wieviele Bytes die jeweiligen Instruktionen an Code brauchen, kann es sein, daß diese Implementation auch schneller ist oder kleineren Code erzeugt. Und man muß natürlich wirklich auch den jeweiligen Assemblercode anschauen, zu dem der Compiler den C-Code optimiert, um beurteilen zu können, was die schnellere Methode ist. Auf den alten 8088-Prozesooren war der XOR IIRC schneller als ein MOV, weshalb das durchaus von Vorteil war. Und natürlich ist sowas auch nur wirklich interessant in einer innermost Loop - und aus rein akademischen Gesichtspunkten :-).

Trackback address for this post

This is a captcha-picture. It is used to prevent mass-access by robots.
Please enter the characters from the image above. (case insensitive)

No feedback yet

Comments are closed for this post.