xsimd

Alignment of fixed-size members

Note

If you are using C++ >= 17 you should not have to worry about this.

If you define a structure having members of fixed-size xtensor types, you must ensure that the buffers properly aligned. For this you can use the macro XTENSOR_SELECT_ALIGN available in xtensor/xtensor_config.hpp. Consider the following example:

template <typename T>
class alignas(XTENSOR_SELECT_ALIGN(T)) Foo
{
public:

    using allocator_type = std::conditional_t<XTENSOR_SELECT_ALIGN(T) != 0,
                                              xt_simd::aligned_allocator<T, XTENSOR_SELECT_ALIGN(T)>,
                                              std::allocator<T>>;

    Foo(T fac) : m_fac(fac)
    {
        m_bar.fill(fac);
    }

    auto get() const
    {
        return m_bar;
    }

private:

    xt::xtensor_fixed<T, xt::xshape<10, 10>> m_bar;
    T m_fac;
};

Whereby it is important to store the fixed-sized xtensor type (in this case xt::xtensor_fixed<T, xt::xshape<10, 10>>) as first member.