Сначала загрузите сборку, а затем тип. ex: Assembly DLL = Assembly.LoadFile (PATH); DLL.GetType (TypeName);
Гарантирует ли стандарт такое поведение?
Нет. Стандарт не гарантирует этого.
Или я могу безопасно доверять n == 1 всегда на любой конкретной платформе?
Количество выделений при вводе ограничено сложностью методов контейнеров. Например, для std::map::insert
стандарт определяет (из cppreference , только первые 3 перегрузки, вставляя один элемент):
1-3) Логарифмический по размеру контейнер, O (log (размер ())).
blockquote>Тогда разработчики могут свободно выбирать реализацию, которая удовлетворяет этой спецификации. Часть
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.
BLOCKQUOTE>