summaryrefslogtreecommitdiffstats
path: root/src/include/unaligned_memory.h
blob: 27b2f193f902e450f1647d5fbbdfc561f75e5994 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef UNALIGNED_MEMORY_H
#define UNALIGNED_MEMORY_H

#include <cstring>

/**
 * UnalignedMemory: Safe unaligned memory access.
 * 
 * Some instruction sets, or some instructions in some instruction sets
 * require that memory access is aligned to a specific boundary. These
 * instructions may trap on unaligned access.
 * 
 * This class provides methods to load and store values at unaligned
 * addresses. It ensures that the compiler doesn't generate instructions
 * that could trap on the unaligned memory access.
 */

namespace pinyin{
    template <typename T>
    class UnalignedMemory{
    public:
        /**
         * Read a value from a possibly unaligned memory address.
         * 
         */
        static T load(const void * src) {
            T value;
            memcpy(&value, src, sizeof(T));
            return value;
        }

        /**
         * Store a value into a possibly unaligned memory address.
         * 
         */
        static void store(T value, void * dest) {
            memcpy(dest, &value, sizeof(T));
        }
    };
};


#endif