Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: array mit integer initialisieren Kategorie: Programmierung C (von PeterS - 20.09.2008 16:46)
Als Antwort auf Re: array mit integer initialisieren von Bla - 20.09.2008 16:09


 Man sieht hier leider nicht viel, ich vermute der Optimizier ist an (die vielen "in" und "out" sprechen dafür)
und man sollte eine "mixed" Darstellung mit C Source ausgeben lassen. So kann ich auch nur wenig
erkennen.

Wenn man kein malloc() nehmen will, kann man bei lokalen arrays das Stackframe in Abhängigkeit
vom Ã?bergabeparameter anders allozieren. Ich vermute mal, das der Funktionscode am Anfang die
benötigte Grö�e ausrechnet, dabei auch für n dynamische arrays dann n anonyme pointer alloziert werden.
Die offsets werden dann in Abhängigkeit von den array Grö�en berechnet (hier in dem Beispiel ist es ja
nur ein Array) und danach den pointern zugewiesen. Der Array Zugriff findet dann über die pointer statt.

So würde ich das mal adhoc programmieren. Ist aber ekelig bis man das alles am Laufen hat. Da vergehen
einige Manntage.

Aber sollte ich für die nächste C-Control Pro Version etwas Luft haben, stecke ich meine Energie eher in
den Einbau von structs. Das wäre viel wichtiger.


Gruss Peter

>
> Ok mal ausprobiert. So super dynamisch ist das gar nicht.
> hier draus:
>
> void blablubb(int arraysize)
> {
>     int laber[arraysize];
>     for(int i = 0; i < arraysize; i++)
> laber[i] = i+10;
>
> }    
>
> int main(void)
> {
> blablubb(10);
>        //...
> }
>
> macht der AVR-GCC:
>
> 000002d4 :
>
>      2d4: df 93       push r29
>      2d6: cf 93       push r28
>      2d8: cd b7       in r28, 0x3d ; 61
>      2da: de b7       in r29, 0x3e ; 62
>      2dc: 9c 01       movw r18, r24
>      2de: 4d b7       in r20, 0x3d ; 61
>      2e0: 5e b7       in r21, 0x3e ; 62
>      2e2: 88 0f       add r24, r24
>      2e4: 99 1f       adc r25, r25
>      2e6: 6d b7       in r22, 0x3d ; 61
>      2e8: 7e b7       in r23, 0x3e ; 62
>      2ea: 68 1b       sub r22, r24
>      2ec: 79 0b       sbc r23, r25
>      2ee: 0f b6       in r0, 0x3f ; 63
>      2f0: f8 94       cli
>      2f2: 7e bf       out 0x3e, r23 ; 62
>      2f4: 0f be       out 0x3f, r0 ; 63
>      2f6: 6d bf       out 0x3d, r22 ; 61
>      2f8: ed b7       in r30, 0x3d ; 61
>      2fa: fe b7       in r31, 0x3e ; 62
>      2fc: 31 96       adiw r30, 0x01 ; 1
>      2fe: 80 e0       ldi r24, 0x00 ; 0
>      300: 90 e0       ldi r25, 0x00 ; 0
>      302: 04 c0       rjmp .+8       ; 0x30c
>      304: 0a 96       adiw r24, 0x0a ; 10
>      306: 81 93       st Z+, r24
>      308: 91 93       st Z+, r25
>      30a: 09 97       sbiw r24, 0x09 ; 9
>      30c: 82 17       cp r24, r18
>      30e: 93 07       cpc r25, r19
>      310: cc f3       brlt .-14     ; 0x304
>      312: 0f b6       in r0, 0x3f ; 63
>      314: f8 94       cli
>      316: 5e bf       out 0x3e, r21 ; 62
>      318: 0f be       out 0x3f, r0 ; 63
>      31a: 4d bf       out 0x3d, r20 ; 61
>      31c: cf 91       pop r28
>      31e: df 91       pop r29
>      320: 08 95       ret
>
> Also halb so wild. Der nurzt hier wohl kein malloc oder so... das säh
> anders aus.  Wenn ich das Array FIX auf 10 elemete festleg, sind nur 24 Byte weniger Code.
> Sieht eher aus als würd der das auf den Stack legen ...
> aber hab nicht so Ahnung von Asembler.
>
>
>


    Antwort schreiben


Antworten:

Re: array mit integer initialisieren (von Bla - 20.09.2008 17:09)