Then that would mean the "fixed" keyword works differently when used with
buffers, which I would find strange. See
http://msdn2.microsoft.com/en-us/library/f58wzh21.aspx.

I admit I have not done actual tests on this, so you may be right.

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