C++ doch nicht so gut?!
-
Es ist nicht definiert das untereinander stehende Variablen auch untereinander stehen müssen?
Hm dachte da das jeder macht sei es so.
-
Wer macht das so?
-
wenn sachen untereinander stehen stehen sie untereinander das stimmt schon
das steht oben
das steht untenspaß beiseite.
wenn du arrays untereinander deklarierst wie in deinem beispiel könnte man vielleicht meinen daß das programm an einer speicheradresse diese zuzuordnen und dann einfach weiter macht. das muss das programm aber nicht! deswegen darf man nicht davon ausgehen daß es vielleicht doch so sein könnte. im allgemeinen enthält die speicheradresse nach dem array irgendetwas mit dem man nichts anfangen kann.
kleines beispiel: du benutzt ein multitaskingfähiges os, dein programm schreibt grad ein array. nachdem es damit fertig ist bekommt ein anderes programm rechenzeit zugeteilt und schreibt direkt nach deinem array in den speicher, und so fort. stell dir vor du schreibst dann fünf integers hinter deinem array ein neues array, wenns dumm läuft über die daten eines systemtreibers.
*peng*
-
wenns dumm läuft über die daten eines systemtreibers
zum glück gibt es ja den protected mode.
-
wenns gut läuft schreibt er ins leere, aber trotzdem *peng*
-
Shade Of Mine schrieb:
StaticArray<int, 10> arr;
Was macht das? Eine Index-Überprüfung bei jedem Zugriff?
Shade Of Mine schrieb:
raw pointer verwendet man auch nicht mehr
hm, Wie ist das zu verstehen? Tust du für jeden Zeiger, nen auto_ptr oä. benutzen?
Fänd ich beides schlimm. Dann lieber gleich Java etc., da haben sich schon andere um sowas gekümmert.
-
verwendet das echt niemand??
ein staticArray hat ne fixe groesse -> also template param
speed ist also identisch wie int arr[10];vorteil: du kannst die groesse leichter aenern, da du die groesse ja immer ueber arr.size() abfragen kannst (welches inline ist und eine konstante returned - also gratis)
index ueberwachung hast du in der debug version drinnen:
reference operator[](size_type index)
{
ASSERT(index<SIZE);
return array[index];
}geil, oder?
in der debug version hast du alle sicheren geilen features, die java und co auch haben - und in der release version bist du schnell.ein zeiger, der speicher besitzt, also mit new angelegt wurde, existiert bei mir nicht.
es gibt immer eine wrapper klasse, dabei rede ich weniger von smart pointern also einfach von abstraktion.statt
char* p=new char[size];schreibe ich
cstring p(size);performance ist gleich -> nur in der debug version habe ich in cstring geile features, wie zB checken ob ueber die grenzen geschrieben wurde.
normale zeiger auf objekte (also keine arrays) gibt es natuerlich schon.
aber da kann man ja nicht viel falsch machen, denn ein ASSERT(p); steht ueberall wo noetig. und wenn ich p[1] schreiben sollte, bin ich ja n depp.
smart pointer verwende ich eigentlich nie.bedenke:
performance einbussen in der release version sind gleich null
sicherheit in der debug version ist gleich 100%wenn es einen fehler in der release version gibt, bringt das natuerlich nix - aber das muss man dann eben abwegen, ob man diese debug-features auch in der release version haben will...
der vorteil sollte klar sein: man kann selber waehlen, wo man was wofuer bezahlen will - bei Java und Co hat man konstante kosten -> auch wenn man es nicht braucht.
-
Shade Of Mine schrieb:
verwendet das echt niemand??
ein staticArray hat ne fixe groesse -> also template param
speed ist also identisch wie int arr[10];nein, keiner.
außer dir vielleicht noch bja.
und ich hab nicht den blassesten schimmer, warum das so ist.
-
-
Andere Sprachen nehmen, da C/C++ unsicher!
Bsp. PHPFRAGE: Wie wurde PHP programmiert?
ANTWORT: In PHP !Der Artikel sagt aber etwas wichtiges aus.
"Jeder der heute HALLO WELT programmieren kann wird auch bereits als Softwareentwickler eingesetzt"Das kann ich eigentlich so bestätigen.
-
@Shade Of Mine: PL1 hat dieses Feature schon seit den 60ern... Wenn ich meine Source mit "Testschalter" umwandle, erfolgen ebenfalls Arrayindex-Prüfungen. Mach ich den Schalter aus, dann fehlen die Prüfungen, aber das Programm läuft mit optimaler Geschwindigkeit!
Kann man mal sehen, wie alt manche Sachen schon sind....
Aber staticArray's in C++ hab ich bislang auch noch nicht genutzt...
-
Der Artikel ist ziemlich schlecht. Stellt heise nur noch Script Kiddies ein oder die Trolle aus ihren Foren?
nein, keiner.
außer dir vielleicht noch bja.und kingruedi
-
Wo kommt StaticArray denn her? Oder ist das so ein "schreibt sich eh jeder selbst"-Konstrukt?
Ich benutze nur fleißig boost::array, aber dessen at() ist (wie bei std::vector) ja im Release-Build weiterhin langsam. Keine Ahnung, warum operator[] bei den beiden nicht durch assert() gesichert ist - wegen der ODR?
(at() benutze ich dafür aber auch ausreichend.)
Aber dass C++ als unsicher gilt, wenn es scheinbar schon unter Neulingen trendy ist, gleich nach dem Hello World mit char-Arrays rumzuhantieren, wundert mich eigentlich nicht...
-
StaticArray musst du dir selber schreiben. Kannst du dann aber für jedes Projekt benutzen.
-
Shade Of Mine schrieb:
vorteil: du kannst die groesse leichter aenern, da du die groesse ja immer ueber arr.size() abfragen kannst (welches inline ist und eine konstante returned - also gratis)
Ein neues sizeof.
index ueberwachung hast du in der debug version drinnen:
Verstehe ich nicht; das kann jedes simple Tool (lint zB) seit ungefähr 10 Jahren. Und versaut dabei nicht den Quelltext.
edit. Ich muss ein wenig einschränken: lint kann das nicht wirklich, aber genug andere Werkzeuge, von gcc-patches angefangen.
-
Daniel E. schrieb:
Ein neues sizeof.
ja, cool gell. das alte sizeof hat hier immer kapituliert:
template<T> int getSize(T const& array) { return array.size(); }
wie gut ist denn lint?
und gibts ein lint fuer C++?@JFK:
ich habe nicht behauptet, dass das neu ist.
ich habe nur gesagt, dass C++ das kann.Java kann es nicht und Ada kenne ich nicht gut genung um zu wissen, ob Ada das auch kann.
-
Shade Of Mine schrieb:
wie gut ist denn lint?
Kommt auf den lint an :). Mit Arraygrenzen prüfen hat er manchmal Probleme und man muss angesträngt nach neuen Optionen fahnden, die das dann richtig machen. Es gibt gcc-Patches, die machen das besser und schneller. Von unzähligen selbstgeschriebenen Programmen und Techniken, die von jeweils einem Programmierer (dem Erfinder persönlich) eingesetzt werden, abgesehen.
und gibts ein lint fuer C++?
Weiß nicht.
-
Shade, wegen Ada: Bei GNAT kann man mit -gnatp alle Runtime-Checks abschalten.