Как правильно выравнивать структуры?

 
Вопрос к знатокам. На днях открыл для себя, что просто так собирать структуру из различных типов данных, сортируя их только по своему усмотрению является неверным подходом (с чисто технической точки зрения). Почитал справку, погуглил и решил для себя выравнивать все примитивные типы данных под 8 байт. То есть, если раньше я использовал в структурах вразброс типы int и double, то сейчас думаю инты заменить на лонги (чтобы каждое значение в такой структуре ровнялось 8 байтам). И в этом заключается первый вопрос - является ли такой подход верным?

Второй вопрос: как выравнивать структуру, если помимо примитивных типов данных в ней используются типы string?

И третий вопрос: вот этим всем реально нужно заморачиваться?  
 

Структура - всегда строка, потому ответ - не верный. 

String всегда в конец. 

В начало структуры чётные данные. 

И ещё. Поиск в базе очень ускоряется. 

 
leon_17:
Вопрос к знатокам. На днях открыл для себя, что просто так собирать структуру из различных типов данных, сортируя их только по своему усмотрению является неверным подходом (с чисто технической точки зрения). Почитал справку, погуглил и решил для себя выравнивать все примитивные типы данных под 8 байт. То есть, если раньше я использовал в структурах вразброс типы int и double, то сейчас думаю инты заменить на лонги (чтобы каждое значение в такой структуре ровнялось 8 байтам). И в этом заключается первый вопрос - является ли такой подход верным?

Второй вопрос: как выравнивать структуру, если помимо примитивных типов данных в ней используются типы string?

И третий вопрос: вот этим всем реально нужно заморачиваться?  

Не нужно этим заморачиваться.

 
Алексей Тарабанов #:

Структура - всегда строка, потому ответ - не верный. 

String всегда в конец. 

В начало структуры чётные данные. 

И ещё. Поиск в базе очень ускоряется. 

Может хватит повторять этот бред?

Структура никогда не строка!

 
Koldun Zloy #:

Не нужно этим заморачиваться.

Хорошо, получается компилятор сам проводит все необходимые выравнивания, но наверное только в режиме оптимизиции. Иначе не очень понятно, зачем тогда про выравнивание упоминается в справке https://www.mql5.com/ru/docs/basis/types/classes

p.s. Хотелось бы все-таки узнать какой алгоритм выравнивания используется, если в структуре помимо простых типов используются с десяток различных значений типа string   

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структуры, классы и интерфейсы - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
leon_17 #:

Хорошо, получается компилятор сам проводит все необходимые выравнивания, но наверное только в режиме оптимизиции. Иначе не очень понятно, зачем тогда про выравнивание упоминается в справке https://www.mql5.com/ru/docs/basis/types/classes

p.s. Хотелось бы все-таки узнать какой алгоритм выравнивания используется, если в структуре помимо простых типов используются с десяток различных значений типа string   

А вы обратили внимание на эту строку

Такое описание выровненных структур необходимо только для передачи в импортированные dll-функции.

 
Alexey Viktorov #:

А вы обратили внимание на эту строку

Спасибо, это действительно пропустил. Но все же, хотелось бы на будущее поглубже разобраться в данном вопросе. Вопрос с импортированием dll функций еще не изучал, но может это тоже когда-нибудь придется изучить. Или в импортированные dll функции передаются только простые типы?

 
Блин. Знатоки-советчики. Человек вопрос задал, а в ответ хрен и ничего. А для чего выравнивание  вообще делается, никто не задумывался? Про неворованное обращение к памяти никто никогда не читал, не интересовался? Не знаю, почему тут по умолчанию #pragma pack(push,1), очень и очень спорное решение. На ровном месте иметь оверхед на обращении к памяти только поставив в структуре char перед long (теперь разыменование long произойдет за две операции чтения памяти вместо одного), так себе решение. А местный string ни разу не указатель, а обертка над ним и занимает в памяти 12 байт (MQL5), и опять блин помни про выравнивание, поставишь после него long и привет оверхед. В общем, изучай, грызи гранит и будет тебе счастье)
 
А что все так парятся насчет выравнивания ? Там что - прямо в разы скорость доступа различается ? Думаю нет. Кто-нибудь вообще тестировал скорость доступа к выровненным и невыровненным данным ? Думаю, разница будет в пределах погрешности измерения.
 
Walerij75 #:
А что все так парятся насчет выравнивания ? Там что - прямо в разы скорость доступа различается ? Думаю нет. Кто-нибудь вообще тестировал скорость доступа к выровненным и невыровненным данным ? Думаю, разница будет в пределах погрешности измерения.

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

Vladimir Simakov #:
А местный string ни разу не указатель, а обертка над ним и занимает в памяти 12 байт (MQL5), и опять блин помни про выравнивание, поставишь после него long и привет оверхед. 

Можете пояснить, что означает оверхед в данном контексте?

 
leon_17 #:

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

Можете пояснить, что означает оверхед в данном контексте?

Очень сильно сомневаюсь что из-за этого могут быть какие-то ошибки. А на результаты тестов скорости взглянуть было бы любопытно.

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