diff options
author | Håvard Pettersen <havardpe@yahooinc.com> | 2022-06-20 14:27:23 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@yahooinc.com> | 2022-06-20 14:31:14 +0000 |
commit | 63362cb7a0c7e2ffc5466d5306e340354cadc838 (patch) | |
tree | 1b0ff67960a0b1060a85f7e19a1f28e1766fae52 /vespalib | |
parent | 67a941054a08d620840a636daf00097bed15af5d (diff) |
avoid unaligned access
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/memory/memory_test.cpp | 4 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/util/memory.h | 16 |
2 files changed, 14 insertions, 6 deletions
diff --git a/vespalib/src/tests/memory/memory_test.cpp b/vespalib/src/tests/memory/memory_test.cpp index 1c58da3f663..5345d98cbc7 100644 --- a/vespalib/src/tests/memory/memory_test.cpp +++ b/vespalib/src/tests/memory/memory_test.cpp @@ -168,8 +168,8 @@ TEST("require that Unaligned wrapper works as expected") { Data data; EXPECT_EQUAL(sizeof(Unaligned<uint32_t>), sizeof(uint32_t)); EXPECT_EQUAL(alignof(Unaligned<uint32_t>), 1u); - Unaligned<uint32_t> *arr = &Unaligned<uint32_t>::at(data.get(0)); - const Unaligned<uint32_t> *carr = &Unaligned<uint32_t>::at(data.cget(0)); + Unaligned<uint32_t> *arr = Unaligned<uint32_t>::ptr(data.get(0)); + const Unaligned<uint32_t> *carr = Unaligned<uint32_t>::ptr(data.cget(0)); Unaligned<uint32_t>::at(data.get(0)).write(123); Unaligned<uint32_t>::at(data.get(1)) = 456; arr[2] = 789; diff --git a/vespalib/src/vespa/vespalib/util/memory.h b/vespalib/src/vespa/vespalib/util/memory.h index f2ed6ccae3e..64428756e41 100644 --- a/vespalib/src/vespa/vespalib/util/memory.h +++ b/vespalib/src/vespa/vespalib/util/memory.h @@ -51,12 +51,20 @@ public: static_assert(std::is_trivial_v<T>); static_assert(alignof(T) > 1, "value is always aligned"); - constexpr static Unaligned &at(void *ptr) noexcept { - return *reinterpret_cast<Unaligned*>(ptr); + constexpr static Unaligned &at(void *p) noexcept { + return *reinterpret_cast<Unaligned*>(p); } - constexpr static const Unaligned &at(const void *ptr) noexcept { - return *reinterpret_cast<const Unaligned*>(ptr); + constexpr static const Unaligned &at(const void *p) noexcept { + return *reinterpret_cast<const Unaligned*>(p); } + + constexpr static Unaligned *ptr(void *p) noexcept { + return reinterpret_cast<Unaligned*>(p); + } + constexpr static const Unaligned *ptr(const void *p) noexcept { + return reinterpret_cast<const Unaligned*>(p); + } + T read() const noexcept { T value; static_assert(sizeof(_data) == sizeof(value)); |