From 4a09c7d87b871b9056d97719f03ee03ef786bc44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Ferreira?= Date: Tue, 20 Sep 2022 00:21:18 +0100 Subject: [PATCH 1/2] chore(allocator): make and makeArray should allocate aligned memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luís Ferreira --- std/experimental/allocator/package.d | 32 ++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/std/experimental/allocator/package.d b/std/experimental/allocator/package.d index 7dbc47a6f02..c15de4aff33 100644 --- a/std/experimental/allocator/package.d +++ b/std/experimental/allocator/package.d @@ -1170,7 +1170,10 @@ auto make(T, Allocator, A...)(auto ref Allocator alloc, auto ref A args) import std.algorithm.comparison : max; static if (!is(T == class) && !is(T == interface) && A.length == 0 && __traits(compiles, {T t;}) && __traits(isZeroInit, T) - && is(typeof(alloc.allocateZeroed(size_t.max)))) + && is(typeof(alloc.allocateZeroed(size_t.max))) + && (!is(typeof(alloc.alignedAllocate(size_t.max, uint.max))) || + ( is(typeof(alloc.alignedAllocate(size_t.max, uint.max))) && Allocator.alignment == T.alignof) + )) { auto m = alloc.allocateZeroed(max(T.sizeof, 1)); return (() @trusted => cast(T*) m.ptr)(); @@ -1180,7 +1183,22 @@ auto make(T, Allocator, A...)(auto ref Allocator alloc, auto ref A args) import core.internal.lifetime : emplaceRef; import core.lifetime : emplace; - auto m = alloc.allocate(max(stateSize!T, 1)); + static if (is(typeof(alloc.alignedAllocate(size_t.max, uint.max)))) + { + static if(is(T == class)) + { + import std.traits : classInstanceAlignment; + auto m = alloc.alignedAllocate(max(stateSize!T, 1), classInstanceAlignment!T); + } + else + { + auto m = alloc.alignedAllocate(max(stateSize!T, 1), T.alignof); + } + } + else + { + auto m = alloc.allocate(max(stateSize!T, 1)); + } if (!m.ptr) return null; // make can only be @safe if emplace or emplaceRef is `pure` @@ -1593,14 +1611,20 @@ T[] makeArray(T, Allocator)(auto ref Allocator alloc, size_t length) if (overflow) return null; } - static if (__traits(isZeroInit, T) && hasMember!(Allocator, "allocateZeroed")) + static if (__traits(isZeroInit, T) + && hasMember!(Allocator, "allocateZeroed") + && !hasMember!(Allocator, "alignedAllocate") + ) { auto m = alloc.allocateZeroed(nAlloc); return (() @trusted => cast(T[]) m)(); } else { - auto m = alloc.allocate(nAlloc); + static if (hasMember!(Allocator, "alignedAllocate")) + auto m = alloc.alignedAllocate(nAlloc, T.alignof); + else + auto m = alloc.allocate(nAlloc); if (!m.ptr) return null; alias U = Unqual!T; return () @trusted { return cast(T[]) uninitializedFillDefault(cast(U[]) m); }(); From f3d86694679c6dd617267450771bad9275edde47 Mon Sep 17 00:00:00 2001 From: Elias Batek Date: Wed, 1 Jan 2025 20:41:04 +0100 Subject: [PATCH 2/2] Fix style --- std/experimental/allocator/package.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/experimental/allocator/package.d b/std/experimental/allocator/package.d index c15de4aff33..03d569bca2c 100644 --- a/std/experimental/allocator/package.d +++ b/std/experimental/allocator/package.d @@ -1185,7 +1185,7 @@ auto make(T, Allocator, A...)(auto ref Allocator alloc, auto ref A args) static if (is(typeof(alloc.alignedAllocate(size_t.max, uint.max)))) { - static if(is(T == class)) + static if (is(T == class)) { import std.traits : classInstanceAlignment; auto m = alloc.alignedAllocate(max(stateSize!T, 1), classInstanceAlignment!T);