Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Именно. В стандарте очень много оставлено либо полностью на... 21.11.05 13:43 Число просмотров: 1497
Автор: amirul <Serge> Статус: The Elderman
|
> Получается, что все от компилятора зависит и нет стандартов > на выравнивание... > (Хотя программисту это не очень то и надо знать.)
Именно. В стандарте очень много оставлено либо полностью на откуп реализации либо заданы какие то условия. Например: по фигу как будет реализован std::list, главное, чтобы он предоставлял операции вставки/удаления элементов в любое место за константное время, предоставлял прямые и реверсивные итераторы, операция произвольного доступа - необязательна. То же самое об остальных контейнерах библиотеки. Или к примеру стандарт ничего не говорит об абсолютных размерах базовых типов, вводится только ограничение
sizeof(char) == 1 (все остальные длины меряются в размерах char-а, а не в байтах)
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
Таких примеров до фига
> Для чего нужно выравнивание - для увеличения скорости > работы за счет увеличения скорости доступа к памяти. Елиб > не было архитектур на которых выигрыш есть, то никто о > выравнивании границ и не говорил, поскольку не было бы > пользы кроме вреда - нерачительного использования памяти.
Полностью согласен.
> Если после какой-то степени двойки эффект отпадает, то и > нечего позря эту память выделять. То есть если эффект после > 4 байт пропадает, то нет смысла выравнивать на 8 байтовцю > границу, не смотря на "lond double". Глубоко убежден, что
Почему то msvc выравнивает. Может какое то преимущество и есть - не знаю
> мало какие компиляторы доберуться до 8 байтового > выравнивания. И что самое удивительное есть такие, которые > плюют на слово "long" в сочетании "long double".
На самом деле это тоже отдано на откуп реализации. С базовыми типами с плавающей запятой та же ситуация, что и с целочисленными:
sizeof(float) <= sizeof(double) <= sizeof(long double)
Никто не ЗАСТАВЛЯЕТ делать long double 10-байтовым на всех архитектурах.
> Код в циклах многие компиляторы тоже выравнивают на 4-х > байтовую границу. > При выравнивании на 8 байтовую может возникнуть только > потеря быстродействия из-за трансфера ненужной информации,
Не совсем понял. Имеется в виду выравнивание по началу кеш-строки? (16 байт)
> когда структура передается в качестве аргумента.
Передавать большие данные по значению - вообще достаточно неразумно. В частности именно поэтому в C НЕВОЗМОЖНО передать массив по значению. Даже если явно указано
void f(int arr[10]);
вызов
int a[10];
f(a)
будет передан по указателю (проверял по ассемблерным листингам). И это задано в стандарте.
> Что касается примера, то структуру из трех байтовых > элементов очень даже имеет смысл выравнить до слова - > ЗНАЧИТЕЛЬНО быстрее будет обрабатываться ее возврат из > функции.
А принимаемые/возвращаемые значения всегда выравниваются по 4 байта (по крайней мере на msvc). Например в функции
char f(char c1, char c2, char c3);
Аргументы в стековом фрейме будут занимать не 3 байта (и даже не 4), а 12. И возвращаться будет через eax (опять таки для msvc/x86)
|
|
|