Výsledky 1 až 9 z 9

Téma: [C#] struct vs. class

  1. #1

    Standardní [C#] struct vs. class

    Ahoj,
    pri cteni dat ze souboru se slozitou strukturou nacitam data do obektu typu struct. Predavam li tato data prostrednictvim metody jinemu objektu, pouzivam klicove slovo ref resp. out. Chci tim docilit toho, aby se data nekopirovala, ale predavala odkazem. Nejsem si ale jisty tim, jestli to delam spravne a jestli to je dostatecne rychle v porovnani s promennymi neulozenymi ve strukture, ale volne ve tride. Ma smysl slucovat souvisejici data do struktury?

  2. #2

    Standardní Re: [C#] struct vs. class

    Urcite ma, budou u sebe i v pameti. Kdyz udelas tridu:
    class Trida
    {
    string polozka1;
    string polozka2;
    }

    Tak tyto dve polozky mohou byt kazda uplne jinde v pameti -> pokud k obema chces pristoupit, tak budes muset pravdepodobne nacist minimalne 2 stranky z pameti, oproti tomu kdyz bys to mel v strukture tak oba stringy se vesly do 1 pametove stranky.

    EDIT: zkousel jsem ti hrat se strukturama a prisel jsem na jednu podivnou vlastnost:
    Kód:
      interface intr
            {
                void udelej();
            }
            struct data : intr
            {
                public string polozka;
                public int pocet;
                public void udelej()
                {
                    polozka = "aaaaaaaaaaaaaaa";
                }
            }
    Kdyz vsak napisu:
    Kód:
               data a = new data();
               intr p = a;
               p.udelej();
    Tak se NEzmeni obsah struktury a!
    Naposledy upravil MEluZíNa; 11.12.2007 v 20:44.
    GigaByte GA-M55plus-S3G --- A64 3200+ @ 24oo ~ 1,375V BOX --- 2x512 Geil 667 CL4 @ 980 CL5 --- WD2500KS --- Acer AL1721ms --- 1/1 MBit/s via WiFi
    Blog

    09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 aneb jeste ze ty "ochrany" programujou rozumny lidi :]

  3. #3

    Standardní Re: [C#] struct vs. class

    Ahoj,
    diky za radu. Priznam se, ze jsem nikdy nepremyslel nad tim, kde jsou v pameti data ulozena. Co se tyka tveho problemu, tak jsem jeste nevidel, aby struktura implementovala rozhrani, i kdyz to asi mozne je. A co je "a"? Take struktura? Pouzils keyword "new"?

    Jeste poznamka k te strukture. Nekde jsem cetl, ze by ve strukture nemelo byt moc dat. Kdyz jich je vice, melo by se prejit na tridu. Je to pravda?
    Naposledy upravil Optim; 11.12.2007 v 18:13.

  4. #4

    Standardní Re: [C#] struct vs. class

    Jo, muj haluz priklad je neuplnej, upravil jsem ho. Promenna a je samozrejme struktura data.


    No myslim, ze velikost struktury by nemela byt vetsi nez velikost stranky(vetsinou 4KB), protoze pak bys vlastne kdykoli chces zmenit byt je jediny bit, tak (asi?)musis nacist celou strukturu, tedy vic stranek. Ale to uz jsou jenom moje domnenky

    Mozna to bude jeste horsi, ze budes muset mit celou strukturu v registrech procesoru, takze to bude jeste radove min ~ 16bajtu... (vim ze registru je vic, ale prece jednou strkturou nezplacame vsechny registry...)
    Naposledy upravil MEluZíNa; 11.12.2007 v 21:16.
    GigaByte GA-M55plus-S3G --- A64 3200+ @ 24oo ~ 1,375V BOX --- 2x512 Geil 667 CL4 @ 980 CL5 --- WD2500KS --- Acer AL1721ms --- 1/1 MBit/s via WiFi
    Blog

    09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 aneb jeste ze ty "ochrany" programujou rozumny lidi :]

  5. #5

    Standardní Re: [C#] struct vs. class

    No asi bych vám spíš než místo dohadů doporučil na tohle nějakou teorii ohledně psaní překladačů (struktura je většinou jen počáteční adresa a pak kompiler dodává offsety podle prvků).

    Navíc mi přijde trošku zcestné porovnávat tyhle 2 věci v managed jazyku.. Který je vlastně interpretovaný přes Virtual Machine a ta to provádí jak to páni programátoři naprogramovali..

    Stručně a jednoduše, ty zdržení vás dnes štvát vážně nemusí

    Jinak správná odpověď na rozdíl mezi třídou a strukturou v C++ v testu z předmětu programování v jazyce C++ na ČVUT, bylo že struktura má defaultně vše public . V jazyku C jsou to jen obyčejné balíčky dat.

    Reálná interpretace musí být tedy v překladači pak vlastně stejná jako class. Jen defaultně je uvnitř vše private.

    Navíc řešíte vážně blbost. V prasáckém kódu rozdíl struct a class určitě nepoznáte. Zdržení a prodlevy se hromadí úplně někde jinde. A jestli to někdo změří těším se na výsledky .

    Jinak asi z historických důvodů se používá taková Best practice, že Struct je prostě jen datový kontejner (dnes vlastně něco jako Java Bean, jelikož Java struct nemá) a class je balík dat a operace s ním spojeným.

  6. #6

    Standardní Re: [C#] struct vs. class

    struktura v C# sa od triedy lisia hlavne tym, ze je to hodnotovy typ t.j nachadza sa v zasobniku zatial co trieda je referencny typ ulozeny v halde

    vzhladom na to, ze struktura je hodnotovy typ priradenim A=B, dochadza ku kopirovaniu celeho obsahu strukturu, u triedy sa kopiruje len odkaz t.j. pouzitim stuktury dochadza k poklesu vykonu, ktory je zavisly od velkosti struktury
    => struktury je vhodne pouzivat pre male datove typy kvoli zvyseniu vykonu(vyhradenie pamati na zasobniku je rychle)

    samozrejme pouzitim ref bude odovzdana len adresa t.j. bude to rovnako rychle ako v pripade triedy
    Naposledy upravil mkmt; 12.12.2007 v 07:26.

  7. #7

    Standardní Re: [C#] struct vs. class

    Diky za postrehy. Struct je samozrejme hodnotovy typ a proto je pri predavani kopirovan, coz vede k poklesu vykonu. Meluzina uvadi zajimavy postreh o strankovani a maximalni velikosti 16 bajtu na strukturu. Myslim ze neni daleko od pravdy. Nekde jsem to myslim take cetl. To je ale hodne malo mista ze? Tak akorat na 4x int32.

    Jeste se zeptam jinak. Jak byste postupovali pri ukladani dat z nejakeho binarniho souboru s mnoha (zakladnimi) datovymi typy? Vytvorili byste kvuli tomu struct, anebo byste ukladali primo do tridy? (zrejme otazka stylu, ale stejne me to docela zajima)

  8. #8

    Standardní Re: [C#] struct vs. class

    no ze soboru, databaze ci neceho podobneho bych pouzival asi struct. A ty objekty pojmenoval ObjektTO (Transport Object) a po nacteni bych to prevedl (prekopiroval) na normalni tridu a zacal stim delat pozadovane operace.
    Přirozená inteligence bude zřejmě brzy překonána inteligencí umělou, avšak přirozenou blbost umělá nikdy překonat nedokáže.

  9. #9

    Standardní Re: [C#] struct vs. class

    Appleman Dan, Moving to VB .NET: Strategies, Concepts and Code

    Malý výcuc z jedné kapitoly

    Struktrury jsou hodnotový typ a jsou alokovány v zásobníku nebo v datové oblasti. Mají proto rychlejší alokaci. Navíc protože nejsou v haldě, tak nepodléhají garbage collectoru, což taky (trochu) zdržuje.
    Takže podle zmíněné knihy mají být používány pro malé "objekty" skládající se z číselných hodnot. Například komplexní číslo nebo souřadnice. Je chybou do nich dávat referenční objekty, tedy reference na objekty, protože tím se předchozí výhody ztratí. Mít členem struktury například String (referenční typ) prý není dobré.

    A ještě jedna důležitá věc. Když máš strukturu např.

    Kód:
    Public Structure Souradnice
        Private  memX As Double
        Private  memY As Double
     
        'Tady by byly Public Property x() As Double a y() As Double
     
     
        Dim pocatek As Souradnice = New Souradnice()
        Dim konec As Souradnice = New Souradnice()
     
        pocatek.x = 5
        pocatek.y = 10
     
        konec = pocatek    'v konec jsou stejne hodnoty jako v pocatek
     
        konec.x = -5
        konec.y = -10
        'Ted jsou v pocatek i konec rozdilne hodnoty
    Prostě se opravdu chovají jako hodnotové typy, to jest kopírují se OBSAHY struktur, ne odkazy jako u referenčních proměnných. Kdyby to byla třída, tak po konec = pocatek by obě ukazovaly na stejné objekt a následné konec.x a konec.y by změnilo hodnoty i pro pocatek. Tohle je IMHO důležité vědět.

    Edit: Teď si uvědomuju, že jsem to napsal ve VB a ne v C#, ale snad je to i tak srozumitelné.
    Naposledy upravil Warran; 17.12.2007 v 09:00.

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Podobná témata

  1. MPlayer, problem s video driverem
    Založil Lopan v sekci fóra Operační systémy na bázi Unixu
    Odpovědí: 34
    Poslední příspěvek: 19.12.2006, 12:05
  2. Traffic shaping - problem s markovanim
    Založil CompCrasher v sekci fóra Sítě
    Odpovědí: 5
    Poslední příspěvek: 07.08.2005, 15:48
  3. Mandrake 10
    Založil jama v sekci fóra Operační systémy na bázi Unixu
    Odpovědí: 57
    Poslední příspěvek: 06.01.2005, 16:36
  4. MS VS .Net a Class v Dll
    Založil Lunatic v sekci fóra Programování
    Odpovědí: 1
    Poslední příspěvek: 19.11.2004, 15:19
  5. Odpovědí: 8
    Poslední příspěvek: 12.06.2004, 09:23

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •