digitalmars.D.learn - static array length
- Saaa (8/8) Jan 29 2008 Isn't it possible to make the .length variable for static arrays.
- bearophile (5/14) Jan 30 2008 Thanks to your questions the thread regarding the string literals have s...
- Saaa (10/36) Jan 31 2008 A static string still has the .length info somewhere.
- bearophile (4/5) Jan 31 2008 The compiler knows it, but it may be absent in the compiled code.
- Saaa (3/8) Jan 31 2008 Are you sure about this?
- Christopher Wright (3/6) Jan 31 2008 If you disassemble it, it might be:
- Saaa (5/11) Jan 31 2008 Ok, thanks :)
- Jarrett Billingsley (5/10) Jan 31 2008 c[0 .. 4] = `1234`;
- Saaa (8/12) Jan 31 2008 If I'd know the lenght I would just do :)
- Jarrett Billingsley (5/13) Jan 31 2008 So, in other words, you're re-implementing dynamic arrays?
- Saaa (2/6) Jan 31 2008
- Jarrett Billingsley (9/11) Jan 31 2008 So you want a string buffer on the stack, or what? If it's on the stack...
- bearophile (5/6) Jan 31 2008 You can allocate memory on the stack with alloca() too.
- Saaa (2/7) Feb 01 2008
- bearophile (4/6) Feb 01 2008 I don't know why, but you can write a little benchmark in 5 minutes to s...
- Saaa (2/8) Feb 01 2008
- downs (3/4) Jan 31 2008 Nope - if it's static, the length info is derived from the type - so if ...
Isn't it possible to make the .length variable for static arrays. Its ofcourse an error to make it longer than the original size (extra property?) char[100] c; c[0..4]='1234`; and maybe this: c=`1234`; // implicit length adjustment. Or would this break something?
Jan 29 2008
Saaa:Isn't it possible to make the .length variable for static arrays. Its ofcourse an error to make it longer than the original size (extra property?) char[100] c; c[0..4]='1234`; and maybe this: c=`1234`; // implicit length adjustment. Or would this break something?Thanks to your questions the thread regarding the string literals have shown me that there are things I have to learn still regarding strings, but you can answer most of your own questions when you know a bit what the hidden array implementation is. Static arrays are nude chunks of data (probably with some information for the GC and sometimes the memory allocator of the OS too), probably allocated on the stack with alloca(), while dynamic arrays are structs of <pointer, length> allocated on the stack that point to a chunk of memory on the heap (I don't know if this is true for string literals too). The length of the static array is a compile time constant, and it's virtual at runtime, so you can't change it at runtime. (Tuples too exists only at compile time. At runtime they are just a scattered group of variables with a common way to index them). Often knowing how things are implemented and run on the level just below the one you use is all you need to program effectively :-) Bye, bearophile
Jan 30 2008
A static string still has the .length info somewhere. Thinking about it again, it won't work on static multidimentional arrays as changing one of the lengths would corrupt the way data is accessed. I don't suggest that the actual internal size of the array would be changed, just the .length value. It would make working with strings a lot simpler, or maybe I'm missing some nice way to do this: char[100] c; c=`1234`; writefln(c); //even with c[0..4]=`1234`, this will crashSaaa:Isn't it possible to make the .length variable for static arrays. Its ofcourse an error to make it longer than the original size (extra property?) char[100] c; c[0..4]='1234`; and maybe this: c=`1234`; // implicit length adjustment. Or would this break something?Thanks to your questions the thread regarding the string literals have shown me that there are things I have to learn still regarding strings, but you can answer most of your own questions when you know a bit what the hidden array implementation is. Static arrays are nude chunks of data (probably with some information for the GC and sometimes the memory allocator of the OS too), probably allocated on the stack with alloca(), while dynamic arrays are structs of <pointer, length> allocated on the stack that point to a chunk of memory on the heap (I don't know if this is true for string literals too). The length of the static array is a compile time constant, and it's virtual at runtime, so you can't change it at runtime. (Tuples too exists only at compile time. At runtime they are just a scattered group of variables with a common way to index them). Often knowing how things are implemented and run on the level just below the one you use is all you need to program effectively :-) Bye, bearophile
Jan 31 2008
Saaa:A static string still has the .length info somewhere.The compiler knows it, but it may be absent in the compiled code. Bye, bearophile
Jan 31 2008
Are you sure about this? Because I can do: writefln(c.length);Saaa:A static string still has the .length info somewhere.The compiler knows it, but it may be absent in the compiled code. Bye, bearophile
Jan 31 2008
Saaa wrote:Are you sure about this? Because I can do: writefln(c.length);If you disassemble it, it might be: writefln(some_integer_constant);
Jan 31 2008
Ok, thanks :) that just leaves me with a good way to do this: char[100] c; c[0..4]=`1234`; writefln(c);Saaa wrote:Are you sure about this? Because I can do: writefln(c.length);If you disassemble it, it might be: writefln(some_integer_constant);
Jan 31 2008
"Saaa" <empty needmail.com> wrote in message news:fnsgfv$1gti$1 digitalmars.com...Ok, thanks :) that just leaves me with a good way to do this: char[100] c; c[0..4]=`1234`; writefln(c);c[0 .. 4] = `1234`; char[] d = c[0 .. 4]; writefln(d);
Jan 31 2008
If I'd know the lenght I would just do :) c[0 .. 4] = `1234`; writefln( c[0 .. 4]); I'm looking into making use of: struct charS{ char c; int leng; }c[0 .. 4] = `1234`; char[] d = c[0 .. 4]; writefln(d);
Jan 31 2008
"Saaa" <empty needmail.com> wrote in message news:fnsmjb$1vsq$1 digitalmars.com...If I'd know the lenght I would just do :) c[0 .. 4] = `1234`; writefln( c[0 .. 4]); I'm looking into making use of: struct charS{ char c; int leng; }So, in other words, you're re-implementing dynamic arrays? What I'm wondering is why you need this? What is it that you're trying to do?
Jan 31 2008
Except that it will be on the stack :) I'll be testing the speed difference.So, in other words, you're re-implementing dynamic arrays? What I'm wondering is why you need this? What is it that you're trying to do?
Jan 31 2008
"Saaa" <empty needmail.com> wrote in message news:fntlub$1iq8$1 digitalmars.com...Except that it will be on the stack :) I'll be testing the speed difference.So you want a string buffer on the stack, or what? If it's on the stack and you're doing a lot of operations that would otherwise involve concatenations, it'll be faster. If it's in a function that's called a lot, it'll be faster, since no heap allocation will occur. But, then you're limited by the size of the array, and you can't use the same things -- no concatenations, namely. It's a tradeoff of syntactic niceness and flexibility of size vs. speed.
Jan 31 2008
Saaa:I'll be testing the speed difference.You can allocate memory on the stack with alloca() too. It may sound strange, but iterating on a dynamic array is often a bit faster. Bye, bearophile
Jan 31 2008
Yes, that does sound strange. Do you know why this is the case?You can allocate memory on the stack with alloca() too. It may sound strange, but iterating on a dynamic array is often a bit faster. Bye, bearophile
Feb 01 2008
Saaa:Yes, that does sound strange. Do you know why this is the case?I don't know why, but you can write a little benchmark in 5 minutes to see if it's true on your PC too :-) Bye, bearophile
Feb 01 2008
I'll do that, but my computer isn't that prototypical that I can use the outcome as a standard for all my customers :DYes, that does sound strange. Do you know why this is the case?I don't know why, but you can write a little benchmark in 5 minutes to see if it's true on your PC too :-) Bye, bearophile
Feb 01 2008
Saaa wrote:A static string still has the .length info somewhere.Nope - if it's static, the length info is derived from the type - so if you type "foob".length, that's replaced at compile time. --downs
Jan 31 2008