Use new __traits(isZeroInit) to check for a null initializer at compile time instead of runtime

This commit is contained in:
Nathan Sashihara 2018-10-19 02:20:13 -04:00
parent 3b5709821a
commit 4e8c9bd28f
2 changed files with 20 additions and 5 deletions

View File

@ -89,13 +89,20 @@ do
static if (hasElaborateCopyConstructor!T || hasElaborateDestructor!T) static if (hasElaborateCopyConstructor!T || hasElaborateDestructor!T)
{ {
if (typeid(T).initializer().ptr is null) static if (__VERSION__ >= 2083) // __traits(isZeroInit) available.
{ {
deinitialize!true(source); deinitialize!(__traits(isZeroInit, T))(source);
} }
else else
{ {
deinitialize!false(source); if (typeid(T).initializer().ptr is null)
{
deinitialize!true(source);
}
else
{
deinitialize!false(source);
}
} }
} }
} }

View File

@ -185,8 +185,16 @@ out(result; memory.ptr is result)
} }
else else
{ {
static const T init = T.init; static if (__VERSION__ >= 2083 // __traits(isZeroInit) available.
trustedCopy(init); && __traits(isZeroInit, T))
{
(() @trusted => memory.ptr[0 .. T.sizeof])().fill!0;
}
else
{
static immutable T init = T.init;
trustedCopy(init);
}
} }
result.__ctor(args); result.__ctor(args);
} }