On Thursday, 20 October 2016 at 07:40:05 UTC, Jonathan M Davis
wrote:
On Thursday, October 20, 2016 06:59:12 lumpyzhu via
Digitalmars-d wrote:
std.stdio.File has reference counter inside,
why not std.stdio.File is class?
By using a struct with a reference count, you get deterministic
destruction, and the file will be closed as soon as the
reference count hits zero. If it were a class, then it would
only be closed when the GC happened to collect the memory, and
there's no guarantee that it will _ever_ collect the memory
(e.g. the GC normally only runs when you call new, so if you
never allocate memory again after allocating the File, then the
GC will never collect it even if nothing refers to it anymore).
User-defined types that manage system resources are pretty much
always better off as structs so that they can have
deterministic destruction. Java and C# have a terrible time
with stuff like closing files, essentially requiring you to do
it manually, because there's no guarantee that the finalizers
for their file classes will ever run, and you risk the resource
never being released until the program terminates, which can be
a big problem. We'd have the same problem if we used a class
for std.stdio.File, whereas using a struct works great.
In general, in D, if you don't need inheritance and
polymorphism, you probably shouldn't be using a class.
- Jonathan M Davis
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?