Detailfrage zur cdecl

15/04/2008 - 06:30 von Jan Bruns | Report spam
Hallo allerseits.

Ich habe mal eine Detailfrage zur Verwendung der cdecl.

Zunàchst mal: habe ich es überhaupt richtig in Erinnerung, daß man in C
Werte-parameter in einer Funktion nicht direkt modifizieren kann/darf?

Unabhàngig davon gilt es ja als wesentliches Merkmal der cdecl, daß
daß vom Aufrufer auf den Stack gelegte Parameter auch vom Aufrufer wieder
entfernt werden.

Die Frage ist nun, ob ein C-Compiler in einer Funktion prinzipiell die auf
dem Stack liegenden Werte veràndern darf (also bspw. lokale Variablen
dort speichern darf, wenn dies nicht mit der Parameterbenutzung interferiert).

Mir ist klar, daß diese Frage nicht wirklich etwas mit C zu tun hat, weil
das ein implementationsspezifisches Detail ist, das möglicherweise auch
vom Zielsystem abhàngt.

Aber vielleicht könnt ihr mal mitteilen, ob die folgende Funktion nun
mit euren Compilern eher Platz für etwas mehr als 10 oder doch gut 20
Werte proŽRekursion auf dem STack anlegt:

int first;
int last;

void teststackusage(int a,b,c,d,e,f,g,h,i,j)
{ int q=a+1;
int r=b+1;
int s=c+1;
int t=d+1;
int u=e+1;
int v=f+1;
int w=g+1;
int x=h+1;
int y=i+1;
int z=j+1;
if (a==0) { first = &a; };
if (a==maxwert) { last = &a; };
irgendeine_externe_funktion(&q,&r,&s,&t,&u,&v,&w,&x,&y,&z); // um Optimierungen zu vermeiden
if (a<maxwert) { teststackusage(q,r,s,t,u,v,w,x,y,z) };
};

Sind sich alle C compiler diesbezglich einig?

Noch eine Frage an Leute, die sich auch mal ansehen, was für Code der Compiler letzlich
produziert hat: War jemals zu sehen, daß ein Compiler nach einem cdecl-Funktionsaufruf
von unverànderten Werteparametern ausgegangen ist (bspw. um einen weiteren Funktionsaufruf
mit àhnlichen Parametern zu machen)?

Gruss

Jan Bruns
 

Lesen sie die antworten

#1 Bernd Nawothnig
15/04/2008 - 07:19 | Warnen spam
On 2008-04-15, Jan Bruns wrote:

Ich habe mal eine Detailfrage zur Verwendung der cdecl.

Zunàchst mal: habe ich es überhaupt richtig in Erinnerung, daß man
in C Werte-parameter in einer Funktion nicht direkt modifizieren
kann/darf?



Das hast Du nicht richtig in Erinnerung. Die darf man natürlich
modifizieren. Sie verhalten sich genau wie lokale Variablen.

Unabhàngig davon gilt es ja als wesentliches Merkmal der cdecl, daß
daß vom Aufrufer auf den Stack gelegte Parameter auch vom Aufrufer
wieder entfernt werden.



Davon merkst Du aber als Programmierer in aller Regel nichts (außer,
dass cdecl etwas mehr Codegröße als Pascal-Konvention [die Funktion
ràumt auf] produziert). Nur lassen sich Funktionen wie printf kaum
anders realisieren, wenn man sie nicht als Compilermakro
implementiert.

Die Frage ist nun, ob ein C-Compiler in einer Funktion prinzipiell
die auf dem Stack liegenden Werte veràndern darf (also bspw. lokale
Variablen dort speichern darf, wenn dies nicht mit der
Parameterbenutzung interferiert).



Vermutlich, denn Du würdest davon ja nichts bemerken.

Mir ist klar, daß diese Frage nicht wirklich etwas mit C zu tun hat,
weil das ein implementationsspezifisches Detail ist, das
möglicherweise auch vom Zielsystem abhàngt.

Aber vielleicht könnt ihr mal mitteilen, ob die folgende Funktion
nun mit euren Compilern eher Platz für etwas mehr als 10 oder doch
gut 20 Werte pro´Rekursion auf dem STack anlegt:

int first;
int last;

void teststackusage(int a,b,c,d,e,f,g,h,i,j)
{ int q=a+1;
int r=b+1;
int s=c+1;
int t=d+1;
int u=e+1;
int v=f+1;
int w=g+1;
int x=h+1;
int y=i+1;
int z=j+1;
if (a==0) { first = &a; };
if (a==maxwert) { last = &a; };
irgendeine_externe_funktion(&q,&r,&s,&t,&u,&v,&w,&x,&y,&z); // um Optimierungen zu vermeiden
if (a<maxwert) { teststackusage(q,r,s,t,u,v,w,x,y,z) };
};

Sind sich alle C compiler diesbezglich einig?



Und wenn sie es wàren, so könntest Du Dich keinesfalls darauf
verlassen. Parameter können z.B. auch über Register übergeben werden,
wenn das ohne die Logik des Programms zu àndern, möglich ist. Gut,
geht hier wegen Rekursion natürlich nicht, aber der Compiler hat da
weitestgehende Freiheit.

Nebenbei kannst Du in obigem Beispiel aber auch die Adressen der
Parameter an irgendeine_externe_funktion direkt übergeben, denn
Werteparameter verhalten sich da, wie gesagt, genau wie lokale
Variablen.

Noch eine Frage an Leute, die sich auch mal ansehen, was für Code
der Compiler letzlich produziert hat: War jemals zu sehen, daß ein
Compiler nach einem cdecl-Funktionsaufruf von unverànderten
Werteparametern ausgegangen ist (bspw. um einen weiteren
Funktionsaufruf mit àhnlichen Parametern zu machen)?



Du stellst aber auch Fragen - darf man dem Hintergrund erfahren?



Bernd

Lösen wir die ganze Küste
Von dem Odem dürrer Brüste,
Von den Augen ohne Mut!
[Friedrich Nietzsche]

Ähnliche fragen