Skip to content

Commit 8230987

Browse files
committed
Fix detail::alignment_for(size)
It must always be divisible by the size.
1 parent 5540972 commit 8230987

2 files changed

Lines changed: 15 additions & 8 deletions

File tree

src/detail/align.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ bool foonathan::memory::detail::is_aligned(void* ptr, std::size_t alignment) noe
1212
{
1313
FOONATHAN_MEMORY_ASSERT(is_valid_alignment(alignment));
1414
auto address = reinterpret_cast<std::uintptr_t>(ptr);
15-
return address % alignment == 0u;
15+
return (address & (alignment - 1)) == 0u;
1616
}
1717

1818
std::size_t foonathan::memory::detail::alignment_for(std::size_t size) noexcept
1919
{
20-
return size >= max_alignment ? max_alignment : (std::size_t(1) << ilog2(size));
20+
auto largest_possible_alignment = size & -size;
21+
return largest_possible_alignment > max_alignment ? max_alignment : largest_possible_alignment;
2122
}

test/detail/align.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,18 @@ TEST_CASE("detail::alignment_for")
5454
static_assert(max_alignment >= 8, "test case not working");
5555
REQUIRE(alignment_for(1) == 1);
5656
REQUIRE(alignment_for(2) == 2);
57-
REQUIRE(alignment_for(3) == 2);
57+
REQUIRE(alignment_for(3) == 1);
5858
REQUIRE(alignment_for(4) == 4);
59-
REQUIRE(alignment_for(5) == 4);
60-
REQUIRE(alignment_for(6) == 4);
61-
REQUIRE(alignment_for(7) == 4);
59+
REQUIRE(alignment_for(5) == 1);
60+
REQUIRE(alignment_for(6) == 2);
61+
REQUIRE(alignment_for(7) == 1);
6262
REQUIRE(alignment_for(8) == 8);
63-
REQUIRE(alignment_for(9) == 8);
64-
REQUIRE(alignment_for(100) == max_alignment);
63+
REQUIRE(alignment_for(9) == 1);
64+
REQUIRE(alignment_for(10) == 2);
65+
REQUIRE(alignment_for(12) == 4);
66+
REQUIRE(alignment_for(13) == 1);
67+
REQUIRE(alignment_for(14) == 2);
68+
REQUIRE(alignment_for(15) == 1);
69+
REQUIRE(alignment_for(16) == max_alignment);
70+
REQUIRE(alignment_for(1024) == max_alignment);
6571
}

0 commit comments

Comments
 (0)