Setting a hard limit on slice size, is this possible?
Tejas
notrealemail at gmail.com
Fri Aug 6 19:03:53 UTC 2021
On Friday, 6 August 2021 at 18:02:01 UTC, james.p.leblanc wrote:
> mes
> On Friday, 6 August 2021 at 17:25:24 UTC, Tejas wrote:
>>
>> Okay we were overthinking the solution.
>>
>> Just use a static array
>>
>> ```d
>> int[your_max_length]/*or whatever type*/ var;
>> ```
>>
>> You're good to go!
>>
>> I almost feel stupid now lol
>
> Hello Tejas,
>
> Kind thanks for your replies ... all are appreciated.
>
> However, do NOT feel stupid ... the motivation behind why
> I cannot use a standard int[your_max_length] (in other words,
> use a static array), is because I need to do a specified
> memory alignment (known at compile time) on my slice, or array.
>
> I understand that neither a slice or an array is capable to
> doing
> an arbitrary memory alignment. (But, perhaps I am wrong about
> this ...)
>
> I believe structs can be aligned, but need to learn more about
> the speicific of that.
>
> In the meantime, I have written a way to get an aligned slice
> from a
> static array. Ugly beginner code is below. While I believe
> this basic
> idea should work, I would like to guarantee that my slice does
> not get
> moved in memory (destroying the alignment).
>
> Ugly code here:
>
> ----------------------------------------------
>
> import std.stdio;
>
> enum MAXLENGTH = 1024;
> enum ALIGN = 128;
>
> void main(){
>
> // static array to allow creation of aligned slice
> ubyte[MAXLENGTH+ALIGN] u;
>
> writeln("u.ptr: ", u.ptr);
> auto u_i = cast(ulong) u.ptr;
>
> auto u_excess = u_i%ALIGN;
> writeln("u_excess: ", u_excess);
>
> ulong mustadd;
> if(u_excess !=0){
> mustadd = ALIGN-u_excess;
> }
> writeln("mustadd: ", mustadd);
>
> // create aligned pointer for our needed slice
> auto zp = cast(double*) (u.ptr + mustadd);
>
> // create slice
> double[] z = zp[0 .. MAXLENGTH];
> writeln("z.ptr: ", z.ptr);
> writeln("z.length: ", z.length);
> auto z_i = cast(ulong) z.ptr;
> auto z_excess = z_i%ALIGN;
> writeln("z_excess: ", z_excess);
> }
If you're being that specialized, don't bother with fundamental
data types, the hunt for simplicity will lead you to create very
complex things.
As HS Teoh said, take a look at ```align```:
https://dlang.org/spec/attribute.html#align
Stealing Paul's answer now:
```d
import std;
enum your_max_length = 1000;
enum your_align = 256;
struct MySlice(T/*, size_t maxLength*/)
{
private align(your_align)T payload;
//invariant(payload.length <= maxLength);
//this(T[] slice) { payload = slice; }
//T opIndex(size_t i) { return payload[i]; }
}
void main()
{
MySlice!(int/*, 1000*/)[your_max_length] slice;
writeln(slice.sizeof);
}
```
More information about the Digitalmars-d-learn
mailing list