You should not consider that an intermediate step. Even with full type
unification, objects that don't cross the boundary (between GC collected and
native) will have significantly superior performance than mixed objects (or
mixing the type of the collection with the type of contained object).
We cannot do magic, both worlds still play by separate rules. E.g. a mixed
type will have a separate managed and native part and pointers going both
ways. Creating an instance will require both a gc heap allocation and a C++
heap allocation. For std::containers, the overhead of a handle for each
contained object and the indirection through the handle for each operation
on an element is also not free.
We definitely could not fit the full unification support in the current
release, but apart from that, the fact that we will have significant amount
of real world code written both by external VC customers and inside
Microsoft will significantly benefit the eventual implementation of the
unification support and a good understanding of when it will be appropriate
to use which features. Of course premature optimization is never worthwhile,
but an understanding that some of the support will have associated costs
will still be essential IMO.
Specifically for our managed object implementation of STL type collections,
we expect it to be extremely close to the C++ standard, however there are a
few requirements on the std::collections that could not be met (or could not
be met in an implementation where other things like performance and perhaps
even verifiability are also priorities). I do think that supporting the
containers, iterators, algorithms style collections for .net types in an
ideal way is gong to add significant value.
I hope this post also addresses Ioannis' comments later in the thread.