Generating struct .init at run time?

kinke noone at nowhere.com
Thu Jul 2 10:37:27 UTC 2020


On Thursday, 2 July 2020 at 07:51:29 UTC, Ali Çehreli wrote:
> Of course, the solution is to define members with '= void'

Since when? https://issues.dlang.org/show_bug.cgi?id=11331 and 
your https://issues.dlang.org/show_bug.cgi?id=16956 are still 
open.

For recent LDC versions, the 'solution' is to (statically) 
initialize the array with zeros, as fully zero-initialized 
structs don't feature any explicit .init symbols anymore.

> enum elementCount = 1024 * 1024;
>
> struct S {
>   double[elementCount] a = void;  // <-- HERE
> }
>
> void main() {
>     S s;
>     assert(typeid(S).initializer.length == double.sizeof * 
> elementCount);
>     assert(typeid(S).initializer.ptr is null);
> }
>
> Now the program binary is 800M shorter.

So you're saying you have a *stack* that can deal with an 800M 
struct (assuming you used a different `elementCount` for the 
actual tests)?! Even 8 MB should be too large without extra 
compiler/linker options, as that's the default stack size on 
Linux IIRC (on Windows, 2 MB IIRC).

I don't think a struct should ever be that large, as it can 
probably only live on the heap anyway and only passed around by 
refs. I'd probably use a thin struct instead, containing and 
managing a `double[]` member (or `double[elementCount]*`).


More information about the Digitalmars-d-learn mailing list