need help to translate C into D

test123 test123 at gmail.com
Wed Sep 14 04:57:43 UTC 2022


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.














More information about the Digitalmars-d-learn mailing list