@beduin01

Как хранятся алгебраические типы данных?

Прочитал несколько статей на Хабре, но они все с уклоном в Хаскель. Я не могу разобраться как хранятся алгебраические типы данных. Вот кусок кода на С++ про это.

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

using var_t = std::variant<int, long, double, std::string>;
std::vector<var_t> vec = {10, 15l, 1.5, "hello"};

for (auto& v: vec) {
    std::visit(overloaded {
        [](auto arg) { std::cout << arg << ' '; },
        [](double arg) { std::cout << std::fixed << arg << ' '; },
        [](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
    }, v);
}


Как я понимаю создается какой-то контейнер (переменаня) в которую помещаются указатели на элементы в куче, которые могут быть заранее определенными типами (иначе - ошибка). Я правильно понимаю?
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
en.cppreference.com/w/cpp/utility/variant
As with unions, if a variant holds a value of some object type T, the object representation of T is allocated directly within the object representation of the variant itself. Variant is not allowed to allocate additional (dynamic) memory.

В то же время
en.cppreference.com/w/cpp/container/vector
The elements are stored contiguously, which means that elements can be accessed not only through iterators, but also using offsets to regular pointers to elements.


Это всё значит, что вся память аллоцируется только в одном месте, элементы хранятся сами, а не указателями.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы