Ошибки, баги, вопросы - страница 2499
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Хочется разобраться.
выравнивание данных это не
видимо это сделано с учетом внутреннего использования sizeof() , т.е. sizeof() не учитывает физическую память, просто суммирует каждый тип в байтах
выравнивание это расположение данных в физической памяти, как и написано в справке " для передачи в импортированные dll-функции" - в различных компиляторах и в языках типы данных могут отличаться по своим размерам или вернее по способу хранения в памяти, вот и нужно использовать struct A pack(4) чтобы каждый член структуры "не вылез за свою клеточку" - байты
вот как на хабре в статье:
1 байт: ch
2 байт: пусто
3 байт: пусто ЭТО char ch;
4 байт: пусто
5 байт: value[0]
6 байт: value[1] ЭТО int value;
7 байт: value[2]
8 байт: value[3]
видимо это сделано с учетом внутреннего использования sizeof() , т.е. sizeof() не учитывает физическую память, просто суммирует каждый тип в байтах
Это не так
Это не так
тогда Ваш пример проверил что sizeof() корректно посчитал "вес" структуры в байтах,
остается только физическую память проверить, но по моему будет только при вызове dll работать, не факт что разработчики не заоптимизировали хранение данных в памяти ;) - т.е. если не используется pack(4) по назначению в коде, то может он быть и проигнорирован в исполняемом коде
тогда Ваш пример проверил что sizeof() корректно посчитал "вес" структуры в байтах
Поэтому и возникает вопрос, как на самом деле работает выравнивание? Документация и Хабр своими примерами не раскрыли алгоритм.
остается только физическую память проверить, но по моему будет только при вызове dll работать, не факт что разработчики не заоптимизировали хранение данных в памяти ;) - т.е. если не используется pack(4) по назначению в коде, то может он быть и проигнорирован в исполняемом коде
Поэтому и возникает вопрос, как на самом деле работает выравнивание? Документация и Хабр своими примерами не раскрыли алгоритм.
от конкретного компилятора все зависит, наверное можно в MQL попробовать в union посмотреть как данные были сохранены при использовании pack(4)
от конкретного компилятора все зависит, наверное можно в MQL попробовать в union посмотреть как данные были сохранены при использовании pack(4)
Для этого есть offsetof и другие способы.
ЗЫ Получается, что задание выравнивания служит для придания однозначности. Но не для собственного использования. Ну и хорошо видно, что от порядка полей зависит потребление памяти и, видимо, производительность.
ЗЫ Получается, что задание выравнивания служит для придания однозначности. Но не для собственного использования.
а это и есть "от конкретного компилятора все зависит" - разработчики часто идут на ухищрения для поднятия производительности своих разработок относительно других, в MQL отсутствуют директивы компилятора - типа отключить оптимизацию исходного кода и т.п. - нельзя увидеть разницу в работе или использовании ОЗУ нативного кода
ЗЫ: я не уверен, что пример с записью в файл однозначно всегда корректно работает, кто то недавно писал, что MQL используется Win API при записи в файл, тут может быть для совместимости с API функциями некоторые допущения быть произведены - но это мои догадки, не являюсь разработчиком компиляторов (((
Для этого есть offsetof и другие способы.
ЗЫ Получается, что задание выравнивания служит для придания однозначности. Но не для собственного использования. Ну и хорошо видно, что от порядка полей зависит потребление памяти.
Вы куда-то не туда копаете, выравнивание вообще не для вас нужно, это нужно процессору, чтобы не попал какой-нибудь int на две кеш-линии. То место, в которое будет производиться добивка - не регламентировано и зависит от компилятора, поэтому при передаче во внешний мир нельзя полагаться на pack(), только ручная добивка.
Вы куда-то не туда копаете, выравнивание вообще не для вас нужно, это нужно процессору, чтобы не попал какой-нибудь int на две кеш-линии. То место, в которое будет производиться добивка - не регламентировано и зависит от компилятора, поэтому при передаче во внешний мир нельзя полагаться на pack(), только ручная добивка.
Стало ясно, всем спасибо.
Хочется разобраться.
А что тут разбираться если в документации чётко написано
Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг за другом без выравнивания. В языке C++ такое указание делается компилятору с помощью инструкции
И дальше по тексту...
То-есть выравнивание в MQL5 отсутствует вообще.