Всегда ли карта и набор выделяют 1 предмет за раз?

Сначала загрузите сборку, а затем тип. ex: Assembly DLL = Assembly.LoadFile (PATH); DLL.GetType (TypeName);

5
задан ChronoTrigger 18 January 2019 в 11:43
поделиться

1 ответ

Гарантирует ли стандарт такое поведение?

Нет. Стандарт не гарантирует этого.

Или я могу безопасно доверять n == 1 всегда на любой конкретной платформе?

Количество выделений при вводе ограничено сложностью методов контейнеров. Например, для std::map::insert стандарт определяет (из cppreference , только первые 3 перегрузки, вставляя один элемент):

1-3) Логарифмический по размеру контейнер, O (log (размер ())).

Тогда разработчики могут свободно выбирать реализацию, которая удовлетворяет этой спецификации. Часть log(size()) состоит в том, что вам нужно найти место, куда вставить и выделить место для фиксированного числа элементов - это просто постоянный вклад в сложность. Реализация может выбрать выделение пространства для двух элементов при каждом втором вызове. 2 так же постоянна, как и 1. Однако не должно быть слишком сложно найти случаи, когда распределение 1 более эффективно, чем распределение 2 в абсолютном выражении. Более того, std::map и std::set не обязаны хранить свои элементы в смежной памяти.

Следовательно, я бы предположил, что это всегда 1, но у вас нет гарантии. Если вы хотите быть уверенным, вам нужно взглянуть на конкретную реализацию, но тогда вы полагаетесь на детали реализации.

allocate(n) - это не то же самое, что allocate(1) n раз.

A::allocate(n) должен возвращать один указатель, поэтому нетрудно выделить несмежную память. Однако не требуется, чтобы этот указатель был T*. Вместо этого A::allocate(n) возвращает A::pointer. Это может быть любой тип, если он удовлетворяет NullablePointer, LegacyRandomAccessIterator и LegacyContiguousIterator.

cppreference упоминает boost :: interprocess :: offset_ptr в качестве примера того, как распределить сегментированную память. Возможно, вы захотите взглянуть на это. Вот полная цитата:

Необычные указатели

Когда указатель типа элемента не является необработанным указателем, его обычно называют «причудливым указателем». Такие указатели были введены для поддержки архитектуры сегментированной памяти и сегодня используются для доступа к объектам, расположенным в адресных пространствах, которые отличаются от однородного виртуального адресного пространства, к которому обращаются необработанные указатели. Примером причудливого указателя является сопоставление, не зависящее от адреса, указатель boost :: interprocess :: offset_ptr, который позволяет выделять структуры данных на основе узлов, такие как std :: set, в разделяемой памяти и отображенные в память файлы, сопоставленные по разным адресам каждый процесс. Необычные указатели могут использоваться независимо от предоставившего их распределителя через шаблон класса std :: pointer_traits.

0
ответ дан user463035818 18 January 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: