summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@yahooinc.com>2022-06-20 14:27:23 +0000
committerHåvard Pettersen <havardpe@yahooinc.com>2022-06-20 14:31:14 +0000
commit63362cb7a0c7e2ffc5466d5306e340354cadc838 (patch)
tree1b0ff67960a0b1060a85f7e19a1f28e1766fae52 /vespalib
parent67a941054a08d620840a636daf00097bed15af5d (diff)
avoid unaligned access
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/memory/memory_test.cpp4
-rw-r--r--vespalib/src/vespa/vespalib/util/memory.h16
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));