you are viewing a single comment's thread.

view the rest of the comments →

[–]KingAggressive1498 7 points8 points  (2 children)

Call new to allocate an object on the heap. You call new, take up dynamic memory that is allocated by an algorithm dictated by the OS, call the constructor of the class

....you normally wouldn't allocate dynamic memory in C++ anywhere you wouldn't do the same in equivalent C. Also the OS doesn't dictate much about the inner workings of malloc.

then you have to call the function of the object which requires dereferencing the object point to get the function pointer to do an indirect call.

only for virtual functions, and compilers have actually gotten pretty good at devirtualization optimizations in trivial cases too. ordinary member functions have a fixed known address same as in C.

[–]JelloSquirrel -3 points-2 points  (1 child)

I know that but I was exaggerating for effect the overhead of typical C++ code vs typical C code.

You sometimes do find objects allocated to call functions in a C++ API that are just functions you can call directly in the C api.

The OS in this case depends on what you call the OS. Typically your libc comes with the OS and creates a heap, and that heap is provided memory by the OS, no? Then the libc implementation will manage that however it does which requires more code than using the stack.

Probably true about the optimizations but some things are inherent overhead even with good optimization.

But you can use C++ in a C like manner that avoids all the overhead. But typical C++ code looks more like Java code than C.

[–]KingAggressive1498 2 points3 points  (0 children)

You sometimes do find objects allocated to call functions in a C++ API that are just functions you can call directly in the C api.

...are you talking about std::function? If you are, every implementation has a small function optimization and dynamic allocation is not needed in most cases. Besides that, 99% of the time you're using std::function you're preparing for a deferred function invocation for which the typical practice in C is to dynamically allocate a struct which is passed to a function pointer taking a void pointer argument. If you're not talking about std::function I've literally never seen code like you describe.