why std.stdio.File is a struct?

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Sat Oct 22 23:36:21 PDT 2016


On Sunday, October 23, 2016 06:13:29 lumpyzhu via Digitalmars-d wrote:
> thanks..
> but structs are copy by value,
> In C++, I can use reference to avoid value-copy,
>
> ------------------------------------------
> class MyClass {....};
> void myFunc(const MyClass& a, MyClass& b) {...};
>
> {
>        MyClass object;
>        myFunc(object);
>        // f will destroyed here.
> }
> ------------------------------------------
> in c++, I know where the object is destroyed..
> but how to convert this c++ code to d?

You can mark a parameter as ref, and you get something similar to C++'s &,
except that it only works on parameters, return types, and the variable for
the current element in a foreach loop (you can't declare local variables
that are ref), and ref parameters only ever accept lvalues, even if they're
const. e.g.

void foo(ref int i) {...}

ref int bar() { return _i; }

foreach(i, ref e; arr) {...}

I think that most D code just passes structs around without worrying about
the cost of copying unless the struct is particularly large or profiling has
shown that copying it is too expensive. For a lot of stuff, it simply isn't
a problem. And when it is, there's ref, or the struct can be put on the heap
and passed around by pointer. But because we don't have an equivalent for
const& that accepts rvalues, using ref simply to avoid copying can get
annoying. So, it doesn't make much sense to do it unless it's actually
necessary (whereas a lot of C++ code does it just in case it matters).

There is talk of possibly adding a way to pass rvalues by ref in D, in which
case, you would get something similar to C++ const&, but there are problems
caused by C++'s approach that we don't want in D, and D's const is enough
more restrictive than C++ const that whatever we do can't be tied to const.

- Jonathan M Davis



More information about the Digitalmars-d mailing list