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