C++ --> C# (Pointerproblem)



  • Achso ok, wobei ich Zeiger in diesem Punkt nicht als Argument dafür nehmen würde, dass die Liste effizienter ist, da Referenzen meistens als Zeiger implementiert sind.

    Imho lässt doch aber C# zu auf C++-Code zuzugreifen (glaube aber nur DLL), aber selbst dann wäre die Frage wieso du nicht auf C++ zurückgreifst für die Liste und sie in C# benutzt?



  • Du könntest für das Element mit next-Zeiger eine struct implementieren, von einer Struct darfst Du auch einen Zeiger bilden. Und eine unsafe class, die die Liste dann kapselt und mit Zeigern auf die o.a. struct arbeitet.



  • ChrisPlusPlus schrieb:

    Ich brauche leider eine sehr performante List. Deshalb meine entscheidung für unsafe-Code!

    Des ist erstmal Quatsch, Referenzen sind Zeigen, nur eleganter verpackt, des ist durch dein unsafe net schneller als Wenn du einfach schreiben würdest:

    public class MyList
    {
        public MyList() { }
        MyList next;
        MyList previous;
    }
    


  • aber selbst dann wäre die Frage wieso du nicht auf C++ zurückgreifst für die Liste und sie in C# benutzt

    Nun, da verliere ich doch die plattformunabhängigkeit, und die möchte ich gewährleisten.

    Des ist erstmal Quatsch, Referenzen sind Zeigen, nur eleganter verpackt, des ist durch dein unsafe net schneller

    Talla und Du meinst tatsächlich, daß dadurch kein merklicher Performancegewinn möglich ist?



  • Nein, Referenzen sind in C# auch einfache Zeiger. Da gibts keinen Unterschied, nur das die sich viel leichter handhaben lassen.

    Anders siehts natürlich mit Wertetypen aus, da bräuchtest du Zeiger um z.b. ne Liste aus Structs zu implementieren.



  • Ich habe mal etwas rumprobiert und glaube, daß Referenztypen garnicht erst in einen Pointertyp gewandelt werden können.

    MyClass *tmp;
    

    Compilermeldung:
    Cannot take the address of, get the size of, or declare a pointer to a managed type ('Babtec.CaqNet.Business.Rules.Antananarivo.Unsafe.MyRefClass'



  • Die Plattformunabhängigkeit verlierst du aber nur durch die DLL, wobei es ja kein Problem ist auf einem Unix-System eine so(?)-Datei zu erstellen und diese dann zu verwenden. C# läuft eh nur auf Windows und teils auf Unix oder hat sich da etwas sehr stark getan (abgesehen von WindowsCE oder so)? C++ selbst ist ja Plattformabhängig.

    Ansonsten sehe ich das wie Talla, durch Referenzen wirst du wohl kaum an Performance verlieren. Das einzige wo evtl. unsafed von nützen sein könnte ist bei einem Sortier- und Suchverfahren (zumindest wenn es sich um Bäume handelt).



  • Ja das ist richtig. Jedoch dachte ich dass dies aus der Compilermeldung klar ersichtlich wäre 😉

    Deshalb schrieb ich in meinem vorherigen Beitrag, dass es mit structs geht und Du in der (managed) Class auf Struct-Pointern arbeiten könntest.



  • Das ist ja alles hochinteressant! Nun, bin ich auf ein weiteres ungewöhnliches Phänomen gestoßen und zwar, daß man nicht gerade viel Speicherpaltz reservieren kann.

    int copies = 200000;
    int *pSource = stackalloc int[copies];
    

    Das gibt schon einen Stackoverflow! Das sind grad mal 800 kb!!!! Das ist aber sehr schmal!



  • ChrisPlusPlus schrieb:

    Ich habe mal etwas rumprobiert und glaube, daß Referenztypen garnicht erst in einen Pointertyp gewandelt werden können.

    Das ist so. Alle Klassen, die von System.Object erben sind für die Verwendung mit Zeigern verboten. Die Ausnahme bilden natürlich Typen, die von System.ValueType erben, sowie Arrays von diesen. Weil Arrays aber Referenztypen sind, musst du diese erst "pinnen", damit du einen Zeiger benutzen darfst.

    ChrisPlusPlus schrieb:

    int copies = 200000;
    int *pSource = stackalloc int[copies];
    

    Das gibt schon einen Stackoverflow! Das sind grad mal 800 kb!!!! Das ist aber sehr schmal!

    Normalerweise würde man auf dem Heap allokieren. Der Stack ist nicht dafür gedacht, grosse Mengen von Daten aufzunehmen.



  • Das ist ja alles hochinteressant! Nun, bin ich auf ein weiteres ungewöhnliches Phänomen gestoßen und zwar, daß man nicht gerade viel Speicherpaltz reservieren kann.

    int copies = 200000;
    int *pSource = stackalloc int[copies];
    

    Das gibt schon einen Stackoverflow! Das sind grad mal 800 kb!!!! Das ist aber sehr schmal!



  • Davon ab dürfte der Stack nicht der Ort sein wo Du das allokieren möchtest, da er sich mit jedem Aufruf, mit jedem Return und mit jeder lokalen Variable verschiebt, will heissen ich glaube nicht dass ein Stack-Allokierter Speicherbereich länger als bis zum nächsten } lebt 😉



  • stackalloc reserviert ohnehin nur innerhalb des Scopes. Nach verlassen des Scopes wird dieser Speicherbereich für den Garbagecollector wieder freigegeben!



  • ChrisPlusPlus schrieb:

    stackalloc reserviert ohnehin nur innerhalb des Scopes. Nach verlassen des Scopes wird dieser Speicherbereich für den Garbagecollector wieder freigegeben!

    Des mitm Scope hat ja LordJaxom schon gesagt. Aber des mitm GC stimmt wiederum nicht, weil der hat aufn Stack nichts zu suchen, jedenfalls was Aufräumarbeiten zu tun hat, der geht nur übern Heap.



  • Ups, pardon! Das ist ja klar! 😮


Anmelden zum Antworten