Re: Future of C++
On Aug 12, 11:03 am, Nicola Musatti <nicola.musa...@gmail.com> wrote:
GC makes memory handling much simpler, to the extent that I wonder if
hand coded memory management isn't a form of premature optimization;
on the other hand it makes it much more complicated to deal with
objects that require timely destruction.
I have to nit-pick here, because I am starting to become midly
irritated [actually not :)] at people, especially experts, saying GC
makes memory management easier.
GC makes memory management easier within the context of a certain
style of programming which could be regarded as distasteful in any
language. This style might be called:
Vaguery Of Form.
I think it is an illusion that vaguery of form is permissible in
engineering. It only happens in software engineering because the
material cost of that which is used to create the form is zero, and
the accessibility of the system by the engineer who created it is
guaranteed. Imagine what it would be like if, in the bridge-building
world, mechanical engineers where allowed to visit the bridge every 3
months to do "updates". Or, if there were a bug in the bridge, the
bridge designer issued a patched that could be applied by someone who
does not understand bridge science. Or, bridge building was a trial-
and-error experience by 20% of bridge designers. Sometimes they
snapped in two, some times not.
I never have trouble with memory management in C++ code. Ever. There
is a style of coding, which I believe transcends any programming
language, and even software engineering in general, where memory
management is never an issue:
1. An object that acquires a resource should be the same object that
frees it.
2. Member functions always look inward.
3. No "getting" of things that are external to object. [Why get what
is already there?]
4. No referencing of things that are external to the object.
5. Avoid type proliferation - reuse containers heavily instead to
create structure.
6. Use abstract classes sparingly - they are often a substitute for
forethought
7. Is it reusable? If not, why are you making a class of it?
From what I have seen, these basic principles are heavily disregarded
by other C++ programmers. If they see a mouse nibbling on piece of
cheese, all of sudden, there is new class added that takes a pointer
to a CCheese:
class CCheeseNibblingMouse
{
CCheeseNibblingMouse (CCheese *) ;
} ;
This is very bad IMO, but it is the truth of C++ coding today.
1. Why is there unchecked type proliferation.
2. Are you sure we need a specific concept representing a cheese-
nibbling mouse?
3. Why are you linking objects via pointers via the constructor?
It's no surprise that programmers look for an escape in GC. But to me,
this is not a problem of memory management. This is a problem of bad
design.
Engineers in other disciplines like electronics do not design systems
like this, where there is unchecked type proliferation. They do not
have the luxur of zero material cost. If a new type is created (a new
sub-circuit), it is very much likely to be reused. Otherwise it is
not regarded as a new type (sub-circuit), but merely a synthesis of
existing types (resitor, capacitor, low-pass-filter, oscillator). In C+
+, OTOH, every engineer creates what are presumably new fundamental
components, but no one ever resuses them. It perplexes me that some
other engineers do not see a problem with this.
I am confident that many projects that are heavily laden with
polymorphic classes can be refactored so that a large percentage of
these become concrete. Then, if heavy polymorphism is eliminated, the
only classes left would be those that are truly reusable, like
string<>, map<>, set<>, list<>...and perhaps a few other unavoidable
domain-specific classes that are mostly concrete. Naturally, these
domain specific classes should appear at _multiple_ locations within
the code - the more the better, as more implies that the programmer
really has found a new type. It should _not_ be used only once. The
worst is to make a massive, per-program singleton class called
something like CTheApp.
OTOH, I can imagine a situation where the design space is already
predisposed to polymorphism, and knowing this, the programmer
_deliberately_ structures his architecture so that GC is built into
the model, by intentially and mindfully placing pointers to new'ed
objects into a store for garbage collector to manage.
-Le Chaud Lapin-
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]