Ошибки, баги, вопросы - страница 2501
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не помню, в документации об этом есть.
Спасибо, нашёл. На мой взгляд всё работает. Поскольку в вашем примере только один тип в структуре, то и выравнивать нет смысла. Потому и даёт размер только типа. А вот так получается
А такая структура
В документации очень наглядно объясняется в картинках.
Спасибо, нашёл. На мой взгляд всё работает. Поскольку в вашем примере только один тип в структуре, то и выравнивать нет смысла. Потому и даёт размер только типа. А вот так получается
А такая структура
В документации очень наглядно объясняется в картинках.
да, так работает:
2019.07.07 19:16:27.100 tst (EURUSD,H1) 4294967295 4294967295 4294967295 4294967295
2019.07.07 19:16:27.100 tst (EURUSD,H1) A:
2019.07.07 19:16:27.100 tst (EURUSD,H1) 0 0 0 4294967295
2019.07.07 19:16:27.100 tst (EURUSD,H1) B:
2019.07.07 19:16:27.100 tst (EURUSD,H1) 0 0 0 0
2019.07.07 19:16:27.100 tst (EURUSD,H1) sizeof(A) = 12 , sizeof(B) = 16
итого: pack() выполняет выравнивание данных в структуре на размер максимального sizeof() поля структуры
итого: pack() выполняет выравнивание данных в структуре на размер максимального sizeof() поля структуры
Не совсем так.
максимальное поле 8 байт, задали выравнивание 4 и получили 16. То-есть 2+2|4|2+2|2+добавка short doubleint
Или 2+добавка|4|4|4
Не совсем так.
максимальное поле 8 байт, задали выравнивание 4 и получили 16. То-есть 2+2|4|2+2|2+добавка short doubleint
Или 2+добавка|4|4|4
да, тогда наверное так корректно звучать должно:
итого: pack() выполняет выравнивание данных в структуре поэлементно , каждый элемент будет дополнен значением кратным pack() с учетом максимального sizeof() элемента структуры (не более максимального значения, менее может быть при дополнении)
pack(4) :
short = 2 + 2 дополним = 4 = pack(4)
double = 8 - не выравниваем
int = 4 - не выравниваем
sizeof() = 16 байт
да, тогда наверное так корректно звучать должно:
итого: pack() выполняет выравнивание данных в структуре поэлементно , каждый элемент будет дополнен значением кратным pack() с учетом максимального sizeof() элемента структуры (не более максимального значения, менее может быть при дополнении)
pack(4) :
short = 2 + 2 дополним = 4 = pack(4)
double = 8 - не выравниваем
int = 4 - не выравниваем
sizeof() = 16 байт
Замудрёно звучит, но мне понятно.)))
Замудрёно звучит, но мне понятно.)))
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2019.07.07 15:03
от порядка полей зависит потребление памяти и, видимо, производительность.
Пока не смог до конца понять.
Пока не смог до конца понять.
Не от порядка полей, а от максимального и заданного значения pack() плюс зависит от последовательности полей.
Вот сейчас сделал ещё такой вариант
получилось выравнивание не до 16 как указано в pack(), а до 8 по максимальному double.
плюс зависит от последовательности полей.
проверил, действительно зависит:
Ваш пример выдал sizeof(A) = 24Так с этого и началось данное обсуждение. Оказалось, что все совсем не так.
Да, я ошибся в описании алгоритма выравнивания и тем самым возможно внес еще больше сумятицы.
Итак
pack это механизм совместимости с внешними длл. в частности аналог с++ #pragma pack. и поэтому работать должен тоже аналогично.
дальше примеры с размерами (для pack 4)
char -> 1
short -> 2
int -> 4
long -> 8
char, short -> 4
char, int -> 8
char, long -> 12 (16 для pack(8))
short, char -> 4
long, char -> 12
long, char, short -> 12
long, char, char, char -> 12
long, char, int -> 16
long, char, int, char -> 20
по умолчанию у студии (да и везде наверное) стоит pack(8)Спасибо, понял.