abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

včera 22:22 | Komunita

V Norimberku probíhá do neděle 28. května openSUSE Conference 2017. Na programu je celá řada zajímavých přednášek. Sledovat je lze online. K dispozici jsou také videozáznamy (YouTube) již proběhnuvších přednášek. Dění lze sledovat na Twitteru.

Ladislav Hagara | Komentářů: 0
včera 11:33 | IT novinky

Red Hat kupuje společnost Codenvy stojící za stejnojmenným webovým (cloudovým) integrovaným vývojovým prostředím (WIDE) postaveném na Eclipse Che.

Ladislav Hagara | Komentářů: 0
včera 08:55 | Nová verze

V listopadu 2014 byl představen fork Debianu bez systemd pojmenovaný Devuan. Po dva a půl roce jeho vývojáři oznámili vydání první stabilní verze 1.0. Jedná se o verzi s dlouhodobou podporou (LTS) a její kódové jméno je Jessie, podle planetky s katalogovým číslem 10 464.

Ladislav Hagara | Komentářů: 8
25.5. 20:22 | Zajímavý článek

Nadace Raspberry Pi vydala již osmapadesáté číslo (pdf) stostránkového anglicky psaného časopisu MagPi věnovanému Raspberry Pi a projektům postaveným na tomto jednodeskovém počítači a druhé číslo (pdf) časopisu Hello World primárně určeného pro učitele informatiky a výpočetní techniky.

Ladislav Hagara | Komentářů: 0
25.5. 19:55 | Humor

Portál Stack Overflow informuje na svém blogu, že pomohl ukončit editor Vim už více než milionu vývojářů. V loňském roce například hledal odpověď na otázku Jak ukončit editor Vim v průměru 1 z 20 000 návštěvníků.

Ladislav Hagara | Komentářů: 10
25.5. 19:22 | Nová verze

Po pěti měsících od vydání verze 3.5.0 byla vydána nová stabilní verze 3.6.0, tj. první z nové řady 3.6, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie). Z novinek lze zmínit například podporu dvou nových 64bitových platforem little-endian POWER machines (ppc64le) a IBM z Systems (s390x) nebo nové balíčky Rust 1.17.0, Cargo 0.18.0, GHC 8.0.2 a Julia 0.5.2.

Ladislav Hagara | Komentářů: 0
24.5. 21:33 | Bezpečnostní upozornění

V Sambě byla nalezena a opravena bezpečnostní chyba CVE-2017-7494. Má-li útočník právo ukládat soubory na vzdálený server, může tam uložit připravenou sdílenou knihovnu a přinutit smbd server k jejímu načtení a tím pádem ke spuštění libovolných příkazů. Chyba je opravena v upstream verzích 4.6.4, 4.5.10 a 4.4.14. Chyba se týká všech verzí Samby od verze 3.5.0 vydané 1. března 2010.

Ladislav Hagara | Komentářů: 7
24.5. 20:44 | Nová verze

Byla vydána nová stabilní verze 4.3.0 integrovaného vývojového prostředí (IDE) Qt Creator. Z novinek lze zmínit například integraci editoru kódu do Qt Quick Designeru.

Ladislav Hagara | Komentářů: 1
24.5. 20:11 | Bezpečnostní upozornění

Společnost Check Point informuje na svém blogu o novém vektoru útoku. Pomocí titulků lze útočit na multimediální přehrávače VLC, Kodi, Popcorn Time, Stremio a pravděpodobně i další. Otevření útočníkem připraveného souboru s titulky v neaktualizovaném multimediálním přehrávači může vést ke spuštění libovolných příkazů pod právy uživatele. Ukázka na YouTube. Chyba je opravena v Kodi 17.2 nebo ve VLC 2.2.6.

Ladislav Hagara | Komentářů: 11
23.5. 15:18 | Zajímavý software

CrossOver, komerční produkt založený na Wine, je dnes (23. 5. 2017) dostupný ve slevě. Roční předplatné linuxové verze vyjde s kódem TWENTYONE na $21, resp. $1 v případě IP z chudších zemí. Firma CodeWeavers, která CrossOver vyvíjí, významně přispívá do Wine. Přidaná hodnota CrossOver spočívá v přívětivějším uživatelském rozhraní, integraci do desktopu a podpoře.

Fluttershy, yay! | Komentářů: 27
Chystáte se pořídit CPU AMD Ryzen?
 (6%)
 (32%)
 (1%)
 (8%)
 (44%)
 (9%)
Celkem 623 hlasů
 Komentářů: 62, poslední 19.5. 01:57
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Dotaz: Jakasi magie pri dynamickem alokovani pameti [C++]

    Bundas avatar 30.8.2014 20:01 Bundas | skóre: 14 | Pardubice
    Jakasi magie pri dynamickem alokovani pameti [C++]
    Přečteno: 946×
    Jakto, ze tohle:
    using namespace std;
    
    int main()
    {
        int n = 7;
        int *slova2 = new int[n];
        slova2[0] += 23;
        slova2[0] += 32;
        cout << slova2[0] << endl;
        return 0;
    }
    
    na vystupu vyhodi pokazde random cislo? Treba tohle: 6230608
    Abe the Messiah has come.

    Řešení dotazu:


    Odpovědi

    Řešení 4× (Murry, Bundas (tazatel), rADOn, Vojtěch Trefný)
    Josef Kufner avatar 30.8.2014 20:05 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Protože čteš neinicializovanou paměť na 3. řádku v těla main() operátorem +=.
    Hello world ! Segmentation fault (core dumped)
    8.9.2014 11:30 lofcek
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Presne tak .. suvisi to s tym, ze nepoznate zaklady. Premenne v C su defaultne neinicialovane - co znamena slova2 = new int[n], naalokuje 7 prvkov. Ale nikto vam nezaruci, aku hodnotu ma slova2[0], slova2[1] .. atd. Zvysok programu uz len k neznamenu cislu pripocita 55 a vypisuje.
    8.9.2014 11:37 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Premenne v C su defaultne neinicialovane

    Jen pro pořádek: tohle není C. Takže přesnější vysvětlení je, že typ int nemá defaultní konstruktor, který by hodnotu inicializoval.

    8.9.2014 12:15 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Premenne v C su defaultne neinicialovane

    A pro úplnost: tohle ani není obecně pravda.

    8.9.2014 16:05 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]

    A pro úplnost:

    V C jsou static a „globální“ proměnné inicializované (zjednodušeně na 0).

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    9.9.2014 13:32 lertimir | skóre: 60 | blog: Par_slov
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Možná není na škodu očekávat vždy a všude neinicializované proměnné. Já se tímto řídím už 30 let ve všech jazycích, které jsem používal, (Algol, FORTRAN, Basic, Ada, Pascal, C, C++, perl, python, php, java, javascript, co si pamatuji). To že to inciální přiřazení má člověk explicitně zapsané v kódu mu dá jistotu, že , co v proměnné je. A to nejen při psaní, ale zvláště po čase, kdy si nad kódem říká: Sakra co jsem tím myslel. A duplicita takového přiřazení v případě, že to jazyk dělá sám je zanedbatelná.
    9.9.2014 15:39 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]

    Nic než souhlas(, nesouhlasil bych s „povinnou“ inicializací při deklaraci ;)).

    Přemýšlet nad tím jinak v C(/C++) je vždy kravina, bo tam je to nebo to(, ne ‚a‘), a „auto inicializace“ v těchto specifických případech je tam tak nějak z pohledu programátora navíc.

    static int i = 0;
    
    je to samé(, nebo by mělo být) co
    static int i;
    bo „auto inicializace“ se děje jen v 2. případě.
    u:
    static int i;
    i = 0;
    
    už může být incicializace (bez optimalizace) 2×.

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    10.9.2014 09:01 Sten
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Není to to samé.
    static int i;
    Tohle tu proměnnou vytvoří vynulovanou při startu programu a pak už s ní nic nedělá.
    static int i = 0;
    Tohle tu proměnnou nastaví ještě jednou při inicializaci statických proměnných v dané kompilační jednotce. Tedy pokud jiná statická inicializace z jiné kompilační jednotky tu hodnotu změní, tohle ji může a nemusí přepsat (protože pořadí statických inicializací mezi kompilačními jednotkami není definované).

    To první se využívá u nifty counteru.
    10.9.2014 09:16 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Tedy pokud jiná statická inicializace z jiné kompilační jednotky tu hodnotu změní

    Ta proměnná je static, takže ji z jiné kompilační jednotky z definice přepsat nemůžete.

    10.9.2014 21:01 Sten
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Pravda, není to vlastně static member.
    11.9.2014 00:19 ebik | skóre: 2
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Kdyz pouzijes nejake bloky co maji __attribute__((constructor)), tak ty se mohou provest drive nez inicializace globalni staticke promenne. Svanda je, z takoveho bloku zavolat funkci, ktera pristupuje ke globalni staticke promenne, a predpoklada, ze je naicializovana. Co hur, v C++ u globalnich statickych objektu typicky predpoklada, ze se provedl konstruktor.

    Rozlisovani ruznych typu konstruktoru a pretizeni operatoru = v C++ je pak kapitola sama o sobe.
    11.9.2014 00:22 ebik | skóre: 2
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Můžete ale z jiné kompilační jednotky zavolat funkci, která k té proměnné přistupuje (a třeba ji přepisuje). To se v C udělá zavoláním z bloku s __attribute__((constructor)) a v na to staci C++ proste volani z konstruktoru globalniho statickeho objektu.
    11.9.2014 00:23 ebik | skóre: 2
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    ... a v C++ n to staci ...
    11.9.2014 08:40 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Pominu-li, že __attribute__((constructor)) je GCC specific (není to standard), tak se stejně provádí až po inicializací static proměnných, nepletu-li se.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    10.9.2014 12:41 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]

    Jak?

    Jsem přesvědčen, že ty zápisy jsou identické a gcc generuje identický kód.

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    11.9.2014 23:22 Sten
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Tak jsem si prošel standard a je to takto:
    1. Prvně se provede zero inicializace
    2. Poté se provede konstantová inicializace; standard dovoluje tohle spojit s předchozím
    3. Nakonec se provede inicializace výrazy a tady nastává problém, protože není definováno pořadí
    Takže v C se to stát nemůže, protože nezná inicializaci výrazy (pokud pominu __attribute__((constructor))).

    Ale aby to nebylo tak snadné, tak konstantová inicializace se provádí jen compile-time konstantami, tj. literály či constexpry, nikoliv const proměnnými. Ten problém, co jsem měl, byl právě použití constu k inicializaci na 0 (v pre-C++11 jsem měl nullptr nadefinovaný jako const).
    12.9.2014 14:52 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Jsem si myslel, a nechce se mi to hledat, že 1. je tak, že inicializace static se má dít v jednom kroku a buď se inicializuje na „0“, nebo na hodnotu, která je při deklaraci explicitně uvedena a const tam nehraje žádnou roli.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    12.9.2014 16:58 Sten
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Nikoliv inicializace proměnné, která je const, ale inicializace proměnné hodnotou jiné proměnné, která je const.
    10.9.2014 19:10 lertimir | skóre: 60 | blog: Par_slov
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Já to téměř vždy dělal tím 3. způsobem. Právě proto, že takto mi to umožní každý jazyk, dostanu tím oddělený kus kodu
    // inicializace promměných
    i=0;
    ...
    // konec inicializace
    po kterém vím, že všechny proměnné musí mít hodnotu. A jak jsem říkal, ten řádek kódu navíc mi nevadil ani v dobách Fortranu, děrných štíků a mainframu s 256 kB operační paměti, natož dnes.
    11.9.2014 08:27 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Blbé je, když je to právě static a, tak máš inicializace dvě, jedna při deklaraci a druhá při tvé inicializaci. Asi to v 99% případech nevadí, ale já když to vím, tak mě to žere…
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    11.9.2014 16:19 lertimir | skóre: 60 | blog: Par_slov
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    :-) To máš pravdu. Je to síla zvyku. Ale to víš, FORTRANský programátor může psát aritmetické IF v jakémkoliv jazyce. :-) (A odkaz pro ty, co neví, co je artimetické IF)
    11.9.2014 19:54 Op
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Mám pocit, že s tou dvojí inicializací příliš podceňuješ inteligenci dnešních kompilátorů.
    12.9.2014 14:29 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]

    Mám pocit, že moc věříš optimalizaci, která by, dle mého, mohla být nad rámec povoleného.

    Zatímco s static int j = 0; a static int j; gcc generuje identický kód, s static j; j = 0; již jiný/delší (nenamáhám se to disasemblovat, stačí fstat a md5sum).

    Zkus si:

    //use: gcc -O3 test.c -o test && md5sum ./test
    //cygwin use: gcc -O3 test.c -o test.exe && md5sum ./test
    
    #include <stdio.h>
    #include <limits.h>
    
    int main(){
      int iii = INT_MAX;
      /* 1. --- explicit --- */
      static int i = 0;
      /* ---------------- */
      
      /* 2. --- implicit --- */
      //static int i;
      /* ---------------- */
      
      /* 3. ---- twice ---- */
      //static int i;
      //i = 1;
      /* ---------------- */
      
      printf("%d",iii - i);
      return 0;
    }
    

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    12.9.2014 15:49 ebik | skóre: 2
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    O tom ze 3. je jine nez 1. a 2. snad nepochybuje nikdo. main() je totiz funkce jako kazda jina, 3. /musi/ nastavit "i" pri /kazdem/ zavolani. (A v pripade 3 nedava moc velky smysl mit takovou promennou jako statickou. Snad jen ze nebude na zasobniku, nebo kdyz bude nekdo vymyslet reentrant detection.)

    Myslim, ze predrecnici se bavili o optimalizaci v pripade nestatickych lokalnich promennych.
    12.9.2014 16:08 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]

    O tom ze 3. je jine nez 1. a 2. snad nepochybuje…
    No a o tom to právě je, že jsou tam ty dvě inicializace, které nemohou/by neměly být při kompilaci optimalizovány, i když by to v tomto případě, nemělo žádný faktický dopad.

    Myslim, ze predrecnici se bavili o optimalizaci v pripade nestatickych lokalnich promennych.
    Co to?, mně přijde, že se bavíme o static od začátku, a pak píšu právě o static a na to je reakce o podcenění optimalizace.

    PS: Ad. pochyby o smyslu, on ten příklad nedává smysl ani jako celek, to je častý úděl moc krátkých příkladů. Tak si představ, že je tam nějaké if a fce se volá opakovaně.

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    12.9.2014 22:38 ebik | skóre: 2
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Omlouvam se, myslel jsem jeste na jine veci, a cetl jsem jiz jen par poslednich prispevku, mate samozrejme pravdu ze o static se jedna.

    Co se tyce disasemblovani, tak na produkty gcc lze spustit objdump. Tim se napriklad zjisti, ze standardni elf na linuxu inicializuje lokalni staticke promenne (C) nactenim sekce .data do pameti. Tedy stara se o to elf loader a nikoli program samotny. Take se tim zjisti, ze "static int foo = 12;" se vubec nikam neulozi, pokud se do te lokalni promenne foo nikdy nezapise. Tedy kompilator to zoptimalizuje jako konstantu.
    11.9.2014 19:28 kuka
    Rozbalit Rozbalit vše Re: Jakasi magie pri dynamickem alokovani pameti [C++]
    Jestlize uvadis javu, tak tam je toto antipattern. Pokud se ponecha neinicializovana (plati pro lokalni promennou), kompilator vyhodi chybu, pokud by se v tomto stavu pouzila. Tim se odchyti pripady, kdy ucelem bylo hodnotu pozdeji naplnit smysluplne (napriklad vekem cloveka), ale v kodu je chyba, treba if vetveni nepokryva vsechny pripady apod. Pokud si tam dam inicialne 0, tak se mi to prelozi a zavola s nulou, coz jsem nechtel.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.