Hi Girish, yes that's correct -- even for virtual function calls, like ToString().
There is an interesting, related thread over on the dotnet-cx list, about why structs can't serve as base types: http://discuss.develop.com/archives/wa.exe?A2=ind0411d&L=dotnet-cx&P=3032 If you go back and look at the IL you originally posted, you'll see the call to Int32.ToString was a 'call' instruction, not a 'callvirt'. The CLR's ability to dispatch virtual method calls without an object header comes back around to the fact that valuetypes can't serve as base classes -- they can't be derived from. Put simply, there is no run-time polymorphism for valuetypes. This is the only way .NET can dispatch *virtual* method calls on valuetypes -- to know the exact, most-derived type at compile time, and emit a 'call' instruction instead of a 'callvirt'. Hope that's clear... Cheers, -Shawn http://msdn.com/tabletpc http://windojitsu.com On Fri, 26 Nov 2004 07:17:12 +0000, Girish Jain <[EMAIL PROTECTED]> wrote: > Hi, > > Ok ! My understanding (certainly wrongful!) was that you require an object > header to dispatch method calls. which is not true for value type instances. > > Thanks for answering my question with patience > > Happy thakns giving, everyone > > Regards, > Girish Jain > > >From: "Shawn A. Van Ness" <[EMAIL PROTECTED]> > >Reply-To: "Unmoderated discussion of advanced .NET topics." > ><[EMAIL PROTECTED]> > >To: [EMAIL PROTECTED] > >Subject: Re: [ADVANCED-DOTNET] Methods Calls on value types > >Date: Thu, 25 Nov 2004 11:52:45 -0800 > > > > > >Because there's no reason to box it. All that's needed to perform an > >instance method call is a pointer to the object (as the first > >parameter -- the 'this pointer' as we used to say in C++)... the > >'ldloca' instruction provides that, nicely enough, in the above > >example.. > > > >And if you think about it, boxing isn't really a viable option at all. > > The process of boxing involves making a bitwise copy of the > >valuetype, on the heap. So if valuetypes had to be boxed before each > >and every method-call... they'd all be immutable! The method calls > >would be operating on boxed copies, not the originals. > > > >Happy Thanksgiving, everyone... > >-S > > > >On Thu, 25 Nov 2004 19:30:32 +0530, Hotmail <[EMAIL PROTECTED]> > >wrote: > > > Hi, > > > > > > Firstly - Sorry for a 2 day break! > > > Secondly - Thanks a lot for such a beautiful explanation. It has > >certainly > > > increased my knowledge. > > > > > > Ooops!! After telling the entire story, I forgot the very basic thing - > >to > > > ask my specific question. > > > > > > My question was (It may sound dumb!) : > > > Why the value type instance was not boxed in the supplied code ? > > > > > > Regards, > > > Girish Jain > > > > > > > > > > > > ----- Original Message ----- > > > From: "Shawn A. Van Ness" <[EMAIL PROTECTED]> > > > To: <[EMAIL PROTECTED]> > > > Sent: Wednesday, November 24, 2004 1:46 AM > > > Subject: Re: [ADVANCED-DOTNET] Methods Calls on value types > > > > > > > > IL_0002: ldloca.s V_0 // Load local variable address > >on > > > to the stack > > > > > > > > Sounds like you understand, just fine. The CPU pushes the address of > > > > the valuetype onto the stack, before making the function call. That's > > > > a pointer, on the stack, *to* something else on the stack (but > > > > slightly higher up). > > > > > > > > I think the real question you're asking is "why is this verifiable?" > > > > Ordinarily, you're not allowed to go passing around pointers to things > > > > on the stack... well, actually you are -- the above IL code > > > > demonstrates that -- you're just not allowed to hold onto that pointer > > > > beyond the life of what it points to. > > > > > > > > So, to consider why this is legal/verifiable, consider all the bad > > > > things that method like ToString() might do with it. If it tries to > > > > cache that arg0 in a field of type 'Object', the value will be boxed > > > > (a copy made, on the heap)... fair enough. If it tries to copy arg0 > > > > into a field of type 'Int32', it will be dereferenced and > > > > bitwise-copied... again, no problemo. > > > > > > > > So, the lesson here is that pointers are not evil (unverifiable) > > > > inandof themselves. It's what can be *done* with a pointer that's > > > > evil and potentially unverifiable. Make sense? > > > > > > > > As long as the bytecode verifier can see that it's impossible for the > > > > pointer to be copied to a place where it may outlast its > > > > destination... it's all good. > > > > > > > > Cheers, > > > > -Shawn > > > > http://msdn.com/tabletpc > > > > http://windojitsu.com > > > > > > > > =================================== > > > > This list is hosted by DevelopMentor� http://www.develop.com > > > > Some .NET courses you may be interested in: > > > > > > > > Essential .NET: building applications and components with C# > > > > November 29 - December 3, in Los Angeles > > > > http://www.develop.com/courses/edotnet > > > > > > > > View archives and manage your subscription(s) at > > > http://discuss.develop.com > > > > > > > > > > =================================== > > > This list is hosted by DevelopMentor� http://www.develop.com > > > Some .NET courses you may be interested in: > > > > > > Essential .NET: building applications and components with C# > > > November 29 - December 3, in Los Angeles > > > http://www.develop.com/courses/edotnet > > > > > > View archives and manage your subscription(s) at > >http://discuss.develop.com > > > > > > > > >-- > >Cheers, > >-Shawn > >http://msdn.com/tabletpc > >http://windojitsu.com > > > >=================================== > >This list is hosted by DevelopMentor� http://www.develop.com > >Some .NET courses you may be interested in: > > > >Essential .NET: building applications and components with C# > >November 29 - December 3, in Los Angeles > >http://www.develop.com/courses/edotnet > > > >View archives and manage your subscription(s) at http://discuss.develop.com > > _________________________________________________________________ > Choose what you want to read. Protect your mail from spam. > http://server1.msn.co.in/sp04/hotmailspamcontrol/ Win the war in 9 steps! > > > > =================================== > This list is hosted by DevelopMentor� http://www.develop.com > Some .NET courses you may be interested in: > > Essential .NET: building applications and components with C# > November 29 - December 3, in Los Angeles > http://www.develop.com/courses/edotnet > > View archives and manage your subscription(s) at http://discuss.develop.com > =================================== This list is hosted by DevelopMentor� http://www.develop.com Some .NET courses you may be interested in: Essential .NET: building applications and components with C# November 29 - December 3, in Los Angeles http://www.develop.com/courses/edotnet View archives and manage your subscription(s) at http://discuss.develop.com
