2017-01-04 23 views
0

Определениепамять - Естественный адрес граница

Структуры обивка представляет собой процесс выравнивания элементов данных структуры в соответствии с правилами выравнивания памяти указанных процессором.


, что это правило выравнивания памяти для процессора Intel x86?

Согласно моему пониманию, естественно адрес граница для процессора Intel-x86 составляет 32 бит каждый (т.е. addressOffset%4==0)

Так, в процессоре x86,

struct mystruct_A { 
    char a; 
    int b; 
    char c; 

}; 

будет построен as,

struct mystruct_A { 
    char a; 
    char gap_0[3]; /* inserted by compiler: for alignment of b using array */ 
    int b; 
    char c; 
    char gap_1[3]; /* for alignment of the whole struct using array */ 
}; 

что такое правило выравнивания памяти для процессора Intel x86-64?

Согласно моему пониманию, естественно адрес границы для процессора Intel x86-64 составляет 64 бита каждый (т.е. addressOffset%8==0)

Так, в x86-64 процессора,

struct mystruct_A { 
    char a; 
    int b; 
    char c; 

}; 

будут построены как,

struct mystruct_A { 
    char a; 
    char gap_0[7]; /* inserted by compiler: for alignment of b using array */ 
    int b; 
    char c; 
    char gap_1[7]; /* for alignment of the whole struct using array */ 
}; 

Если вышеуказанное понимание верное, то я хотел бы знать зачем использовать массив int для операции бит?

Рекомендуем использовать данные размера int, как указано here, в котором говорится, что , поскольку наиболее экономичный доступ к памяти имеет доступ к данным размера int.

Вопрос:

Это правило выравнивания памяти что заставляет объявлять данные ИНТ размера для битовых операций?

+1

каждый член должен быть выровнен по своему размеру, char не нуждается в выравнивании, а 4 байта int должны быть выровнены на границе 32 бит. поэтому упорядочение членов по их размерам является одним из способов улучшения памяти. – perreal

+0

@perreal Я сказал то же самое? 'для выравнивания b с использованием массива'. Я имею в виду, 'int b' Вы описали лучше. – overexchange

+3

Твой прореквисте уже не так. Просьба указать ссылку на стандарт, где он налагает это ограничение на заполнение. Обычно это определяется ABI платформы. Что включает в себя ОС, а не только процессор. – Olaf

ответ

1

Приложение: это справедливо для процессоров x86/-64 бит, но и для других. Я вслепую предполагаю, что вы их используете. Для других вы должны проверить соответствующие руководства.


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

Этой статья здесь может быть стоит посмотреть: https://software.intel.com/en-us/articles/coding-for-performance-data-alignment-and-structures

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

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

Веселый факт: петли работают одинаково. Заполнение NOP в вашем коде, до начала цикла, может иметь значение.

+3

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

+0

Почему 'short a1' отображается как 1 байт,' int' как 3 байта? в вашей ссылке [link] (https://software.intel.com/en-us/articles/coding-for-performance-data-alignment-and-structures) Я неправильно прочитал номер адреса? адрес 12-15 средний адрес 12, 13, 14, 15 – overexchange

+0

Я согласен, что, если вы не знаете, как это работает, вы должны позволить кому-то другому справиться с этим для вас. В этом случае компилятор.При этом гораздо лучше знать, что вы делаете, вместо того, чтобы охотно передавать контроль над своим кодом на часть программного обеспечения. –