Выравнивание указателя - PullRequest
2 голосов
/ 01 декабря 2009

Кто-нибудь может объяснить (например, предоставив подходящую ссылку), что означает выравнивание указателя в c ++? Спасибо.

Ответы [ 3 ]

5 голосов
/ 01 декабря 2009

Это тоже хорошо - Data_structure_alignment

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

1 голос
/ 01 декабря 2009

В C указатели выравниваются по границам машинных слов в структурах. Итак, хотя у вас есть:

typedef struct {
int a;
char c;
float f;
} example;

ваш sizeof будет отличаться в зависимости от вашей архитектуры. (Каждый из 'a', 'c' и 'f' будет расположен на вышеупомянутой границе и поэтому займет потенциально больше места, чем просто размер типа int, символа и числа с плавающей запятой.

0 голосов
/ 01 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...