Sind array's ueberfluessig?



  • otze schrieb:

    es verhällt sich genauso wie new, der free Memory ist im gleichen speicherbereich wie der heap und er verhält sich genauso.
    wenn ich new char[4000] mache, erzeuge ich ein 4000 byte großes zusammenhängendes feld, genauso wie malloc(4000).
    der einzige vorteil von new ist, dass du direkt einen ctor benutzen kannst, im gegensatz zu malloc, und darum ist malloc umständlicher.
    ansonsten seh ich rein von den eigenschaften her keinen unterschied,es bleibt wie gesagt nur der fehlende ctor, was aber bei einem char array keinen unterschied macht.

    nein siehe class(), ~class()
    und der vorteil das man new überschreiben kann.



  • dass will ich mal sehen, wie du den befehl new überschreibst 😃 (oh gott, ich hör mich ja schon so an wie mastah)

    class()=ctor ~class()=dtor

    class Klasse{
        //hier steht was
    };
    void test(){
        Klasse a;//ctor
    }//hier wird der dtor von Klasse aufgerufen
    

    ok, was hat das jetzt mit dem thema zu tun?



  • otze schrieb:

    dass will ich mal sehen, wie du den befehl new überschreibst 😃

    ist das so ungewöhnlich?

    struct A
    {
    	void* operator new(size_t size)
    	{
    		return ::operator new(size);
    	}
    
    	void* operator new[](size_t size)
    	{
    		return ::operator new[](size);
    	}
    
    	void operator delete(void* p, size_t size)
    	{
    		::operator delete(p);
    	}
    
    	void operator delete[](void* p)
    	{
    		::operator delete[](p);
    	}
    };
    


  • du hast die operatoren grade nicht überschrieben, sondenr überladen(darum mein kommentar wegen mastah^^)



  • Shlo schrieb:

    ist das so ungewöhnlich?

    Mal abgesehen dass es den Befehl new nicht gibt, hat er vermutlich den unterschied operator new und new operator gemeint. den new operator kann man naemlich tatsaechlich nicht ueberladen 😉



  • otze schrieb:

    und nun verrat mir mal, wieso man den pointer den malloc übermittelt nicht umcasten soll, vorallem wenn man genau weis, dass man den void pointer nurnoch braucht, um den speicher wieder freizugeben.

    int* p = (int*)malloc(3);
    *p = 42;



  • der programmierer der sowas schreibt muss sehr dumm sein(sowas mach nichmal ich 🙄 )



  • otze schrieb:

    der programmierer der sowas schreibt muss sehr dumm sein(sowas mach nichmal ich 🙄 )

    otze schrieb:

    int* bar2=static_cast<int*>(malloc(4000));



  • die Größe eines int's auf einem x86-System beträgt mindestens 4-Bytes und nicht 3 wie oben gepostet.



  • Ja klar, und das war schon immer und ewig so ...

    Unter DOS (16bit) ist ein int 2 Byte groß.



  • dann müssen die 3-Bytes auch stimmen...



  • Shlo schrieb:

    die Größe eines int's auf einem x86-System beträgt mindestens 4-Bytes und nicht 3 wie oben gepostet.

    d.h. kann ich auf nem x86 kein compiler benutzen der 16..64 oder 512 bit ints benutzt?



  • b7f7 schrieb:

    Shlo schrieb:

    die Größe eines int's auf einem x86-System beträgt mindestens 4-Bytes und nicht 3 wie oben gepostet.

    d.h. kann ich auf nem x86 kein compiler benutzen der 16..64 oder 512 bit ints benutzt?

    auf einem 32-bit System? glaube ich kaum.



  • Es gibt natürlich schon workarounds wie ints mit einer bestimmten Größe, dann wird der Wert halt auf mehrere Register aufgeteilt oder künstlich abgeschnitten (wie geht das eigentlich, mit shiften?).

    Ach übrigens, ich würde lieber sparsam mit Pointer-Casts und Pointer-Arithmetik umgehen, sonst kann man bei der nahenden Umstellung auf 64 Bit echt Ärger bekommen.



  • wenn 64bit kommt benutz ich eh erstmal sizeof bis mir die neuen werte ins blut übergegangen bin.
    und bis dahin ist malloc(sizeof(int)*1000) vom wert her genau das gleiche wie malloc(4000).

    @b7f7 na wo liegt denn der unterschied zwischen dem was ich gemacht hab, und dem was mastah gemacht hat? jetzt mit deinem neuen wissen musst du das ja sagen können.



  • otze schrieb:

    wenn 64bit kommt benutz ich eh erstmal sizeof bis mir die neuen werte ins blut übergegangen bin.
    und bis dahin ist malloc(sizeof(int)*1000) vom wert her genau das gleiche wie malloc(4000).

    Interessant, du entwickelst also jede software für jede plattform neu?

    Ich bleib da lieber portabel und kompiliere einfach nur neu.

    wenn du wirklich 4000 statt 1000*sizeof(int) schreibst, dann kann ich dich nicht mehr ernst nehmen.



  • is sizeof() präprozessor?



  • otze schrieb:

    is sizeof() präprozessor?

    nö, es ist ein operator



  • is sizeof() präprozessor?

    Ich wage jetzt einfach mal einen Schuss ins Blaue und vermute, dass du wissen willst, ob das Ergebnis von sizeof zu Compilezeit feststeht. Ja das tut es. 1000 * sizeof(int) wird also bereits vom Compiler ausgerechnet und nicht zur Laufzeit.

    Verzeih mir, falls meine Vermutung falsch sein sollte.


Anmelden zum Antworten