поправьте меня пожалуйста, а то я что-то запутался..
Для оптимизации доступа к данным, на всех платформах, применяется выравнивание данных, т.е. расположение данных по стартовым адресам, кратным величине выравнивания, иначе, получаем пени за обращение по некратным адресам, или даже падения, на некоторых платформах. => элементы массивов, должны располагаться так же с выравниванием, но это не так почему же?
и вот еще
Пусть у меня есть бинарный файл, в котором находится порядка 10^6 структуры данных, с 30 полями в каждой структуре, естественно с выравниванием == 1. Необходимо последовательно считать все эти структуры, и подсчитать некие параметры...
Вопрос, стоит ли перепаковывать данные после прочтение в стандартное выравние на платформе и уж потом оперировать с ними? А как быть на платформах, где обращение по невыравненному полю приводит к краху?
Здравствуйте, Аноним, Вы писали:
А>Для оптимизации доступа к данным, на всех платформах, применяется выравнивание данных, т.е. расположение данных по стартовым адресам, кратным величине выравнивания, иначе, получаем пени за обращение по некратным адресам, или даже падения, на некоторых платформах. => элементы массивов, должны располагаться так же с выравниванием, но это не так
почему же?
Элементы массива располагаются с тем же выравниваем, что и отдельные переменные.
А>Пусть у меня есть бинарный файл, в котором находится порядка 10^6 структуры данных, с 30 полями в каждой структуре, естественно с выравниванием == 1. Необходимо последовательно считать все эти структуры, и подсчитать некие параметры... А>Вопрос, стоит ли перепаковывать данные после прочтение в стандартное выравние на платформе и уж потом оперировать с ними? А как быть на платформах, где обращение по невыравненному полю приводит к краху?
Это зависит. Зависит много от чего. Такие вопросы крайне архитектурно-зависимы. Так же будет влиять конкретная раскладка структуры. Проще всего тут просто замерить конкретные варианты.
Тем не менее интуиция подсказывает, что перепаковка замедлит работу. По крайней мере на x86.
1. правильно я понимаю, чтоо на однотипные типы выравнивание не распостраняется?
2. почему в структуре s_c_i размер 8? ведь выравнивание стоит в 8, и вроде бы как размер должен быть 12?
Здравствуйте, Аноним, Вы писали:
R>>Элементы массива располагаются с тем же выравниваем, что и отдельные переменные.
А>видимо я что-то не понимаю А>1. правильно я понимаю, чтоо на однотипные типы выравнивание не распостраняется? А>2. почему в структуре s_c_i размер 8? ведь выравнивание стоит в 8, и вроде бы как размер должен быть 12?
#pragma pack(8) ставить не обязательно — выравнивание и так по-умолчанию 8.
Выравнивание для члена выбирается как *минимум* из установленного выравнивания и размера члена.
Если хочешь зафиксировать нужную тебе бинарную раскладку структуры, то лучше установи наоборот #pragma pack(1) и вручную добавь между членами "прослойки" нужных размеров из char[].
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Programador, Вы писали:
P>sizeof(T [1]) всегда равно sizeof(T ) или от paсk зависит?
AFAIK всегда.
Мало того, sizeof( Т ) всегда кратен выравниванию Т.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском