Как обычно реализуется вектор STL?У него есть сырое хранилище char [], которое он иногда изменяет по определенному коэффициенту, а затем вызывает размещение нового, когда элемент является push-back (очень интересная грамматическая форма, которую я должен отметить - лингвисты должны изучать такие формы глаголов как pressed_back:)
И тогда есть требования выравнивания.Поэтому возникает естественный вопрос, как я могу назвать место размещения новым на символе [] и убедиться, что требования выравнивания выполнены.Поэтому я искал в стандарте C ++ 2003 года слово «выравнивание» и обнаружил следующее:
Пункт 3.9 Пункт 5
Типы объектов имеют требования к выравниванию (3.9.1, 3.9.2).Выравнивание полного типа объекта представляет собой целочисленное значение, определяемое реализацией, представляющее количество байтов;объект размещается по адресу, который соответствует требованиям выравнивания его типа объекта.
Пункт 5.3.4 Пункт 10:
Новый-expression передает количество пространства, запрошенное для функции выделения, в качестве первого аргумента типа std :: size_t.Этот аргумент должен быть не меньше размера создаваемого объекта;он может быть больше размера создаваемого объекта, только если объект является массивом.Для массивов char и unsigned char разница между результатом выражения new и адресом, возвращаемым функцией размещения, должна быть целым кратным наиболее строгого требования выравнивания (3.9) любого типа объекта, размер которого не превышаетразмер создаваемого массива.[Примечание: поскольку предполагается, что функции выделения возвращают указатели на хранилище, которые соответствующим образом выровнены для объектов любого типа, это ограничение накладных расходов на выделение массивов позволяет распространить идиому распределения массивов символов, в которые впоследствии будут помещены объекты других типов.]
Эти два дают вполне удовлетворительный ответ на мой вопрос выше, но ...
Statement1:
Требование выравнивания для объекта типа X, где sizeof (X) == n - это, по крайней мере, требование, чтобы адрес X делился на n или что-то подобное (поместите все зависящие от архитектуры вещи в "или что-то подобное").
Вопрос1: Пожалуйста, подтвердите, уточните или отклоните вышеприведенный оператор 1.
Оператор 2: Если оператор1 верен, то из второй цитаты в стандарте следует, что выделен массив из 5000000 символовпо адресу, кратному 5000000, что совершенно не нужно, если мне просто нужен массив char как таковой, а не как необработанное хранилище для возможного размещения других объектов.
Вопрос2: Итак, действительно ли шансы на успешное распределение 1000 символов на самом деле ниже, чем 500 символов (при условии, что длина составляет 2 байта)?Это практически проблема?