My bad, you are right :) That said, if you interact with unmanaged code, you
still need to pin the struct which get us back to square one. Also, that
struct can get quite large if one is to include all the fields mentioned in
the original message.

Another thing is I defined the following struct to test this out but I
cannot get it working like I would think it should, ie making the Full field
work. Any idea ? My curiosity has been triggered :p

[StructLayout(LayoutKind.Explicit)]
unsafe struct Name
{
        [FieldOffset(0)]
        public char* Full;

        [FieldOffset(0)]
        public fixed char First[20];

        [FieldOffset(40)]
        public fixed char Last[20];

        [FieldOffset(80)]
        public fixed char Middle[20];
}

Sébastien

> -----Original Message-----
> From: Discussion of advanced .NET topics. [mailto:ADVANCED-
> [EMAIL PROTECTED] On Behalf Of gregory young
> Sent: Tuesday, November 14, 2006 2:31 PM
> To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
> Subject: Re: [ADVANCED-DOTNET] Data Structures in .Net?
> 
> Sebastien I am 90% sure you are incorrect about fixed buffers in terms
> of those being included a struct as "fighting" the garbage collector ..
> 
> It should be able to get by without pinning (unlike normal usage of the
> fixed keyword) ... remember it defines the memory directly within the
> struct so you can just keep the managed reference to the struct and
> offset from it.
> 
> ex:
>         unsafe struct test
>         {
>             public fixed char foo[255];
>             public int bar;
>             public fixed bool foo2[128];
>         }
>         static void Main(string[] args)
>         {
>             test t;
>             t.foo[22] = 'c';
>         }
> 
> on the access ... there is no need to pin anything in order to access
> the variable (it is t + something (he fixed keyword here is actually
> putting the array allocations directly in the struct) .. because of
> this I would assume no pinning .. no pinning would seem to disagree
> with your fragmentation statement and not playing nicely with the GC ...
> 
> Cheers,
> 
> Greg
> 
> On 11/14/06, Sebastien Lorion <[EMAIL PROTECTED]> wrote:
> > A solution like this is actually fighting against the way .NET was
> designed.
> > Strings are immutable and so you cannot modify a string in-place, you
> > need a string builder. Looking on the net you will see that there are
> > many benefits to immutability and actually, not only for strings.
> >
> > The problem with the suggested code is that it is very inefficient.
> > The net result is that you will be creating a new string object every
> > single time you read one of the properties. That might put a lot of
> > stress on the garbage collector and triggers many Gen0 collections
> and
> > thus promote prematurely other objects to an older generation.
> >
> > On the other hand, by using fixed buffers, you are effectively
> working
> > against the garbage collector which tries to defragment memory. If
> you
> > have many of these objects in memory, it will be next to impossible
> to
> > defragment it. One of the consequences of that is losing locality of
> > reference, one of the most important factor in performance. On top of
> > that, using unsafe code requires special permissions on the client.
> >
> > Both solutions also suffer from the fact that you will use 60 chars
> > arrays no matter the actual required memory is. "John Smith" is 9
> > chars, why waste
> > 51 ?
> >
> > I think one of the point of using such kind of memory layout (ala
> > COBOL) was to maximize memory and simplify code. As you can, we are
> > far from doing that now. A better and much simpler solution would be
> > to have 3 fields (first, last, middle) and concatenate them only when
> > FullName is required. Using a method "GetFullName()" would further
> > clearly indicate to developers that a new object is created and so,
> > they might want to put in a temporary variable and avoid calling that
> method too many times.
> >
> > Sébastien
> >
> > > -----Original Message-----
> > > From: Discussion of advanced .NET topics. [mailto:ADVANCED-
> > > [EMAIL PROTECTED] On Behalf Of Jon Rothlander
> > > Sent: Tuesday, November 14, 2006 1:23 PM
> > > To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
> > > Subject: Re: [ADVANCED-DOTNET] Data Structures in .Net?
> > >
> > > Thanks for your response.  I like your approach this to.  This is
> > > the kind of thing that I have done in the past to support this sort
> > > of issue.  Can you tell me why you are not sure this is a good
> idea?
> > > I want to under the issues people have with this because I am
> > > working on a client's code and I want to be aware of any issues
> with
> > > this approach, as it's similar to what I have been doing.
> > >
> > > Your solution is very similar to what I have done in the past to
> > > work around this issue when supporting legacy applications in .Net.
> > > There's allot of work in translating the code when using these
> > > approach, which is what I am trying to avoid by looking at another
> > > option.  However, the other options seem to be unsafe, and I'm not
> > > sure I want to take that leap just yet.
> > > That's what I'm currently looking at.
> > >
> > > -----Original Message-----
> > > From: Discussion of advanced .NET topics.
> > > [mailto:[EMAIL PROTECTED] On Behalf Of Bob
> > > Provencher
> > > Sent: Monday, November 13, 2006 9:24 PM
> > > To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM
> > > Subject: Re: [ADVANCED-DOTNET] Data Structures in .Net?
> > >
> > > Something like this would work the way you want...
> > >
> > > public class Line
> > > {
> > >         const int LineLength = 60;
> > >         const int FirstNameOffset = 0;
> > >         const int FirstNameLength = 20;
> > >         StringBuilder sb = new StringBuilder( LineLength );
> > >
> > >         public string FirstName
> > >         {
> > >                 get
> > >                 {
> > >                         return sb.ToString( FirstNameOffset,
> > > FirstNameLength );
> > >                 }
> > >                 set
> > >                 {
> > >                         char[] inchars;
> > >                         inchars = value.ToCharArray( 0,
> value.Length );
> > >                         for ( int i = 0; i < sb.Length; i++ )
> > >                         {
> > >                                 if ( i < value.Length )
> > >                                 {
> > >                                         sb.Chars[ i ] =
> inchars[ i ];
> > >                                 }
> > >                                 else
> > >                                 {
> > >                                         sb.Chars[ i ] = ' ';
> > >                                 }
> > >                         }
> > >                 }
> > >         }
> > >
> > > }
> > >
> > > But I'm not sure doing this is a good idea...
> >
> > ===================================
> > This list is hosted by DevelopMentor(r)  http://www.develop.com
> >
> > View archives and manage your subscription(s) at
> > http://discuss.develop.com
> >
> 
> 
> --
> If knowledge can create problems, it is not through ignorance that we
> can solve them.
> 
> Isaac Asimov
> 
> ===================================
> This list is hosted by DevelopMentor®  http://www.develop.com
> 
> View archives and manage your subscription(s) at
> http://discuss.develop.com

===================================
This list is hosted by DevelopMentor®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to