Structs should not contain pointers to internal data

Jonathan M Davis jmdavisProg at gmx.com
Sun Jun 2 22:38:00 PDT 2013


On Monday, June 03, 2013 10:23:43 Saurabh Das wrote:
> Hello Learn-D,
> 
> I'm new to D from a C/C++ background. One caveat of defining structs in D
> that I came across was that structs should be bit-wise relocatable and
> hence should not contain pointers to internal data members.
> 
> So that essentially means that code of the form (below) is disallowed.
> 
> struct S1
> {
>     int x;
>     int* p = &x;
> }
> 
> What I'm wondering is, are references also disallowed? As in:
> 
> struct S2
> {
>     int x;
>     ref int p = x;
> }
> 
> I ask this because in C++, I have a telemetry class which publishes the
> value of any member variable over TCP. I was trying to achieve similar
> functionality in D and am wondering how to go about designing it.

It's not legal to use ref on local variables, just function parameters, so 
it's not even a question of whether a struct can have a ref to itself. It 
can't have a ref in the first place.

> Ideally I'd like to have:
> 
> struct Telemetry(T) ...
> 
> struct UsefulStruct
> {
>     int importantValue;
>     auto tel1 = Telemetry!int(importantValue);
> }
> 
> Essentially I'm asking whether the above is a valid construct in D.

Well, you could pass importantValue by ref to Telemetry's constructor, but 
since it's impossible for it to keep a ref to it, you're not going to run into 
problems with UsefulStruct having a reference to itself or Telemetry having a 
reference to anything in UsefulStruct. You're only option is pointers, and you 
can't do anything that won't work if a struct is moved with a bitwise copy, or 
you'll have nasty bugs.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list