Re: Jak to v C++ napsat líp?
Jan Waclawek
konfera na efton.sk
Čtvrtek Srpen 31 11:25:10 CEST 2023
Ved pisem, zavisi od rocnika gcc a optimalizacie. Pouzil som avr-gcc 8.0 z
roku 2017 a -Os a prelozilo mi to podla ocakavania, bez FLASH a bez nul:
16 0000 81E4 ldi r24,lo8(65)
17 0002 92E4 ldi r25,lo8(66)
18 0004 9093 0000 sts A+1,r25
19 0008 8093 0000 sts A,r24
20 000c 83E4 ldi r24,lo8(67)
21 000e 94E4 ldi r25,lo8(68)
22 0010 9093 0000 sts A+2+1,r25
23 0014 8093 0000 sts A+2,r24
Akurat ze to mam zle, lebo je opacne endian... :-)
Takze by to muselo byt
A[0] = *(int*)"BA";
A[1] = *(int*)"DC";
>nenasype normalne do pole char/uint8_t pomoci memcpy...
memcpy() tiez stoji a pada na stupni optimalizacie, pokojne moze prekladac
vygenerovat inicializovane pole do RAM (t.j. je tam aj nula, a je
zapratana nielen FLASH ale aj RAM) a zavolat memcpy(). Konkretne
horeuvedeny prekladac vygeneroval "len" string vo FLASH a odoptimalizoval
memcpy():
8 .section .rodata.str1.1,"aMS", na progbits,1
9 .LC0:
10 0000 4241 4443 .string "BADC"
10 00
11 .section .text.startup,"ax", na progbits
12 .global main
14 main:
15 /* prologue: function */
16 /* frame size = 0 */
17 /* stack size = 0 */
18 .L__stack_usage = 0
19 0000 8091 0000 lds r24,.LC0
20 0004 9091 0000 lds r25,.LC0+1
21 0008 A091 0000 lds r26,.LC0+2
22 000c B091 0000 lds r27,.LC0+3
23 0010 8093 0000 sts A,r24
24 0014 9093 0000 sts A+1,r25
25 0018 A093 0000 sts A+2,r26
26 001c B093 0000 sts A+3,r27
27 .L2:
28 0020 00C0 rjmp .L2
Vsimnite si, ze znova kvoli endianite bolo treba pouzit
memcpy((unsigned char *)A, "BADC", 4);
co znova je otazne, ci je lepsie alebo citatelnejsie nez original.
wek
----- Original Message ---------------
>A jako bonus bude mit flash zabranou zbytecnymi nulami...
>Stejne uplne nechapu, k cemu je takova konstrukce dobra a proc se to
>nenasype normalne do pole char/uint8_t pomoci memcpy...
>
>Dne 31.08.2023 v 11:12 Jan Waclawek napsal(a):
>> "Lepsie" a "zrozumitelne" je relativne.
>>
>> Je
>>
>> A[0] = *(int*)"AB";
>> A[1] = *(int*)"CD";
>>
>> lepsie ci zrozumitelnejsie?
>>
>> A tiez je otazne, aky rocnik gcc pouzivate v tom arduine a s akymi
>> optimalizaciami, od toho zavisi, aky paskvil z toho prelozi.
>>
>> wek
>>
>> ----- Original Message ---------------
>>
>>
>>> Mám pole
>>>
>>> int A[2];
>>>
>>> potřebuji do něj ale vloµit čtyři znaky ABCD. Vymyslel jsem
>>>
>>> A[0] = ('A' << 8) | 'B';
>>> A[1] = ('C' << 8) | 'D';
>>>
>>> nejde to nějak líp? Toto funguje, ale je to docela nesrozumitelné.
>>>
>>> --
>>>
>>> Martin Záruba
>>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>_______________________________________________
>HW-list mailing list - sponsored by www.HW.cz
>Hw-list na list.hw.cz
>http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list