News for hackers. Stuff that matters.
Re:C++ 11 Approved by pmarin on Saturday August 13, 2011 @04:03AM (#2880591)
I wonder why the C++ body does not consider things like reflection/introspection more important than the stuff they came up with.

The main advantage (and probably the unique) C++ has over other system languages like Objective C is the "near to C" performance and it does it maintaining the runtime at the minimum doing all his thing at compiling time. reflection/instrospection requires a more complex and slowly runtime.

Re:C++ 11 Approved by sjwright on Saturday August 13, 2011 @06:28AM (#2880726)
I think you might be grossly overestimating the performance penalty of Objective C's dynamic behaviours and message passing. I did too when I started programming with it, but then I did some quick benchmarking and realised the penalty was negligible bordering on nil.

For big loops, be comforted in knowing that message passing is aggressively cached; the second and subsequent calls are barely slower than a C method call.

And for those insanely big loops, with methodForSelector: you can bypass message passing entirely and call the method directly... you speed freak.

Re:C++ 11 Approved by sorbits on Saturday August 13, 2011 @08:38AM (#2880847)
C++ is used in environments where every byte and cycle counts, regardless of your personal experience, run-time meta data (and going via lookup tables) does have a big measurable overhead that many prefer to avoid.

Adding to that, the things a C++ compiler can do at compile time (via static typing and full knowledge of the types) is pretty convenient and impressive, relying on these things to be done at run-time is often complex and/or require more code to be written by the programmer.

Re:C++ 11 Approved by leon_ on Saturday August 13, 2011 @09:06AM (#2880891)
In an environment where every byte and cycle counts I'd be using C. C++ has too much stuff going on behind the scenes. (Like hidden object copies, potentially bloated operators, etc.).

If you can live with enabled exception handling (which is a performance toll) then some additional object meta data shouldn't be a problem.

Re:C++ 11 Approved by copper on Saturday August 13, 2011 @09:54AM (#2880951)
> C++ has too much stuff going on behind the scenes. (Like hidden object copies, potentially bloated operators, etc.).

The thing is, C++ is usually good about not charging you for features you don't use - and with the reasonably good debugging and profiling tools, most of the problems you mention above are fixable to get performance that is close (or equal) to C, with maybe better maintainability.

To pick a not-so-random example of something that's difficult to implement in C as safely as in C++, see expression templates[1]. I'd be interested in something similar to what eigen does written in C. (Of course, the last time I did this minibenchmark, so-and-so's lapack library was still slightly faster than eigen :)

The bottom-line, perhaps, is that if I'm writing a library, I'd do it in C simply because it's self-contained and has a nicely limited scope, and as a bonus is usable from oh-so-many other languages. If I'm writing an application that really, really requires serious performance, I'd prefer to use C++.

[1] http://en.wikipedia.org/wiki/Expression_templates

Re:C++ 11 Approved by SamReidHughes on Saturday August 13, 2011 @02:14PM (#2881563)
It's very easy to avoid at least the problems you've mentioned by not making copyable objects and not defining bloated operators.
Re:C++ 11 Approved by leon_ on Sunday August 14, 2011 @06:26AM (#2883320)
> not defining bloated operators

Can you guarantee that for every 3rd party lib you use?

Re:C++ 11 Approved by dkersten on Sunday August 14, 2011 @07:55PM (#2884871)
Then only use the ones that do guarantee this. You can also make use of C libraries, but still have access to some nice C++ features for your code.

Since C++ lets you omit language features until you basically have plain C, you get to choose what level of support you can live with.

Re:C++ 11 Approved by SamReidHughes on Sunday August 14, 2011 @04:14PM (#2884339)
Who cares about theoretical possibilities? The reality is that hidden object copies and bloated operators are not a real problem.
Re:C++ 11 Approved by pmarin on Saturday August 13, 2011 @07:06AM (#2880754)
Have you replied the wrong thread? I was not talking about message passing.
Re:C++ 11 Approved by stopmi on Saturday August 13, 2011 @07:44AM (#2880795)
maybe because reflection/introspection is done via "Objective C's dynamic behaviours and message passing"?
Re:C++ 11 Approved by leon_ on Saturday August 13, 2011 @09:14AM (#2880909)
Actually these are only convenience methods.

For example to get a class name you can either use [object className]. Or you can use object_getClassName()/directly access "anObject->class_pointer->name" without dispatching any messages. The same goes for any other runtime attribute of an object.

Re:C++ 11 Approved by fauigerzigerk on Saturday August 13, 2011 @05:03AM (#2880648)
There's no reason the meta structures couldn't be completely seperate from the regular type system and method dispatch. All that's needed is a couple of function pointers. I think the impact on performance could be zero.
Re:C++ 11 Approved by Jach on Saturday August 13, 2011 @04:34AM (#2880627)
Are you saying there's no way to make it optional and, when it's not being used, maintain the same runtime speeds? Virtual functions are "costly" too, but C++ has them and it's considered poor form to not declare your destructor virtual.
Re:C++ 11 Approved by tomjen3 on Saturday August 13, 2011 @06:16AM (#2880714)
Well the issue is that virtual functions are only costly when they are used an it can (trivially) be determined at compile whether they are in use or not.

On the other hand, you cannot determine if reflection will be used (not, at least without solving the halting problem) and so you have to generate the reflection code for everything.

Re:C++ 11 Approved by Game_Ender on Saturday August 13, 2011 @12:52PM (#2881358)
And what is costly about the reflection code exactly? It is just some static structures with type information and function/data pointers. I fail to see how it can impact performance in anyway. The only side effect will be an increase in binary size.
Re:C++ 11 Approved by pmarin on Saturday August 13, 2011 @05:02AM (#2880644)
sincerely I don't know if is comparable the virtual function's overhead with the reflexion's overhead.

Stroustrup answered a question about reflexion in this interview[1]:

Have you ever considered adding reflection to C++?

BS: Often. However, I have not seen an approach to full reflection directly supported by a language that didn't cause serious overheads. Also, reflection seems to encourage styles of programming that make it hard to determine what's going on from the source text and discourage static checking. I see that as a problem. Consequently, the C++ RTTI provides only the minimal information to determine the types of objects at run time. Where necessary, this can be used as a handle for more information about types (classes), but any such information is beyond what the standard guarantees[2].

[1] http://www2.research.att.com/~bs/omo_interview.html

[2] I think he was talking about "type_info"

Re:C++ 11 Approved by malkia on Saturday August 13, 2011 @06:18AM (#2880716)
MSVC Runtime already keeps names of the classes in the executable (browse the EXE and you would see it).

Really the only loss there would be memory usage. And this can be all optional - where you can waste some memory, for more information about the code currently running - the better.

There's already been such scarifies in C++ - exceptions, RTTI cannot be used everywhere - a xbox console would not handle C++ exceptions for example, yet you can still write in C++ (someone might argue that it's not C++ if it does not have exceptions)

Re:C++ 11 Approved by copper on Saturday August 13, 2011 @11:51AM (#2881165)
> Virtual functions are "costly" too, but C++ has them and it's considered poor form to not declare your destructor virtual.

It's a bit more subtle than that: a virtual destructor is only required when the class, or its base classes, already have another virtual function (and it's only really needed if another class inherits from it. hmm.) At that point, a virtual destructor doesn't add any more cost over and above the virtual function that's already defined.

Re:C++ 11 Approved by malkia on Saturday August 13, 2011 @02:02PM (#2881526)
But not putting one, using foreign code base might get you in trouble (resource leaking, not de-initializing certain piece of the parent, threads not closing, etc.).

This would've been prevented if destructors were always virtual.

My take is that if the compiler cannot make the decision, but it's left to you, in this case it's better to always have the virtual destructors ON.

The problem is more visual than analytical - you would have to dig through the whole hierarchy in several files to understand whether you need to put a virtual destructor or not. Compiler/Linker/some post-proc tool should be better at that job. It already has all that information.

Re:C++ 11 Approved by copper on Sunday August 14, 2011 @12:17AM (#2882792)
Hm, I'd rather pay the cost of having to add a virtual keyword in a few places (easily found using the equivalent of g++ -Wnon-virtual-dtor, and you do ship C++ code that is warning-free, right? :) rather than have to deal with up to eight bytes extra per instance in all my classes.
Re:C++ 11 Approved by malkia on Sunday August 14, 2011 @05:06AM (#2883196)
Thanks for the hint!

Actually I did not know about this option. I've just fixed such bug in one of our tools, written using wxWidgets for Windows. Have to check MSVC on this option.

At the same time a coworker was able to get the Xbox360 analyze thing and it worked finding suspicious stuff in the runtime code.

But we have only the professional version for PC :(

Re:C++ 11 Approved by DCoder on Sunday August 14, 2011 @06:07AM (#2883293)
Re:C++ 11 Approved by cpeterso on Sunday August 14, 2011 @02:47PM (#2884164)
> a virtual destructor is only required when the class, or its base classes, already have another virtual function

Your derived class only needs a virtual destructor if the base class's destructor is public. If the base class destructor is protected (or private), then no one can call delete on a pointer to a base class.

Re:C++ 11 Approved by copper on Monday August 15, 2011 @10:14AM (#2886963)
This is why I rather enjoy discussing horrible hairy corner cases like this - there's always something I've overlooked :)
Re:C++ 11 Approved by xilun0 on Sunday August 14, 2011 @01:18AM (#2882858)
(little nitpicking note : there are cases where it can be useful to have a virtual descriptor as the only virtual method of a class)
Re:C++ 11 Approved by copper on Sunday August 14, 2011 @12:49PM (#2883938)
I'm interested in knowing what these are - barring an alignment-related weirdness, I can't think of any reason to do that.
Re:C++ 11 Approved by xilun0 on Wednesday August 17, 2011 @11:08PM (#2897807)
If you do everything in the constructor and the destructor, and in the meantime store a generic instance (or maybe a list of generic instances) somewhere.

This can be a quite rare situation, though. But not impossible.

Re:C++ 11 Approved by xilun0 on Sunday August 14, 2011 @01:10AM (#2882851)
It could have 0 impact if you don't use it (like a lot of things in C++)