Это язык C. Написано, что:
typedef struct __attribute__((packed, aligned(4))) Ball {
float2 delta;
float2 position;
//float3 color;
float size;
//int arcID;
//float arcStr;
} Ball_t;
Ball_t *balls;
Скажите, пожалуйста, в чем это значение и как использовать это ключевое слово.
aligned(4)
, возможно, вам не о чем беспокоиться.Ответы:
Прежде чем ответить, я хотел бы привести некоторые данные из Wiki.
Выравнивание структуры данных - это способ организации данных и доступа к ним в памяти компьютера. Он состоит из двух отдельных, но связанных вопросов: выравнивания данных и заполнения структуры данных .
Когда современный компьютер читает или записывает в адрес памяти, он будет делать это фрагментами размером со слово (например, 4-байтовыми фрагментами в 32-разрядной системе). Выравнивание данных означает размещение данных со смещением памяти, равным некоторому кратному размеру слова, что увеличивает производительность системы из-за того, как процессор обрабатывает память.
Чтобы выровнять данные, может потребоваться вставить несколько бессмысленных байтов между концом последней структуры данных и началом следующей, что является заполнением структуры данных .
gcc предоставляет функциональные возможности для отключения заполнения структуры. т.е. чтобы в некоторых случаях избежать этих бессмысленных байтов. Рассмотрим следующую структуру:
sizeof(sSampleStruct)
будет 12, а не 8. Из-за заполнения структуры. По умолчанию в X86 структуры будут дополнены до 4-байтового выравнивания:Мы можем использовать,
__attribute__((packed, aligned(X)))
чтобы настаивать на заполнении определенного размера (X). X должен быть степенью двойки. См здесьпоэтому указанный выше атрибут gcc не допускает заполнение структуры. поэтому размер будет 8 байтов.
Если вы хотите сделать то же самое для всех структур, просто мы можем поместить значение выравнивания в стек, используя
#pragma
источник
packed
означает, что он будет использовать наименьшее возможное пространство дляstruct Ball
- т.е. он будет собирать поля вместе без заполненияaligned
означает, что каждыйstruct Ball
будет начинаться с 4-байтовой границы - то есть для любогоstruct Ball
адреса его можно разделить на 4Это расширения GCC, не являющиеся частью какого-либо стандарта C.
источник
Атрибут
packed
означает, что компилятор не будет добавлять отступы между полями файлаstruct
. Заполнение обычно используется для выравнивания полей по их естественному размеру, поскольку некоторые архитектуры накладывают штрафы за невыровненный доступ или не разрешают его вообще.aligned(4)
означает, что структура должна быть выровнена по адресу, который делится на 4.источник