On Tuesday, 13 September 2022 at 23:34:33 UTC, Ali Çehreli wrote:
On 9/13/22 04:07, test123 wrote:
> On Tuesday, 13 September 2022 at 10:59:36 UTC, Dennis wrote:

>> Side node, you can use `immutable` instead of `__gshared
const`, it
>> amounts to the same for global variables.
>
> because __enums_layout.ptr need to be part of other object,
and this
> const ptr cloud be included in multi objects.

There may be valid reasons not to use 'immutable' but you can still do what you describe. There is an 'immutable' array below and its .ptr is being stored as 'const' inside objects of another struct.

struct S {
    int i;
    string s;
    int[3] arr;
}

immutable S[] imm;

shared static this() {
    // Initializing immutable at program initialization time:
    imm ~= S(42, "hello", [1,2,3]);
    imm ~= S(7, "world", [4,5,6]);
}

struct Other {
    const S * ptr;
}

void main() {
    auto o = Other(imm.ptr);
}

That works because 'const' can point to 'immutable' (and mutable and const).

Ali

Thanks for the tips.

This is for a protobuf module and the `int[3] arr;` is variable, (diff size struct cloud in same group), and each struct is reused in multi part. (and the total number can be big depend on GRPC model)

with `shared static this` the size is increased, and there is a lot depends relation need resolve during the protobuf init time. (the best solution is provide __gshared const relation map so no runtime cost, the C code way)


What I can see, the best solution to fix this is allow take address of member `__gshared const struct` like this:

```d
struct Header {
      int a;
      int b;
}
struct Message {
     Header header;
     uint[a] arr;
}
__gshared const Message type1 = {{1,2}, [3,4]};
__gshared const header_ptr = &type1.header;

// then you can reuse header_ptr in multi other __gshared const

```

D dont need change to support `C struct array`, and all relation is const safe in memory. (not able to write into this section of memory)



Current D support get `__gshared const struct` address, but not member of `__gshared const struct` address. if you do so it will throw error:


```sh
expression &c(3u, 4u).a is not a constant
```


If you can `cast` the member address by the struct.offsetof, then this type error you get:

```sh
Error: reinterpreting cast from `const(validate_KnownRegex_enum_init_type)*` to `const(upb_MiniTable_Enum)*` is not supported in CTFE
```


I can not think of the reason why prevent get const member address of `__gshared const struct`. and can not think of a workaround to bypass this problem.












Reply via email to