Войти
Подсказки

Особенность выравнивания в памяти

Автор:

CPU читает и пишет данные, выровненные в памяти намного быстрее чем какие-либо другие данные. Любая переменная n-байтового тип данных является выровненной в памяти, если адрес её начала делится нацело на n. например, 32х-битное целое (int) является выровненным в памяти, если адрес его начала в памяти 0x4000000. Тот же самый int не является выровненным, если адрес его начала 0x4000002, поскольку этот адрес не делится нацело на 4 байта==32 бита.

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

#pragma pack(push, 1)  // автовыравниванее по каждому байту, фактически его отключение (по умолчанию 8)
struct really_slow_struct
{
  char c : 6;
  __int64 d : 64;
  int b : 32;
  char a : 8;
};
struct slow_struct
{
  char c;
  __int64 d;
  int  b;
  char a;
};
struct fast_struct
{
  __int64 d;
  int b;
  char a;
  char c;
  char unused[2];
};
#pragma pack(pop)

Дополнительно написан код, выполнающий различные операции над членами каждой из структур. Различия во времени исполнения таковы:
really_slow==417 миллисекунд
slow==222 миллисекунды
fast==192 миллисекунды

Потеря времени при использовании slow_struct вместо fast_struct составила около 14%. Наказание за использование really_slow_struct — это код, который работает в два раза медленнее.

22 апреля 2004