Warum programmiert ihr in C und was?
-
begeistert schrieb:
C ist sehr viel fehleranfälliger für Speicherfehler! C++ bietet dir RAII, was, wenn du es richtig benutzt, einen Speicherfehler ich sag mal nahezu unmöglich macht.
Wenn du C beherrscht und sorgfältig programmierst ist auch C recht sicher.
-
begeistert schrieb:
C ist sehr viel fehleranfälliger für Speicherfehler!
Huh?
Die beiden Sprachen stehen sich da kaum in etwas nach. C++ nimmt dir nur einen riesigen Batzen ab, das bezahlst du dann mit höherer Abstraktion. Dafür kannst du dann in C Sachen machen, über die jeder C++-Programmierer die Nase rümpft, weil sie's nicht machen dürfen (Moment - ich dachte, C++ wäre eine Erweiterung Cs?) und neidisch sind. :p
begeistert schrieb:
C++ bietet dir RAII, was, wenn du es richtig benutzt, einen Speicherfehler ich sag mal nahezu unmöglich macht.
Wieso sollte ich ein Objekt initialisieren, dass ich nie verwende? Bei C habe ich die Wahl, ein Objekt auf dem Stack auch einfach vergammeln zu lassen. Die Wahl habe ich in C++ nicht, hier wird garantiert einmal ein Konstruktor und der Destruktor aufgerufen.
"Dann verwende lieber einen Zeiger auf das Objekt."? Dann habe ich noch einmal zusätzlich
new / delete
drin. Nicht unbedingt langsam, aber einfach komplett unnötig.Ich habe eine bessere Idee: wir nehmen einfach
_init
- und_free
-Funktionen für einen Typ, und die musste manuell aufrufen. Wer_init
sagt, muss auch_free
sagen.
-
dachschaden schrieb:
Die Wahl habe ich in C++ nicht, hier wird garantiert einmal ein Konstruktor und der Destruktor aufgerufen.
struct foo { int bar; }; int main() { foo f; }
Welchen Wert hat
f.bar
?
-
Swordfish schrieb:
struct foo { int bar; }; int main() { foo f; }
Welchen Wert hat
f.bar
?Undefiniert, weil in C++ der Standard-Konstruktor nix macht. Ich glaube allerdings, du hast meine Kritik nicht verstanden.
Die von dir angegebene Struktur macht nichts kompliziertes. Nimm aber stattdessen eine Struktur, die einen Zeiger hält, mit der ich arbeiten will.
Gerade habe ich so was hier rumfliegen - eine Mapping-Struktur, die Speicher vom OS Seitenweise anfordert. Ihrerseits hält diese ein Objekt, welches die Adresse und die Länge des Mappings speichert. Der "Destruktor" (der von mir vorgeschlagene
_free
-Aufruf) gibt diesen Speicher wieder an das OS zurück. Bedingt durch die besondere Art, wie Speicher auf Windows funktioniert (mremap
ist nicht vorhanden), muss ich auch ohne je Speicher reserviert zu haben eine Tabelle anlegen, in der ich Informationen über fortlaufende Speicherbereiche halte.Sagen wir, ich greife auf das Mapping nur dann zu, wenn Parameter X == NULL ist (ist sogar genau das, was der Code hier tut). Das kann heißen, dass das Objekt über die komplette Funktion immer mal wieder verwendet wird, nicht in einem fortlaufenden Block, aber immer in Blöcken, in denen sichergestellt wurde, dass X == NULL ist. In all den Blöcken, in denen X != NULL ist, wird stattdessen was anderes gemacht, was das Mapping-Objekt nicht anfasst.
Dadurch, dass das Objekt für die komplette Funktion verfügbar ist, würde ein Konstruktor bereits durch Funktionseintritt aufgerufen werden. Lebenszyklus von Objekten, sofern ich das nicht falsch verstanden habe. Dadurch habe ich dann automatisch beim Funktionseintritt und -Austritt jeweils einen Syscall sitzen, selbst wenn ich das Objekt gar nicht verwende.
In C kann ich im ersten X == NULL-Block
_init
machen, das Objekt initialisieren - und dann auch garantierterweise verwenden. Und im letzten X == NULL-Block kann ich_free
machen. Kein Automatismus macht, was er eventuell nicht soll.In C++ wird bereits zum Funktionseintritt das Objekt erstellt, die Tabelle angelegt, und dann wieder freigegeben, obwohl ich sie eventuell gar nicht gebraucht habe.
Und wenn ich das Anlegen der Tabelle in eine eigene Funktion packe, dann kann ich RAII auch gleich in die Tonne kloppen. Denn diese eigene Funktion habe ich in C bereits - siehe
_init
. Soll ich das auch gleich für C++ so bauen, dass die Tabelle nicht mit dem Konstruktoraufruf erstellt wird? Kann ich machen - und RAII auch wieder ad absurdum führen.RAII ist ein Sicherheitskonzept für blöde Programmierer, die sich nicht sicher sind, wann ein Objekt initialisiert ist. Ja, klar, kann man machen. ich will damit nur nichts zu tun haben.
-
dachschaden schrieb:
Sagen wir, ich greife auf das Mapping nur dann zu, wenn Parameter X == NULL ist (ist sogar genau das, was der Code hier tut). Das kann heißen, dass das Objekt über die komplette Funktion immer mal wieder verwendet wird, nicht in einem fortlaufenden Block, aber immer in Blöcken, in denen sichergestellt wurde, dass X == NULL ist. In all den Blöcken, in denen X != NULL ist, wird stattdessen was anderes gemacht, was das Mapping-Objekt nicht anfasst.
Klingt mir eher danach, als wär deine Codestruktur Schwachsinn...
-
dot schrieb:
Klingt mir eher danach, als wär deine Codestruktur Schwachsinn...
Eben nicht. Sie war großer Schwachsinn, bevor ich diese Funktionalität zusammengelegt habe. So musste jede Funktion, die die beschriebene Funktion aufrufen wollte, nicht erst prüfen, ob X != NULL ist, um dann eine andere Funktion aufzurufen.
Ich habe das bereits hinter mir, ich kenne den anderen Weg, und er ist Scheiße.
-
Habe ich das jetzt richtig verstanden, dass Speicherfehler in C und C++ möglich sind, dies aber vom Können des Programmierer abhängt?
-
CFrager schrieb:
Habe ich das jetzt richtig verstanden, dass Speicherfehler in C und C++ möglich sind, dies aber vom Können des Programmierer abhängt?
Ja.
-
dachschaden schrieb:
Swordfish schrieb:
struct foo { int bar; }; int main() { foo f; }
Welchen Wert hat
f.bar
?Undefiniert, weil in C++ der Standard-Konstruktor nix macht. Ich glaube allerdings, du hast meine Kritik nicht verstanden.
Ich glaub eher, mich hat deine allgemeine Aussage gestört. (... und wer regt sich ernsthaft über einen ctor aus, der effektiv nop ist)
-
Swordfish schrieb:
(... und wer regt sich ernsthaft über einen ctor aus, der effektiv nop ist)
Jemand der C++ nicht wirklich verstanden hat oder sich weigert, es zu versuchen...
-
CFrager schrieb:
Habe ich das jetzt richtig verstanden, dass Speicherfehler in C und C++ möglich sind, dies aber vom Können des Programmierer abhängt?
das ist so ziemlich die beste Zusammenfassung des Threads hier. Also ja.
-
Swordfish schrieb:
Ich glaub eher, mich hat deine allgemeine Aussage gestört. (... und wer regt sich ernsthaft über einen ctor aus, der effektiv nop ist)
[] Du hast meinen Post verstanden.
Lies dir einfach noch mal diesen Satz durch:
dachschaden schrieb:
Die von dir angegebene Struktur macht nichts kompliziertes. Nimm aber stattdessen eine Struktur, die einen Zeiger hält, mit der ich arbeiten will.
und verstehe, dass mich nicht das nop, sondern der durch RAII "erzwungene" Laufzeitverhalten stört. Der Konstruktor in deinem Beispiel ist nop, der in meinem ein Schlachtschiff.
CFrager schrieb:
Habe ich das jetzt richtig verstanden, dass Speicherfehler in C und C++ möglich sind, dies aber vom Können des Programmierer abhängt?
Wie so fast alles.
Ich habe immer noch Benchmarks im Kopf, die "beweisen", dass Java schneller sein soll als C oder C++. Mies programmieren kannst du in jeder Sprache.
-
Ich denke bei Java geht es auch in erste Linie nicht um Performance, sondern darum automatisch einige Fehler zu vermeiden und die Vorteile einer VM zu nutzen + guter Standardbibliothek.
Aber das Java auch sehr ressourcensparend sein kann, hat Android gezeigt. Es ist gut genug für die meisten Apps.
-
Vielleicht hat ja noch Jemand eine Antwort auf meine Ursprungsfrage. Warum ihr C nutzt und was ihr so für Programme damit an den Start bringt?
-
CFrager schrieb:
Aber das Java auch sehr ressourcensparend sein kann, hat Android gezeigt.
Das Android und ressourcensparend war jetzt als Witz gemeint, oder?
Bei Android kann man sich meiner Erfahrung nach alle zwei Jahre ein neues Gerät holen, weil sich auf dem Alten nichtmal mehr in endlicher Zeit der Browser öffnen lässt. Android ist mir persönlich mittlerweile so arg zu blöd geworden, dass ich mir garantiert keine Android Gerät mehr kaufen werde. Ich hab jedenfalls nicht vor, alle 24 Monate ein paar hundert Euro zu investieren, nur damit ich ab und zu mal unterwegs was Googlen kann. Für mich ist nicht nachvollziehbar, wie Leute die Performance dieses Systems überhaupt auch nur annähernd akzeptabel, geschweige denn gut finden können. Das uralte Windows 7 Phone meiner Mutter läuft immer noch dreimal so flüssig wie mein Android am ersten Tag, obwohl letzteres mehr als doppelt so starke Hardware verbaut hat...never again...
-
Hmm, ich habe noch nie Probleme mit der Geschwindigkeit gehabt. Ein WindowsPhone hatte ich auch schon, das ist wirklich nett nur an Software mangelt es leider sehr. Mein jetziges Android ist ein P8 Lite und hat 180,-EUR gekostet. 13MPixel Kamera, 2GB Ram, 8Core(64Bit 1,2GHz) CPU, Dualsim, 16GB intern mit SD erweiterbar. Lies sich problemlos auf Android6.0 updaten und ist sau flüssig in der Bedienung.
Wenn ich alle 2 Jahre mal 180,- EUR ausgebe geht das in Ordnung für mich.
-
nop ist was von assembler (0x90), nicht von C oder C++. Mit nops macht man u.U. schmutzige Sachen.
-
dot schrieb:
CFrager schrieb:
Aber das Java auch sehr ressourcensparend sein kann, hat Android gezeigt.
Das Android und ressourcensparend war jetzt als Witz gemeint, oder?
Bei Android kann man sich meiner Erfahrung nach alle zwei Jahre ein neues Gerät holen, weil sich auf dem Alten nichtmal mehr in endlicher Zeit der Browser öffnen lässt.
Du meinst also, Android ist dynamisch? So, dass es im Lauf der Zeit langsamer wird?
Interessant ...
-
Belli schrieb:
dot schrieb:
CFrager schrieb:
Aber das Java auch sehr ressourcensparend sein kann, hat Android gezeigt.
Das Android und ressourcensparend war jetzt als Witz gemeint, oder?
Bei Android kann man sich meiner Erfahrung nach alle zwei Jahre ein neues Gerät holen, weil sich auf dem Alten nichtmal mehr in endlicher Zeit der Browser öffnen lässt.
Du meinst also, Android ist dynamisch? So, dass es im Lauf der Zeit langsamer wird?
Interessant ...Systemupdate und so...ich zieh mir das ja alles nicht aus der Nase, das Teil liegt hier 2 m von mir entfernt am Tisch und ich habs mittlerweile auch schon gejailbreaked und komplett neu aufgesetzt, hilft alles nix. Zum Glück ist grad vor ein paar Tagen mein neues Windows Phone gekommen, jetzt brauch ich mich nie wieder mit diesem Android Müll rumärgern...
-
Ja, alles wird immer langsamer. Hier gibts doch grad auch einen Thread, was für einen Rechner man braucht um ein "riesiges" Java Projekt mit 300 Source Files zu bearbeiten, und dass ein 6 Jahre alter Rechner schon zu alt ist. Als ob man nicht schon vor 15-20 Jahre problemlos an viel größeren Projekte gearbeitet hätte.