Я хочу определить структуру, например. type
, так что sizeof(type)
не меньше некоторого значения.Определить структуру с минимальным размером
Мотивация:
У меня есть вектор std::vector<type>
и я удалить некоторые элементы из него. Кроме того, я сохранил индексы некоторых элементов в других местах, поэтому хочу просто пометить его как не использованный и повторно использовать его в будущем. Это приводит меня к тому, чтобы сохранить следующую доступную позицию в списке в удаленных положениях. В результате sizeof(type)
должен быть не менее sizeof(size_t)
, а type
должен быть правильно выровнен.
Возможные решения:
boost::variant<type, size_t>
Это имеет две проблемы, с моей точки зрения. Если I
use boost::get<type>
, производительность значительно снизится. Если я используюboost::apply_visitor
, синтаксис будет странным, а производительность также уменьшится в соответствии с моим профилем.union{type t; size_t s;}
Это, конечно, работает на двух дефицитов за исключением. Во-первых, синтаксис для ссылки на член
type
был бы более грязным. Во-вторых, я должен определить конструктор, конструктор копирования и т. Д. Для этого объединения.Продлить
type
поchar[sizeof(size_t) - sizeof(type)]
Это почти соответствует моим требованиям. Тем не менее, это риск массива нулевой длины, который не поддерживается стандартом C++ и, возможно, неправильным выравниванием.
Поскольку я не буду использовать type
как size_t
часто, я хотел бы, чтобы просто обеспечить в случае необходимости можно использовать reinterpret_cast<size_t>
.
Дополняет
После прочтения комментариев, я думаю, что лучшее решение для моей проблемы должно быть boost::variant
. Но мне все еще интересно, есть ли способ сочетать преимущества решений 2 и 3, то есть
a. Я могу получить доступ к членам type
без изменений.
b. Получите гарантию на то, что работает reinterpret_cast<size_t>
.
очень хороший сформулированный вопрос. +1. Но мне кажется, что источником вашей проблемы является то, что вы сохраните индексированный для будущего использования. Я думаю, что вы должны подумать о какой-то альтернативе, которая не включает в себя такие махинации с некоторыми элементами в векторе, которые являются следующим действующим индексом в векторе. – bolov
@bolov Я согласен с вами. Я использовал unique_ptr в векторном и сохраненном типе *. Но я предпочитаю прямой доступ к типу. (Это не для производства). На самом деле, я думаю, что boost :: variant - это, возможно, мое окончательное решение, но я с нетерпением жду лучшего решения. –
cqdjyy01234
Почему вы воображаете, что будет иметь стоимость исполнения с boost :: variant? –