# [C] Elemente eines Arrays effizient vertauschen?



## trench140 (9. Juni 2008)

Mahlzeit,

habe hier ein uint32_t-Array mit 64 Werten. Diese muss ich nun in einer bestimmten Reihenfolge vertauschen. Der ganz naive Ansatz wäre nun, mir einfach ein neues Array der gleichen Größe zu definieren, und die Elemente an die neuen Stellen zu kopieren.
Der nächst-naive Ansatz ist, dass ich mir eine Hilfsvariable definiere in diese ein Element schreibe, dann die folgenden drei Elemente tausche und dann den Wert an die vierte Position zurückschreibe (etwa von dieser Art ist die Vertauschung nämlich).

Das ganze soll nun aber möglichst effizient implementiert werden, daher stellt sich mir die Frage, ob ich irgendwas mit Pointer machen kann, so dass ich nicht immer die kompletten Werte rumkopieren muss. Leider habe ich hiervon kaum eine Ahnung, könnte mir da vielleicht jemand helfen?

Gruß,
Trench


----------



## Mickeyman (9. Juni 2008)

Abend,
es mit Zeigern zu lösen scheint meiner Meinung nach nicht unbedingt sinnvoll, da ein Zeiger genauso groß ist, wie ein Integer. Du könntest allerdings auch einfach nur den Index in einem zusätzlichen Array speichern, wodurch du weniger Speicher benötigst(char).

Gruß Mickeyman.


----------



## Flegmon (9. Juni 2008)

Wenn es dir wirklich um starkes optimieren geht dann würde ich es mal mit Inline Assembler versuchen.

Folgendes Beispiel habe ich von  http://www.it-academy.cc/article/889/InlineAssembler(x86)+in+C+C++.html


```
int var1 = 3, var2 = 4;
_asm
{
	mov  eax,var1
	xchg eax,var2
	mov  var1,eax
}
```

Das tauscht var1 mit var2 aus und das ohne dabei eine Variable zum Zwischenspeichern zu benötigen, weil direkt mit den Prozessorregistern gearbeitet wird.
Ich weiß nicht inwieweit sich das auf Arrays übertragen lässt aber ich denke schon dass das möglich sein sollte.

NACHTRAG: je nach Compiler kann es sein dass du den Assembler Code anders angeben musst.

zB. beim GCC


```
asm("assembly code");
```


----------

