В соответствии с этим вопросом я думал, что в c++ 17 std :: vector с распределителем по умолчанию должен обрабатывать выровненные типы. Однако следующий код
#include <iostream>
#include <iterator>
#include <array>
#include <vector>
template<typename T, size_t N, size_t Alignment>
struct alignas(Alignment) AlignedArray : public std::array<T, N>
{
friend std::ostream& operator<<(std::ostream& o, const AlignedArray& a)
{
std::copy(a.cbegin(), a.cend(), std::ostream_iterator<T>(o, " "));
return o;
}
};
int main()
{
using Array = AlignedArray<double, 24, 64>;
std::vector<Array> v(10);
for(const auto& e : v)
{
auto arr(e);
std::cout << arr << std::endl;
}
return 0;
}
segfaults о создании arr
когда я скомпилирую его с помощью clang 6.0.1 и -mavx
. Без переключателя -mavx
он работает нормально (CPU - E5-2697 v2). Я скомпилировал его с помощью clang++ -I<path_to_libcxx>/include/c++/v1 -g -mavx -std=c++17 main.cpp -stdlib=libc++ -Lc++abi -o alignastest -L<path_to_libcxx>/lib -L<path_to_libcxxabi>/lib
. Я запускаю это на старом RHEL 6.9, где компилировал clang 6.0.1 и libcxx, libcxxabi. Я тестировал его на другой системе (Ubuntu 18.10, gcc 8), и он работает без проблем.
Субъект
Что касается выравнивания, я обнаружил, что реализация std::aligned_alloc
в lib c++ основана на функции C11, которая включена только с последней версией glibc (__config.h
):
#if __GLIBC_PREREQ(2, 17)
#define _LIBCPP_HAS_C11_FEATURES
#endif
К сожалению, у RHEL 6.9 установлен только ldd (GNU libc) 2.12
. Является ли alignas
также в зависимости от версии glibc?