Wieso "const" verwenden?
-
Blue-Tiger schrieb:
........... schrieb:
(D)Evil schrieb:
optimierung geb ich mal als Stichwort rein ...
Durch const werden Programme nicht schneller.
Oh doch, und wie. "const" ist fuer den Compiler eine unglaublich Grosse Hilfe bei Geschwindigkeitsoptimierungen. Ich hab schon Anwendungsfaelle gehabt, wo die Geschwindigkeit _MERKLICH_ (read: ~50%) gestiegen ist, nachdem ich im ganzen Programm wie wild alles "const" gemacht hab was nur ging.
"wie wild" irgendetwas tun ist kaum als Beleg geeignet. Schließlich kann const auch gelegentlich die Semantik verändern, wenn zum Beispiel const-Überladungen, die nicht genau das Gleiche machen (man denke etwa an basic_string+COW) im Spiel sind. Grundsätzlich erlaubt const - in den Grenzen der as-if-Regel - keine weitergehenden Optimierungen, als ohne const möglich sind, sofern beide Programme - bis auf diese Qualifikation - identisch sind. Natürlich sind praktisch Unterschiede denkbar, denn reale Compiler sind ja nicht perfekt - ich habe aber große Zweifel, dass man hier generell von einem Vorteil von const ausgehen sollte.
So oder so dient const einer inhaltlichen Aussage und nicht der Optimierung, folglich ist seine unterschiedslose Verwendung überall, wo es möglich ist, genauso falsch wie der völlige Verzicht es ist.
-
ProgChild schrieb:
Naja... Ich würd sagen const ist erst wirklich nötig geworden durch die Referenzen. ...
Nunja ... für Zeiger halte ich es aber für genauso hilfreich und für Memberfunktionen sowieso.
Es erlaubt einfach eine genauere Schnittstellenpezifikation, weil nicht nur gesagt werden kann: "Ich benutze/liefere ein x", sondern "Ich benutze/liefere ein x, das ich aber nicht verändere/du aber nicht verändern darfst".
Ist wie mit aussagekräftigen Namen: KANN man verwenden, MUSS man aber nicht.Gruß,
Simon2.
-
'const' kann helfen, speicherplatz zu sparen. auf systemen mit wenig RAM könnten 'const'-objekte im (grösseren) ROM/Flash etc. abgelegt werden, weil nur lesend darauf zugegriffen wird.
-
Außerdem const du mal ein Bier holen.
SCNR
-
Hmm ... und wie wollt ihr ohne const bitte die Direkte Eingabe von z.B. "Zeichenkette" zulassen?
-
in dem man das const weglässt, und einfach so damit arbeitet.
-
const-freak schrieb:
'const' kann helfen, speicherplatz zu sparen. auf systemen mit wenig RAM könnten 'const'-objekte im (grösseren) ROM/Flash etc. abgelegt werden, weil nur lesend darauf zugegriffen wird.
das hilft einem aber weder bei const-referenzen, noch bei const-members... also eigentlich nur bei globalen Konstanten.
-
camper schrieb:
Blue-Tiger schrieb:
........... schrieb:
(D)Evil schrieb:
optimierung geb ich mal als Stichwort rein ...
Durch const werden Programme nicht schneller.
Oh doch, und wie. "const" ist fuer den Compiler eine unglaublich Grosse Hilfe bei Geschwindigkeitsoptimierungen. Ich hab schon Anwendungsfaelle gehabt, wo die Geschwindigkeit _MERKLICH_ (read: ~50%) gestiegen ist, nachdem ich im ganzen Programm wie wild alles "const" gemacht hab was nur ging.
"wie wild" irgendetwas tun ist kaum als Beleg geeignet. Schließlich kann const auch gelegentlich die Semantik verändern, wenn zum Beispiel const-Überladungen, die nicht genau das Gleiche machen (man denke etwa an basic_string+COW) im Spiel sind. Grundsätzlich erlaubt const - in den Grenzen der as-if-Regel - keine weitergehenden Optimierungen, als ohne const möglich sind, sofern beide Programme - bis auf diese Qualifikation - identisch sind. Natürlich sind praktisch Unterschiede denkbar, denn reale Compiler sind ja nicht perfekt - ich habe aber große Zweifel, dass man hier generell von einem Vorteil von const ausgehen sollte.
So oder so dient const einer inhaltlichen Aussage und nicht der Optimierung, folglich ist seine unterschiedslose Verwendung überall, wo es möglich ist, genauso falsch wie der völlige Verzicht es ist.Ich bin sehr wohl der Meinung, dass const ueberall dort verwendet werden sollte, wo es verwendet werden kann (ohne dass dabei die Semantik veraendert wird).
Es ist in der Tat eine inhatliche Aussage, allerdings eine, die auch der Compiler versteht, von daher kann ich mir schon vorstellen, dass aus diesem Plus an Informationen auch was nuetzliches Abgeleitet werden kannIch hab mir nie die Muehe gemacht nachzuforschen, woher der Geschwindigkeitsboost stammt, aber alle Variablen so weit wie moeglich 'const' zu machen bringt mir oft messbar bessere Performance. Ich hab beim schnellen nachgoogeln nix gefunden, womit ich das belegen koennte, nur:
* http://igad.nhtv.nl/~bikker/files/rtgames.pdf (Seite 6, unten rechts), aber leider wird auch hier nicht gut begruendet WARUM der Speedup erfolgt.
* und als eine moegliche Erklaerung:
http://aigamedev.com/programming-tips/optimize-virtual-functions schrieb:
- use the const keyword. Some compilers (on some architectures) treat variable differently if they are const or not, thus it helps them optimizing register use.
-
Jester schrieb:
...also eigentlich nur bei globalen Konstanten.
das ist auch der einzige fall, bei dem ich 'const' verwende.
-
Blue-Tiger schrieb:
Ich bin sehr wohl der Meinung, dass const ueberall dort verwendet werden sollte, wo es verwendet werden kann (ohne dass dabei die Semantik veraendert wird).
I think it will be convenient to have special C++ compiler, where all variables, methods, etc. are const by default. And this compiler should have a special keyword "non_const" to explicity declare non-const objects
I have looked through some of my programs and firured out that they will became shorter with "non_const" keyword insteat of "const".
-
globals-freak schrieb:
Jester schrieb:
...also eigentlich nur bei globalen Konstanten.
das ist auch der einzige fall, bei dem ich 'const' verwende.
Naja und da ich mal annehem, dass du keine 100 MB an Speicher drinn hast, wird es kaum merkbar sein, dass da Speicher gespart wird.
-
SAn, there are languages that work like this, e.g. Nemerle which declares each object as immutable except for those that are explicitly marked 'mutable'.
In most functional programming languages 'const' is the only known behaviour. Binding a value to a name is permanent and this same name cannot be rebound in the same context.
-
Ich find ein const sieht einfach schööön aus
const int SIZE = 10; void func( const Muap& obj ); int getMem() const;
-
KasF schrieb:
Ich find ein const sieht einfach schööön aus
const int SIZE = 10; void func( const Muap& obj ); int getMem() const;
Und ich finde, es sieht noch schöner aus, wenn man die const-Position konsistent hält:
int const SIZE = 10; void func( Muap const& obj ); int getMem() const;
Gruß,
Simon2.
-
Welche Variante findet ihr 'stilistisch schöner':
1. Hier folge ich dem Ratschlag in meinem Buch, dass ich mit C++ keine #define Anweisungen verwenden darf (obwohl GANZ ohne #define klappt es nicht):
#ifndef FARBEN const short VII = 7; const short VIII = 8; const short IX = 9; const short X = 10; const short BUBE = 11; const short DAME = 12; const short KOENIG = 13; const short ASS = 15; const short JOKER = 23; const short ATOUTBONUS = 9; #define FARBEN
2. In guter alter C-Manier würde ich es so schreiben:
#define VII = 7; #define VIII = 8; #define IX = 9; #define X = 10; #define BUBE = 11; #define DAME = 12; #define KOENIG = 13; #define ASS = 15; #define JOKER = 23; #define ATOUTBONUS = 9;
... und auch in diesem Fall wäre der Header überall problemlos verwendbar.
Der Sinn und Zweck von Konstanten ist doch wohl nur, um den Quelltext etwas leserlicher zu gestalten. Wenn ich im Quelltext irgendwo '12' hinschreibe, dann sieht das sehr verdächtig aus. Wenn dort stattdessen 'DAME' steht, ist schon eher ersichtlich, dass es hier um einen Kartenrang geht -> ergo: der einzige Sinn und Zweck von Konstanten scheint zu sein, dass ein Quelltext für den Programmierer besser leserlich wird. Ob jetzt die Konstanten mittels const oder #define vereinbart werden, scheint eher nebensächlich zu sein. Vielmehr ärgerlich ist es bei den mittels 'const' vereinbarten Konstanten, dass geradezu ein Definitionszwang besteht, was gerne zu Compiler-Fehlern (Konstante mehrfach definiert etc.) führt, wenn die gleiche Header-Datei in mehreren Teilen einer Anwendung verwendet werden soll.Auch bei den enum{} - Konstanten gibt es öfter Ärger als Freude.
Jedenfalls meine Meinung zum Thema Konstanten, ich kann auch total daneben liegen
-
edit: die Semikola bei dem #define - Quelltext gehören dort natürlich nicht hin ... mfg
-
Weder noch. Dafür nimmt man enums.
/EDIT: Inwiefern soll es mit enums Ärger geben?
-
Konrad Rudolph schrieb:
Weder noch. Dafür nimmt man enums.
/EDIT: Inwiefern soll es mit enums Ärger geben?
Habe genau das auch gedacht. - Das Beispiel macht es einem ja soo einfach.
-
Konrad Rudolph schrieb:
Weder noch. Dafür nimmt man enums.
/EDIT: Inwiefern soll es mit enums Ärger geben?
Was nur geht wenn du konstanten auf reine Ganzzahlwerte beschränkst. Okay, im vorliegenden Fall hätte ich vermutlich auch ein enum genommen, aber das liegt am Beispiel.
-
The God is const, and our world is const in 4D (x,y,z,t) representation.