Чтобы получить правильно выровненную память при распределении `std :: vector `, имеет ли значение, какой выбор `t`?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Чтобы получить правильно выровненную память при распределении `std :: vector `, имеет ли значение, какой выбор `t`?

Сообщение Anonymous »

a std :: ecector содержит указатель на какой-то буфер с расплавленным кучей. Гарантированно будет правильно выровнен только для типа char , или он будет выровнен с каким -то общим значением, таким как 4 или 8 байтов? (Или это не указано?) Вызов новый может вернуть произвольный адрес памяти. Но действительно ли это произвольно? Выровнен для типа t , используемый в std :: vector ? (Это кажется наиболее вероятным из вариантов.) < /Li>
[*] Возможно, возвращаемый адрес является произвольным и может иметь какое -либо значение. (Я не думаю, что это правильно.) < /Li>
Что -то еще? < /Li>
< /ul>
Причина задания этого вопроса Я хочу знать, смогу ли я безопасно переосмыслить байты, содержащиеся в этом блоке памяти, как другие типы, например, float , Double , uint64_t и т. Д.
Идя в другую сторону, ситуация более очевидна. (Я думаю - поправьте меня.)
Например, если бы мы попросили std :: vector , то указатель, возвращаемый распределением памяти , и удерживается объектом std :: ecect , будет выровнен 8 байтов. br />
  • Правильно выровнен (4-байтовый выровнен) float
  • Правильно выровнен (8-байт) двойной
  • Правильно выровнен (2-байт) без знака Short int
  • ... и т. Д.
    < /ul>
    Однако, если выделение для std :: vector может вернуть адрес памяти 1025 (десятичный), то это явно не гарантированно Правильно выровнен при любом смещении, если повторно интерпретируется как любой тип шириной, чем 1 байт. Знайте в комментариях, если что -то из этого не вполне имеет смысл или правильно сочетается. > Возможно, я нашел ответ на это, но я не уверен, как интерпретировать то, что я прочитал. < /P>
    from: < /p>
  • https://en.cppreference.com/w/cpp/memor ... erator_new
this Функция требуется, чтобы вернуть указатель, соответствующий выровненной, чтобы указать на объект запрошенного размера.

Но что это означает? /> Для объекта ширины 1 байта это, по -видимому, предполагает, что любое адресное значение является приемлемым. приемлемо. Насколько мне известно, нет инструкций по загрузке 3 -байтового значения из памяти в x86. Что произойдет, если вы запросите новый [t] , где t является 3 -байтовой шириной struct ?

Подробнее здесь: https://stackoverflow.com/questions/794 ... ort-does-i
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»