Спасибо, нашёл. На мой взгляд всё работает. Поскольку в вашем примере только один тип в структуре, то и выравнивать нет смысла. Потому и даёт размер только типа. А вот так получается
struct A pack(4)
{
short j;
int z;
};
voidOnStart()
{
Print(sizeof(A)); // 8
}
А такая структура
struct A pack(8)
{
short j;
double x;
int b;
};
voidOnStart()
{
Print(sizeof(A)); // 24
}
В документации очень наглядно объясняется в картинках.
Спасибо, нашёл. На мой взгляд всё работает. Поскольку в вашем примере только один тип в структуре, то и выравнивать нет смысла. Потому и даёт размер только типа. А вот так получается
А такая структура
В документации очень наглядно объясняется в картинках.
максимальное поле 8 байт, задали выравнивание 4 и получили 16. То-есть 2+2|4|2+2|2+добавка shortdoubleint
Или 2+добавка|4|4|4
да, тогда наверное так корректно звучать должно:
итого: pack() выполняет выравнивание данных в структуре поэлементно , каждый элемент будет дополнен значением кратным pack() с учетом максимального sizeof() элемента структуры (не более максимального значения, менее может быть при дополнении)
итого: pack() выполняет выравнивание данных в структуре поэлементно , каждый элемент будет дополнен значением кратным pack() с учетом максимального sizeof() элемента структуры (не более максимального значения, менее может быть при дополнении)
Не помню, в документации об этом есть.
Спасибо, нашёл. На мой взгляд всё работает. Поскольку в вашем примере только один тип в структуре, то и выравнивать нет смысла. Потому и даёт размер только типа. А вот так получается
А такая структура
В документации очень наглядно объясняется в картинках.
Спасибо, нашёл. На мой взгляд всё работает. Поскольку в вашем примере только один тип в структуре, то и выравнивать нет смысла. Потому и даёт размер только типа. А вот так получается
А такая структура
В документации очень наглядно объясняется в картинках.
да, так работает:
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)Спасибо, понял.