Подтвердить что ты не робот

Что такое "выровненный указатель"?

Кто-нибудь, пожалуйста, скажите мне, что означает выравниваемый указатель?

4b9b3361

Ответ 1

Это означает, что адрес, на который указывает, равномерно делится на некоторый коэффициент.

Иногда используется термин "естественное выравнивание", что обычно означает, что объекты, имеющие естественное выравнивание, должны размещаться по адресам, которые равномерно делятся на размер объекта.

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

Например, на классической архитектуре SPARC (а также на классическом ARM, я думаю), вы не можете прочитать целое число больше одного байта от нечетного адреса. Попытка сделать это немедленно остановит вашу программу с ошибкой шины. В архитектуре x86 аппаратное обеспечение процессора вместо этого обрабатывает проблему (делая несколько обращений к кешу и/или памяти по мере необходимости), хотя это может занять больше времени. RISC: архитектуры ier обычно не делают этого для вас.

Такие вещи также могут влиять на заполнение, то есть вставка фиктивных данных между, например, полей структуры для поддержания выравнивания. Структура, подобная этой:

struct example
{
  char initial;
  double coolness;
};

скорее всего, закончит тем, что имеет 7 байтов заполнения между полями, чтобы поле double выровнялось по смещению, делящемуся на свой собственный размер (который я предположил как 8).

При просмотре в двоичном формате адрес, согласованный с n байтами, будет иметь свой младший бит log2 (n), установленный на ноль. Например, объект, который требует 32-байтового выравнивания, будет иметь правильно выровненный адрес, который заканчивается (двоичным) 00000, так как log2 (32) равно 5. Это также означает, что адрес можно принудительно выравнивать, очищая требуемое число бит.

Ответ 2

Чтобы добавить к тому, что объясняет unwind, вот struct, который я недавно использовал в присваивании:

struct infosale {               
    int   noseq;                
    char  salesman[30];         
    char  product[11];          
    int   count;                
};                               

Вы можете ожидать, что размер этого struct будет (4 + 30 + 11 + 4 =) 49 байтов, но на самом деле это 52 по сравнению с sizeof. Поскольку noseq есть 4 bytes + salesman is 32 bytes (aligned) + product is 12 bytes (aligned) и count is 4 bytes, таким образом 52 bytes.

Ответ 3

Зависит от контекста, но может быть либо выровнен сам указатель, либо то, что он указывает на выравнивание.

"Выровненный" означает, что определенный объект хранится по адресу, который кратен определенной константе. Например. для 32-битных целых чисел это почти всегда 4. Это связано с тем, что байт является 8-битным: 4 * 8 = 32-бит. Часто процессор может выполнять гораздо более быстрый доступ к памяти, если объект хранится по выровненному адресу или для некоторых процессоров даже невозможно выполнить неприсоединенные обращения.

Ответ 4

Это указатель на "выровненный" адрес. Выровненный в том смысле, что адрес кратен некоторому значению - обычно размер любого типа вещи, на который он будет указывать (если примитивный тип), или какого-либо элемента данных, который требует такого выравнивания.

Обычно вам не нужно беспокоиться об этом; функции распределения памяти гарантируют, что память, которую они дают вам, правильно выровнена. Вы начинаете беспокоиться о выравнивании в точке, где вы начинаете делать небезопасные вещи с помощью указателей.

Ответ 5

Как уже упоминалось выше, это означает, что ваш указатель равномерно делится на определенное количество байтов.

Чтобы проверить выравнивание указателя, вы можете сделать это:

isaligned = !( (long)pointer % bytes );

Теперь "isaligned" имеет значение true, если "указатель" выровнен с байтами байтов.

Ответ 6

Выровненный указатель означает, что указатель со смежной ячейкой памяти, к которому можно получить добавление константы и ее кратность

для char a[5] = "12345";

здесь a является постоянным указателем, если вы и размер char к нему каждый раз, когда вы можете получить доступ к следующему chracter, который есть,

a + sizeofchar получит доступ к 2

a + (sizeofchar * 2) получит доступ к 3 и так далее

аналогично, если вы получаете доступ к значениям бит по битам.