-Wstrict-aliasing

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

-Wstrict-aliasing

OdgovorNapisal/-a Kroko » 03 Feb 2017, 11:14

Zaradi težave, ki bi jo z lahkoto opazil, če bi imel vklopljen -Wsequence-point sem se malce poglobil v ostala opozorila.

-Wstrict-aliasing je zanimiv. Opozorilo dobim, ko naredim tole:
Koda: Izberi vse
*(uint32_t*)(&data[512]) = number;


Na prvi pogled ni z kodo nič narobe. Pa je res vse OK?

Kar zgrozil sem se, ko sem našel tole:
http://cellperformance.beyond3d.com/art ... asing.html

Z drugimi besedami - poglavje 10 v tilz0R-jevi pointer šoli je povsem narobe.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a VolkD » 03 Feb 2017, 11:28

Kroko je napisal/-a:Na prvi pogled ni z kodo nič narobe. Pa je res vse OK?
Jaz ne najdem nič narobe. Bolj kot gledam, manj mi je jasno kaj mi ni jasno. :shock:

Mi je pa jasno, da je treba imet warninge prižgane in da jih je treba tudi prebrat. Če se stvar joka, da si nekaj definiral in nisi uporabil v redu, ostalo pa ???
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41597
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9015 krat
Prejel zahvalo: 5132 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a peterp » 03 Feb 2017, 11:31

Kroko, lahko podaš minimalen programček za test?
Zadnjič spremenil peterp, dne 03 Feb 2017, 11:37, skupaj popravljeno 2 krat.
peterp
 
Prispevkov: 657
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 164 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 114

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 03 Feb 2017, 11:34

Poskusi tole funkcijo:

Koda: Izberi vse
swap_words( uint32_t arg )
 {
   uint16_t* const sp = (uint16_t*)&arg;
   uint16_t        hi = sp[0];
   uint16_t        lo = sp[1];
   
   sp[1] = hi;
   sp[0] = lo;
 
   return (arg);
 }

Povedano preprosto:
Cast med različnimi tipi je nedefiniran. To pomeni, da ne bo nujno delalo tako, kot si predstavljamo.

Na to temo so se razpisali tudi tule:
http://blog.qt.io/blog/2011/06/10/type- ... -aliasing/
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a peterp » 03 Feb 2017, 11:37

Prvi primer s funkcijo swap_words() iz linka čisto lepo deluje brez opozoril pri prevajanju.

Ne pozabiti da je članek iz leta 2006 is se je vmes pri prevajalnikih marsikaj spremenilo (beri so postali pametnejši).
peterp
 
Prispevkov: 657
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 164 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 114

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 03 Feb 2017, 11:40

Ali lahko poskusiš z -O2 ali -O3 in pa seveda -std=gnu99
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a peterp » 03 Feb 2017, 11:46

Koda: Izberi vse
~/tmp$ gcc -O3 -Wall -std=gnu99 test.c -o test && ./test
t1: 00001234  t2: 12340000

~/tmp$ gcc -O2 -Wall -std=gnu99 test.c -o test && ./test
t1: 00001234  t2: 12340000

~/tmp$ gcc     -Wall -std=gnu99 test.c -o test && ./test
t1: 00001234  t2: 12340000


Predvidevam, da gre samo za razliko med little-endian in big-endian arhitekturo.
peterp
 
Prispevkov: 657
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 164 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 114

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 03 Feb 2017, 12:06

Čakej mal Kroko, kaj?? Ne razumem..kaj ni definirano?
Čist si me zmedel sedaj.

Točno to, little-big endian in nič drugega (za moje pojme).
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a peterp » 03 Feb 2017, 12:14

Ok, tole je pa sedaj drugače če uporabim -Wstrict-aliasing=1
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html Level 1: Most aggressive, quick, least accurate.

Koda: Izberi vse
~/tmp$ gcc -O3 -Wall -std=gnu99 -Wstrict-aliasing=1 test.c -o test && ./test
test.c: In function 'swap_words':
test.c:23:3: warning: dereferencing type-punned pointer might break strict-aliasing rules [-Wstrict-aliasing]
   uint16_t* const sp = (uint16_t*)&arg;
   ^
t1: 00001234  t2: 12340000
peterp
 
Prispevkov: 657
Pridružen: 23 Feb 2015, 14:52
Kraj: Maribor
Zahvalil se je: 164 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 114

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 03 Feb 2017, 12:44

Problem je zelo lepo razložen tule:
http://blog.regehr.org/archives/1307

Bi bilo zanimivo narediti test, koliko -fno-strict-aliasing flag vpliva na hitrost.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a MitjaN » 03 Feb 2017, 21:31

Glavni problem type-aliasinga je, da je taka koda neprenosljiva. Ne samo med različnimi arhitekturami ampak tudi znotraj arhitekture med različnimi prevajalniki. Saj verjetno bo delalo ampak ne moreš na to računati.

Poleg tega kode ne moreš testirati na PC-ju in jo potem zagnati na čem drugem.

Še ena razlaga istega problema http://blog.qt.io/blog/2011/06/10/type-punning-and-strict-aliasing/ (samo začetni del dokler se ne potopijo v bolj kompleksne primere)
MitjaN
 
Prispevkov: 88
Pridružen: 24 Feb 2015, 12:45
Zahvalil se je: 10 krat
Prejel zahvalo: 36 krat
Uporabnika povabil: aly
Število neizkoriščenih povabil: 7

Re: -Wstrict-aliasing

OdgovorNapisal/-a zanka » 03 Feb 2017, 22:15

Zaradi takšnih čarovnij
Koda: Izberi vse
float f;
int z;
z = *(int *)f

je že raketa dol padla.
Uporabniški avatar
zanka
 
Prispevkov: 2569
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 113 krat
Prejel zahvalo: 254 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 50

Re: -Wstrict-aliasing

OdgovorNapisal/-a VolkD » 03 Feb 2017, 23:06

zanka je napisal/-a:je že raketa dol padla.
Res je, Ariane.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 41597
Pridružen: 29 Dec 2014, 20:49
Kraj: Kačiče (Divača)
Zahvalil se je: 9015 krat
Prejel zahvalo: 5132 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 03 Feb 2017, 23:09

Tu ne gre samo za čarovnije. Gre za povsem preproste stvari kot je tole:
Koda: Izberi vse
uint8_t data[1024];
uint32_t number = *(uint32_t*)(&data[512]);
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 20 Apr 2017, 12:40

Castina česarkoli na void* in kasneje iz void* na karkoli je povsem veljaven stavek, tudi strict-alliasing nebo jokal.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a zanka » 20 Apr 2017, 13:15

Samo potem prevajalnik izgubi nekaj moči, da bi ti povedal, da si kaj naredil narobe.

Zaradi mene imaš lahko vse spremenljivke void *, samo potem si si sam kriv, če si se kje zatipkal.
Koda: Izberi vse
#include <stdio.h>
int main()
{
   int i = 0;
  void *ptr_i = (void *)&i;
  (*(int *)ptr_i)++;
  printf("i=%i\n", *(int *)ptr_i);
   return 0;
}

Pa tudi vprašanje, koliko optimizacij bo potem sploh še sposoben. Ampak kolikor vidim, gcc z -O3 lepo nastavi kar vrednost 1. Brez optimizacij pa telovadi s kazalci.
Uporabniški avatar
zanka
 
Prispevkov: 2569
Pridružen: 17 Mar 2016, 01:16
Zahvalil se je: 113 krat
Prejel zahvalo: 254 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 50

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 20 Apr 2017, 13:28

Cast česarkoli na void* in kasneje iz void* na karkoli je povsem veljaven stavek, tudi strict-alliasing nebo jokal.

Samo že sta "česarkoli" in "karkoli" enaka tipa.

Koda: Izberi vse
int x = 123456789;
void * helper = (void *)&x;
short *y = (short *)helper;
*y = 42;

The above will probably work (emphasis on probably), but the results are undefined.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 20 Apr 2017, 13:39

Dejmo v tem primeru definirat "undefined" behavior. Kaj bi šlo lahko narobe?

To ni čist res, Kroko, kar si povedal.
Imejmo primer sledečih funkcij: C standardna fread in FATFS f_read sprejmeta array, kamor shranita podatke, kot void*.
V notranjosti se ta void* preslika v unsigned char*.

Rezultat bo vedno ok, ne gleda na to, ali sem od zunaj dal spremelljivko (ali array) tipa float, int, double, nevem kaj.

In glede na to, da fread (C implementacija, naredili so jo ljudje ki vedo kaj delajo) uporablja tako, potem ne vidim težav, da nebi delali VEDNO.

Koda: Izberi vse
uint32_t array[5];

//Dela oboje, ni potrebno (void *) spredaj castat, ker se void* automatsko nastavi.
//Razen v C++, tam je potrebno uporabiti zgornji example.
f_read((void *)array, sizeof(array), ....);
f_read(array, sizeof(array), ....);

//Array ima po 4 byte skupaj, 5 elementov = 20 bytov celote.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 20 Apr 2017, 14:38

Koda: Izberi vse
V notranjosti se ta void* preslika v unsigned char*

char* nima omejitev glede aliasinga.

Kar sem povedal je povsem res.

Ne vem, kaj pri besedi "undefined" ti ni jasno.
ISO standard for the C programming language specifies that it is illegal (with some exceptions) to access the same memory location using pointers of different types.

http://www.open-std.org/jtc1/sc22/wg14/ ... eV5.10.pdf

Če compiler to vseeno prevede je to naredil po svoje, na nedefiniran način.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 20 Apr 2017, 14:40

To da je "illegal" ni dovolj jasna razlaga. Kot da bi na izpitu rekel, "to se ne da". Prva zadeva bo "zakaj ne?" To, da je illegal razumem, ni pa jasne razlage zakaj. To mi ni jasno, če te zanima ;)

Vglavnem, jaz uporabljam vglavnem iz nekaj -> byte in je vse ok. Če potrebujem iz int na float naredim sledeče:

Koda: Izberi vse
union {
    int vint;
    float vflt;
} reflect;
int nekaj = 10;

reflect.vint = nekaj;
printf("%f\n", reflect.vflt); //In nimam težav z "alliasing"-om
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 20 Apr 2017, 15:10

Tudi union ne bo v redu. Ne biti presenečen če v kakšni od naslednjih verzij GCC tvoja koda ne bo več delala. Edini pravi način je, da uporabiš memcpy.

Tega si nisem jaz zmislil. Ko sem to "težavo" odkril sem bil tudi sam presenečen, potem sem o tem kaj prebral in sedaj to upoštevam.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 20 Apr 2017, 15:26

Jaz sem to začel uporabljati, ko sem videl tukaj.

Predvidevam, da dečki vedo, kaj delajo. Tudi sicer ne vem, zakaj to ni vredu. Saj unija je za memory sharing. Ampak pustimo.

Druga opcija je memcpy, čeprav nevem zakaj je to edino pravilno (saj se byti prenašajo v istem zaporedju, kot če preko unije bereš na drug tip).
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 20 Apr 2017, 15:34

tilz0R je napisal/-a:... v istem zaporedju, kot če preko unije bereš na drug tip ...

Kako pa se prenašajo byti preko unije?
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 20 Apr 2017, 20:24

še vedno nisem zadovoljen z odgovori.

Razumem, da nemoreš int* castat na short*, ker pač mogoče velikosti ne ustrezajo in bo pri big/little endian vse pokvarlo. Oz. bom drugače rekel..če nek array int pišeš nekam kot short*, in kasneje to isto narediš nazaj, torej da short bereš kot int bo rezultat isti, brez undefined behavior.

Ampak situacija z uint32_t in float pa MORA delat z unijo ali brez nje, ker sta velikosti enaki.

int: MSB, MSB-1, MSB-2, MSB-3
float: MSB, MSB-1, MSB-2, MSB-3

little endian bo v pomnilniku naredil tako:
0x00: MSB-3
0x01: MSB-2
0x02: MSB-1
0x03: MSB

big endian:
0x00: MSB
0x01: MSB-1
0x02: MSB-2
0x03: MSB-3

A so slučajno kakšne šanse, da nek procesor dela z integerji kot little endian, z floati pa kot big endian in obratno? Govorim zato, ker sqrt funkcija na linku zgoraj dela tako za Cortex-M little kot tudi big endian, ista koda. Torej to mora delat. Isti efekti kot je memory copy v tem primeru. Drugače casting v C-ju sploh nebi smisla imel.

Moj namen tega vsega je samo konstruktiven pogovor in realni/resni argumenti.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 20 Apr 2017, 21:42

Drugače casting v C-ju sploh nebi smisla imel.

Saj ravno zato sem se zgrozil, kot sem napisal ob odprtju teme.


To o čemur govoriš ti se imenuje "type punning". Preprosto povedano, namesto:
Koda: Izberi vse
bool is_negative(float x)
{
    return x < 0.0;
}

napišemo bolj učinkovito kodo takole:
Koda: Izberi vse
bool is_negative(float x)
{
    unsigned int *ui = (unsigned int *)&x;
    return *ui & 0x80000000;
}

Zadnji primer se zanaša na to, da imata tako prevajalnik kot arhitektura enak layout tako za float kot za int. Ampak tu se skriva past. Nikjer ni zagotovila, da je to tako. Zato lahko:
1. ta koda ni portabilna ker ne dela na vseh arhitekturah
2. drug prevajalnik (ali verzija) ima lahko drugačen layout saj ta ni nikjer določen.
Ne samo da ni določeno - ISO C specifikacija tak primer definira kot neveljaven (illegal). To dejstvo še posebaj postavlja pod vprašaj, kako zaneslive so trenutne implementacije. Začelo se je z preprostim warningom...

Če mene vprašaš bo to morali dogovoriti in potrditi. Ampak baje so razlogi, da tega ne naredijo.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 20 Apr 2017, 21:51

Razumem. Če sta dolžini isti bi moralo delat. Če pa nista, mora pa delat tisto, kar sem zgoraj napisal.

Sodeč po teh težavah je redko katera koda portabilna in passa ta warning.

Zame je tema zaključena.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 20 Apr 2017, 23:40

Ja saj, tole ubije tisto najlepše pri C-ju.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 20 Apr 2017, 23:43

@tilz0R
Si za MCU kdaj pisal C++ kodo? Jaz sem naredil nekaj preprostih testov in sploh ni kakšnega overheada. Je pa C++ veliko lepši od C (čeprav na prvi pogled, dokler C++ ne spoznaš, tega ni videti).
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 21 Apr 2017, 06:29

Sem pisal. Ne vem, nekako nisem bil navdušen, ker nisem vedel (4 leta nazaj nekje) kaj se dogaja zadaj v C++, ampak so compilerji itak toliko napredovali, da je verjetno isto. Pri mojem GUI projektu bi C++ vsedel izredno zaradi classov.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a Kroko » 21 Apr 2017, 09:13

Ravno zaradi tvojega GUI projekta ti priporočam C++. Objektno programiranje je kot nalašč za take projekte.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4773
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1652 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: -Wstrict-aliasing

OdgovorNapisal/-a tilz0R » 21 Apr 2017, 09:17

Kroko je napisal/-a:Ravno zaradi tvojega GUI projekta ti priporočam C++. Objektno programiranje je kot nalašč za take projekte.


Težko bi se še bolj strinjal. Sedaj moram pač skupne funkcije vseh widgetov klicat kot GUI_WIDGET_Action(widgetHandle, parameters) namesto widgetHandle.action(parameters);.

Kar se pa tiče C++ lahko rečem, da ga obvlada nekje 70-80%. Nisem še naštudiral zadnjih novosti, ker ga nisem potreboval.
Ko še to poštimam, pa mogoče počasi prešaltam tja. Iz stališča programiranja bo življenje zagotovo lepše :)

Aia, pa naj samo omenim, če bo to kdo gledal. Ne uporabljat new in delete ukazov v embedded C++.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1815
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 509 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost