Forum: Compiler & IDEs Was bedeutet "__builtin_alloca" ???


von Bert (Gast)


Lesenswert?

Ist das ein Standard-Makro oder sowas?

von Rolf Magnus (Gast)


Lesenswert?

Wie der Name schon sagt, ist es eine einebaute Version von alloca. Warum 
interessiert dich das?

von Bert (Gast)


Lesenswert?

ich hab das hier gefunden:
1
ethernetbuffer = (unsigned char*) __builtin_alloca (( size_t )
2
 ETHERNET_HEADER_LENGTH + IP_HEADER_LENGHT + UDP_HEADER_LENGHT +
3
 Datalenght );

gibts das alloca_ nur für AVR?

Kann ich das irgendwie rausnehmen?

von Karl H. (kbuchegg)


Lesenswert?

Bert wrote:
>
> ich hab das hier gefunden:
>
>
1
> ethernetbuffer = (unsigned char*) __builtin_alloca (( size_t )
2
> ETHERNET_HEADER_LENGTH + IP_HEADER_LENGHT + UDP_HEADER_LENGHT +
3
> Datalenght );
4
>
>
> gibts das alloca_ nur für AVR?
>
> Kann ich das irgendwie rausnehmen?

Das kommt jetzt auf den Zusammenhang an. Aber ein
1
  ethernetbuffer = alloca( ( size_t ) ETHERNET_HEADER_LENGTH +
2
  IP_HEADER_LENGHT + UDP_HEADER_LENGHT + Datalenght );

sollte das eigentlich ersetzen können.
Wenn alle Stricke reissen, muesste man sich die Funktion in der
das eingesetzt wird ansehen und entscheiden ob ein Ersatz mit
malloc vernünfitg machbar ist.

von Rolf Magnus (Gast)


Lesenswert?

1
ethernetbuffer = (unsigned char*) __builtin_alloca (( size_t )
2
     ETHERNET_HEADER_LENGTH + IP_HEADER_LENGHT + UDP_HEADER_LENGHT +
3
     Datalenght );

Keine Ahnung, wozu das gut sein soll. Eigentlich sollte man alloca 
verwenden. Der Compiler bzw. der Standardheader entscheidet dann, welche 
Implementation tatsächlich verwendet wird.

> gibts das alloca_ nur für AVR?

alloca ist eine nicht-Standard-Funktion, die aber sehr weit verbreitet 
ist. Es funktioniert wie malloc, aber nimmt den Speicher für lokale 
Variablen (also üblicherweise Stack).

> Kann ich das irgendwie rausnehmen?

Du könntest es als C99 übersetzen. Dann kannst du den Aufruf ersetzen 
durch ein Array mit variabler Länge. Aber warum willst du das 
rausnehmen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

alloca() ist mittlerweile (aber noch nicht in einem Release) auch
in der avr-libc ,,offiziell'' deklariert.

Die Deklaration lautet:
1
extern void *alloca(size_t);

von Bert (Gast)


Lesenswert?

Hallo,

ich muss das malloc oder alloc irgendwie ersetzen, da mein 
Fujitsu-Compiler damit nicht klar kommt.

Oder ich schreibe ihm die Definition selbst. Wo genau ist malloc mal 
definiert?

von Karl H. (kbuchegg)


Lesenswert?

Bert wrote:
> Hallo,
>
> ich muss das malloc oder alloc irgendwie ersetzen, da mein
> Fujitsu-Compiler damit nicht klar kommt.
>
> Oder ich schreibe ihm die Definition selbst. Wo genau ist malloc mal
> definiert?


Im K&R gaabs früher mal eine malloc Implementierung. Ob sie
in der jetzt aktuellen AUsgabe immer noch drinnen ist, weiss
ich nicht.

Wenn du aber so fragen musst, dann vergiss das gleich wieder.
Einen malloc schreibt man nicht einfach so zwischen halb 12 und
Mittag.

Was genau bedeutet: "damit nicht klar kommt"?

von Bert (Gast)


Lesenswert?

Ich weis nicht genau ob es daran liegt, aber ich kann es mir denken.

Das gehört alles zu einem UDP-Sende-Projekt.
Es funktioniert mit dem AVR ohen Probleme, lade ich aber den Code auf 
einen Fujitsu, so entsteht eine Lücke im Ethernet-Frame (an der stelle 
der IP-Checksumme, die wird einfach übergangen). Dadurch verfälscht der 
komplette Frame.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bert wrote:

> ich muss das malloc oder alloc irgendwie ersetzen, da mein
> Fujitsu-Compiler damit nicht klar kommt.

Dann bist du hier im falschen Forum...

Wenn dein Fujitsu-Compiler wenigstens Arrays variabler Länge (als
lokale Variable) kann, dann kannst du das alloca() dadurch
ersetzen.  Siehe Rolf Magnus ganz oben, ist ein C99-Fietscher.

Wenn er das nicht kann, bleibt dir eigentlich nur noch, das Array
mit der größtmöglichen anzunehmenden Größe zu definieren.

von Simon K. (simon) Benutzerseite


Lesenswert?

In meiner K&R Version ist übrigens das Malloc-Beispiel (noch?) drin. 
Tolle Sache ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.