Bug 10527 – Eliding more postblit constructor calls
Status
RESOLVED
Resolution
WONTFIX
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-07-03T03:51:18Z
Last change time
2022-04-12T12:16:15Z
Assigned to
No Owner
Creator
Tommi
Comments
Comment #0 by tommitissari — 2013-07-03T03:51:18Z
Definitions:
1) 'Str' is a struct type which has a postblit constructor
2) 'var' is a variable whose unqualified type is Str
3) 'cpy' is a copy of the variable var
Proposed language change:
Whenever a copy is made from var to cpy (either by making a new variable or by passing var to a function by value) and the compiler can determine (either through analysing code or by deduction from a function signature) that during the lifetime of cpy, no mutation is done to var nor to any data reachable from it, the language should guarantee these two things:
1) cpy's postblit constructor is omitted when cpy is constructed
2) cpy's destructor is omitted when cpy goes out of scope
Examples:
Here are some examples, where the compiler can deduce that it's safe to omit the postblit and destructor of cpy by merely looking at the function signature:
1)
int foo(T, U)(const Str cpy, const T t, immutable U u) pure { }
2)
void foo(T, U)(immutable Str cpy, T t, U u) { }
Comment #1 by tommitissari — 2013-07-03T04:12:00Z
(In reply to comment #0)
> [..] the language should guarantee these two things:
> 1) cpy's postblit constructor is omitted when cpy is constructed
> 2) cpy's destructor is omitted when cpy goes out of scope
Let's change this proposal so that the language would guarantee to do those optimisations only when it can deduce that it can be done from looking at function signatures. And the compiler can choose whether or not it wants to try to do more postblit/destructor elisions through static analysis.
Comment #2 by tommitissari — 2013-07-03T06:55:55Z
(In reply to comment #0)
> 2) 'var' is a variable whose unqualified type is Str
By this I mean:
is(std.traits.Unqual!(typeof(var)) == Str)
Comment #3 by razvan.nitu1305 — 2022-04-12T12:16:15Z
Postblit has design flaws so it should not be used anymore. The copy constructor should be used instead.