Ошибки, баги, вопросы - страница 2498

 
Andrei Trukhanovich:

В таком случае имхо и не должно

Почему здесь размер не должен быть кратен четырем?

Оказывается, и классы могут выравниваться.

 
fxsaber:

Почему здесь размер не должен быть кратен четырем?

Оказывается, и классы могут выравниваться.

потому что это внутреннее выравнивание. следующая внешняя переменная скорее всего будет размещена с выравниванием 8 вне зависимости от размера структуры.

 
Andrei Trukhanovich:

потому что это внутреннее выравнивание

Тогда боюсь, смысл выравнивания теряется

struct A pack(4)
{
  short j;
};

void OnStart()
{
  Print(sizeof(A)); // 2
  
  const int handle = FileOpen(__FILE__, FILE_WRITE | FILE_BIN);
  
  if (handle != INVALID_HANDLE)
  {
    A a = {0};
    
    FileWriteStruct(handle, a);
    Print(FileTell(handle)); // 2
    
    FileClose(handle);
  }
}
 
fxsaber:

Тогда боюсь, смысл выравнивания теряется

смысл выравнивания в том, чтобы адреса внутренних переменных были кратны выравниванию.

 
Andrei Trukhanovich:

смысл выравнивания в том, чтобы адреса внутренних переменных были кратны выравниванию.

Попытался сопоставить Ваше утверждение и Документацию, но так и не понял.

 
Andrei Trukhanovich:

Недопиленная штука, видимо. Ведь тут то уже явно ошибка:

struct A pack(4)
{
  short j;
};

void OnStart()
{
   A q[2];
   Print(sizeof(q)); // 4
   return;
}
 
fxsaber:

Попытался сопоставить Ваше утверждение и Документацию, но так и не понял.

по моему справка не обновлена, вроде в билде в котором появилась поддержка C# (зимой? ) было описание как теперь работает выравнивание

вот статью на хабре нагуглил, про выравнивание, по моему сейчас так же в МТ5 будет работать https://habr.com/ru/post/142662/

 
Igor Makanu:

по моему справка не обновлена, вроде в билде в котором появилась поддержка C# (зимой? ) было описание как теперь работает выравнивание

вот статью на хабре нагуглил, про выравнивание, по моему сейчас так же в МТ5 будет работать https://habr.com/ru/post/142662/

Провел статью и комментарии к ней. Совсем не понятент алгоритм выравнивания. Стоит pack(4), но почему-то что-то выравнивается до 2-х, что-то до 4-х.

 
fxsaber:

Провел статью и комментарии к ней. Совсем не понятент алгоритм выравнивания. Стоит pack(4), но почему-то что-то выравнивается до 2-х, что-то до 4-х.

А чего заморачиваться? Единичное выравнивание по-умолчанию как и раньше (и вряд ли изменится), спецификатор pack - кривой. Если очень надо, то можно вставить добивку самому.

 
Vict:

А чего заморачиваться? Единичное выравнивание по-умолчанию как и раньше (и вряд ли изменится), спецификатор pack - кривой. Если очень надо, то можно вставить добивку самому.

Хочется разобраться.

Причина обращения: