QUOTE(SMcLellan @ 10 Jun, 2007 - 12:44 AM)

1) At the end of the day your .NET code is compiled to x86 bytecode, which means that the efficiency of your code is still dependent on compiler optimizations. Since the runtime also knows the full scope of what your application is doing there's opportunity for optimizations as well.
Well, it is complied, not interpreted, but the opportunity for optimizations does not mean that much. The JIT is good, but its not magic. Your code still has be loaded and compiled to machine code at run time, which takes time, and the large parts of the base class you need have to be loaded, which take time, and more importantly there is a lot of overhead for memory management which takes time and memory.
But by and large, most applications written today don't really need the speed of C or C++. In fact most programmers probably couldn't explain the performance differences between an array and a linked list (even MS worries me, they left linked lists out of the framework collections library in .NET 1.0 and 1.1!)

And if you cant do that, probably managing pointers and memory directly is not your cup of tea, and so you couldn't really use the features of C++ to get maximum performance anyways.