Setting a hard limit on slice size, is this possible?

Tejas notrealemail at gmail.com
Sat Aug 7 07:32:04 UTC 2021


On Friday, 6 August 2021 at 22:15:00 UTC, Paul Backus wrote:
> On Friday, 6 August 2021 at 19:03:53 UTC, Tejas wrote:
>>
>> 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);
>> }
>> ```
>
> You can actually pass the alignment as a parameter too:
>
> ```d
> struct Aligned(T, size_t alignment)
>     if (alignment >= T.alignof)
> {
>     align(alignment) T payload;
>     alias payload this;
> }
>
> void main()
> {
>     Aligned!(int, 16)[4] x;
>     assert(x.alignof == 16);
>     assert(x.sizeof == 64);
>
>     Aligned!(int[4], 16) y;
>     assert(y.alignof == 16);
>     assert(y.sizeof == 16);
> }
> ```

Is the second example really correct? if the alignment of 
```int[4]``` really is 16, then why isn't the size of it 64 as 
well? It seems that the alignment constraint is not being 
satisfied _within_ the array,

And if it really is correct, then it seems once again that static 
arrays are the answer after all:

```d
align(your_alignment) int[your_length] array;
```
No need for structs \\('_')/


More information about the Digitalmars-d-learn mailing list