Constructing a class in-place
Johan Engelen
j at j.nl
Sat Jul 28 08:49:14 UTC 2018
On Thursday, 26 July 2018 at 21:22:45 UTC, Petar Kirov
[ZombineDev] wrote:
>
> Please excuse if my question is too naive, but how does this
> change anything?
The main insight is to reason about things in terms of language
semantics, not in terms of actual memory addresses and
instructions as processed by the CPU. Then reread my post. I am
not talking about disallowing storing different objects in the
same physical hardware memory location: the language spec says
nothing about that, and it shouldn't.
> Nothing stops the same bytes from being reused for another
> object of a different type.
Here you are talking about physical memory bits, which is none of
the language's business. So in practice, of course memory will be
reused. But (most of) that should be transparent to D's language
semantics.
> D on the other hand is (or at least I'm hopeful that it is)
> moving away giving magical powers to its runtime or standard
> library and is its embracing the spirit of bare bones systems
> programming where the programmer is allowed or even encouraged
> to implement everything from scratch (cref -betterC) for when
> that is the most sensible option.
This is a matter of opinion I guess. But why wouldn't you just
program in assembly? For example, things like
`__traits(isReturnOnStack)` don't make sense in a high level
language like D. Some machines don't have a stack. In other
cases, the decision whether to return something on the stack can
be delayed until optimization for better performance. I see you
mention LTO; forget about _any_ optimization and high-level
language features, if you care about controlling what the machine
is doing.
> While C and C++ approach portability by abstracting the
> machine, the approaches portability by laying all the cards on
> the table and defining things, rather than letting them be
> unspecified or at least documenting the implementation
> definition.
The kind of low-level control that you want is not what D should
give (and doesn't). With "laying cards on the table" you mean
specifying language semantics in hardware behavior? Because the
strength of most languages is in _not_ doing that. (some of the
strengths that'd be lost: cross platform, cross architecture,
performance)
Note that this is not only about optimization. It's about being
able to reason sensibly about code. You are advocating this?
```
class A { virtual void foo(); }
class B : A { ... }
class C : A { ... }
void bar(A a) {
a.foo(); // type of a is B, but turns it into C
a.foo(); // type is now C, call different foo
}
```
- Johan
More information about the Digitalmars-d
mailing list