Зачем вам нужны простая выравнивание памяти анализа и правила выравнивания

Ubuntu 16.04.2 компилятор среды рычажного linux3.4.5 Linux-2.6.22.6

Во- первых нужно знать: CPU вынимает данные из памяти или инструкции, а не мнимые один байты принимаются сплайсинг, но в зависимости от их длины слова, то есть, длина данных процессора может обрабатывать извлеченный блок памяти , например, 32-разрядный 32-битный процессор вынимают четыре байта блоков памяти для обработки. Вот вопрос: только два байта , как это сделать? Ответ удаляется или четыре байта, то память процессора поможет завершить передачу данных в отмычки к процессору.

Короче говоря, процессор будет его «наиболее удобным» длина данных для считывания данных из памяти, что приведет к еще одному вопросу:

Если есть инструкция длины 4 байта готова для чтения в процессор, будет два случая происходит:

    1,4-байтовый начальный адрес в адресе только для чтения с помощью центрального процессора, в этом случае, можно поставить инструкции процессора считывать, и выполняются следующим образом памяти

     2, когда 4 байта в соответствии со следующим распределением Как показано на фиг.

   

 

Предположит также извлекать данные из тех же адресов процессора, чтобы извлечь первые данные quadlet полученных 1,2 байт, но данные не удовлетворяют требуемое число, ах, процессор будет продолжаться в последующей памяти значение, это принимается к задней части 4-байтовые звеньев, производных 3, 4 байта данных, чтобы попасть на фронт, и собранно в полные данные 2 байта, но это две операции чтения из памяти, по сравнению с первым направить из более чем одной операции, быстрый взгляд на, кажется, еще один маленький удар, но принимая во внимание процессор сделать много данных и вычислительных операций, если это случается много, то сделает не ничтожно малый процессор количество «лишних действий» серьезно влияет на скорость обработки.

 

Таким образом, система должна выполнить выравнивание памяти, тем самым увеличивая скорость обработки процессора, и эта задача дается компилятор , чтобы сделать соответствующее распределение адресов и оптимизацию, будет обеспечен компилятор согласно соответствующему параметру выравнивания памяти или целевой среды. (Конечно, есть причины для выровненных аппаратных памяти аспектов, некоторые из аппаратных средств для считывания заранее заданный адреса, адрес инструкции , если адреса не совпадает, и его положение, аппаратное обеспечение может рухнуть как ситуация неизвестна)

 

Выравнивание памяти делится на естественное выравнивание и регулярное выравнивание .

Отличающийся тем, что естественное выравнивание относится к типу переменной, соответствующей значениям адреса в соответствующее пространство памяти, то есть, данные, которые должны быть сохранены в адрес его типа данных является кратным данных в соответствии с его типом. Э.Г. Тип 1 байты обугленного пространства, все числа кратны 1, может быть разрешено размещать по любому адресу, ИНТ 4 байта пространства для адреса кратен 4 имеет как 0,4,8 , Компилятор преимущественно природные данные выравнивания в соответствии с назначением адреса.

 

В структуре примера правила выровнен в естественном выравнивании, компилятор будет генерировать естественные пустоты заполнены выравниваний недопустимых памятей данных, а после заполнения структура занимает пространство памяти в пределах структуры, представляющего максимальный элемент типа переменного пространства памяти данных, целого числа, раз. Далее, правила выравнивания, упомянутые выше, будут объяснены:

(Примечание: Никакие специальные инструкции не 32-разрядная среда с использованием компилятором GCC выбранной среды -m32)

Во-первых, следующий код проверки являются

#include <stdio.h>
int main(int argc,char** argv)
{
    printf("%d",sizeof(struct name));
    return 0;
}

Выход пространство памяти занята структура.

 

 

1. Во-первых, посмотрите на эту структуру

typedef struct test_32
{
	char a;
	short b;
	short c;
	char d;
}test_32;

Во-первых, в соответствии с естественной выравнивания, чтобы получить позицию ниже памяти профиля (первый адрес сетки 0, увеличивается обратно, после того же теста)

 

Затем выравниваются в соответствии с правилами компилятора будет заполнять недопустимые пустые данные, и, наконец, в результате чего структура этого большого объема памяти составляет 8 байт, 2 байта данных этого значения является наибольшим целым числом, кратный типа короткого замыкания, программа составлена , полученный результат составляет 8 байт.

 

 

2. Если смотреть небольшое изменение расположения структуры

typedef struct test_32
{
	char a;
	char b;
	short c;
	short d;
}test_32;

Кроме того, в соответствии с распределением естественного выравнивания ниже:

 

Можно увидеть в естественном выравнивании, нет зазора происходит между переменными, так что правила не должны заполнить выравнивания, но здесь есть шесть цветных квадратов, что составляет 6 байт, выравниваются в соответствии с правилами, эта конфигурация имеет длину 6 байт целое число, кратное типа тела данных на короткое максимальное, так что эта структура представляет собой 6-байтовое, последний пустым и игнорировать его, на самом деле может составить. Она работает, и в соответствии с результатами анализа 6 байт.

 

 

Из выше двух примеров можно существенно выровненной памяти знать конкретные обстоятельства, существует необходимость добавить случай, случай двойной, мы знаем, что 32-битный процессор может обрабатывать только 32 четыре байта данных, и дважды 8-байтовый тип данных, который, как с этим бороться? Если 64-разрядным процессором, первые 8 байт данных могут быть обработаны, и в 32-битных процессоров, чтобы иметь возможность обрабатывать double8 байт данных, в то время как обработка будет разделен на две части, чтобы удвоить количество байт 4 обработки, здесь будет ситуация выглядит следующим образом:

typedef struct test_32
{
	char a;
	char b;
	double c;
}test_32;  

Эта структура в пространстве памяти 32-битной занято 12 байт, в то время как в 64-битной памяти доли окружающей среды пространство 16 байты, описанная выше причина обусловлена ​​другим режим обработки, только нижняя 32-битный разделить на две обработка 4-байтовая, так что будет определять максимальное правило выравнивания типа данных структуры составляет 4 байта, общая длиной является целым кратным 4 байт, то есть 12 байт. 64 определяет максимум 8 байт, так что результат является целым кратным 8 байт: 16 байт. Здесь структура не находится в естественном двойном совместится кратному 8 байт в теории адресов, я считаю, что существует также правила компилятора выровнены соответственно оптимизированы, экономя дополнительные 4 байта. Эта часть они могут проверить свой собственный анализ в соответствии с указанными выше правилами.

 

(Примечание: Следующее содержание аппаратных средств, связанные и относительно большая, выровнено связь с содержанием памяти не большое, не может видеть)

При дальнейшем расширении выравнивания для языка C применимо, но для компиляции, как компиляция пользователя управлять адресной более прозрачными, в основном можно назвать произвольным, так может быть унифицирована лишь настолько, насколько это возможно, в целом, будет нормально при выравнивании, но я столкнулся с загрузочным кодом, написанный на собрание в архитектуре ARM, которая вызывает PRINTF функции, чтобы сделать тест на ассемблере, похожий на использование

.ascii  "Hello ARM!\0"

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

Было установлено, что фактический крах тестовой системы, и выходной нормально. После разборки обнаружили, что строка является назначение DAMA адреса, что приводит к последующим инструкциям не выровнены,

Помните, когда память не кратна 4, знает добавить .align 4 Align директивы перед ней после этого случая будет решить эту проблему.

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

Также напоминаем себе также должно учитывать эти аспекты мышления, лежащее в основе подготовки программы, написание кода, который будет оптимизирован, ближе к идеальному выводу продолжать учиться - ???

 

 

Добро пожаловать на сайт обмена, обсудить или поправьте меня! Общий прогресс!

Опубликовано 19 оригинальных статей · вона похвала 7 · просмотров 6938

рекомендация

отblog.csdn.net/G_METHOD/article/details/79535178