У меня небольшая проблема с памятью в C ++ 17 с использованием компиляции Clang для x64. Так как я работаю с копиями памяти низкого уровня на специализированном оборудовании, я действительно зависим от того, как память выровнена, как ожидалось. Я недавно перешел из Visual Studio в Clang и столкнулся со следующей проблемой:
См. Следующий код:
struct ContainerRoot{};
template<size_t t_size, class t_type>
struct Container : public ContainerRoot
{
t_type contents[t_size];
};
static_assert(sizeof(Container<1, double>) == 8); //This works as expected
static_assert(sizeof(Container<4, double>) == 32); //This works as expected
static_assert(sizeof(Container<16, double>) == 128); //This works as expected
static_assert(sizeof(Container<4, Container<4, double>>) == 128); //This fails.
В приведенном выше примере sizeof (Container ) на самом деле 136 (дополнительные 8 байт). Мой вопрос: почему добавляются дополнительные 8 байтов, и можно ли этого избежать? Я хотел бы использовать компилятор Clang, но если для этого нет обходного пути, возможно, не стоит переписывать весь код, связанный с отправкой этих данных на специализированное оборудование.
Пока что у меня есть проверено с использованием std :: is_polymorphi c >> () только для того, чтобы подтвердить, что в класс не было добавлено виртуальной таблицы поиска.