Насколько знаю, компилятор delphi всё выравнивает на 32 бит, по крайней мере, адреса переменных точно выравнивает. Это можно увидеть на записях (record). Так же, можно его заставить не выравнивать записи, написав "packed record".
Насколько знаю, компилятор delphi всё выравнивает на 32 бит, по крайней мере, адреса переменных точно выравнивает. Это можно увидеть на записях (record). Так же, можно его заставить не выравнивать записи, написав "packed record".
ИМХО.
Все зависит от архитектуры и компиолятора.
Если слово проца 32 бита, то как правило нет разницы для быстродействия - хранить 8 бит или 32. Считывание все равно будет один условный машинный цикл. Зато есть разница для занимаемого на стеке места. И существенная, если, напрмер много вложений или создается локальный массив.
В общем случае, для кроссплатформы, имеет смысл использовать минимально необходимые размеры целых типов. Особенно, если предполагается такими несовершенными компиляторами как SDCC.
Не, именно на стеке параметр короче 32 бит будет занимать 32 бита. Исключительно из соображений эффективности хранения выравненных данных. А вот переменная такого размера в памяти будет занимать ровно присущий ей размер. И извлекаться из памяти она может менее эффективно, чем выравненная на 4 байта (насколько я помню из книги Криса Касперски).
Для массива или структуры, разумеется, лучше использовать короткие типы.
Очень правильно сказано. Хотя вопрос был про x86 и ARM. И про параметры, а не про общее использование переменных.
Я вот не знаю. Допустим, мы использовали переменную короткого типа (16 бит), а компилятор для эффективности сделал её размером 32 бита. Будут ли потери (ожидаемые) при переполнении в расчётах или всё-таки нет? Т.е. будет ли такая переменная вести себя как короткая, чего нам и требуется (вдруг мы лихо срезали лишние старшие биты, понадеявшись на "короткость" переменной), или мы получим удивительные результаты, как будто бы она длинная? Если второе, то нуегонафиг. А если первое, то надо же занулить старшие биты, чтобы не было накладок. Притом после каждой арифметической или логической операции.
Последний раз редактировалось Oleg N. Cher; 06.06.2017 в 01:33.
У правильного компилятора короткая переменная ведет себя как короткая, все преобразования в длинную и обратно делаются прозрачно. На самом деле для большинства арифметических и логических операций дополнительные биты никак не влияют на переполнение коротких переменных, и занулять их не нужно. Короткая часть расширенной переменной ведет себя точно так же, как вела бы себя короткая переменная, а всё, что происходит в расширенной части, можно спокойно игнорировать.
Исключения - сдвиг вправо, умножение/деление, ну и возможно что-то ещё. На этот случай есть процессорные команды расширения коротких значений до длинных.
Последний раз редактировалось Spectramine; 06.06.2017 в 02:24.
Компилятору для ARM пофиг - брать со стека 8 или 32 бита. По времени это одинаково.
А вот для 8биток - однозначно на стеке надо хранить 8 бит, если требуются 8 бит.
Лучше всего использовать "родную" разрядность.
Например 32 бита для x86 в режиме 386. Или 64 для современных.
У современных процессоров (x86/64) АЛУ обычных (не SSE) команд заточено под размер регистров. Действия для 64 бит одного операнда и 64 бит другого операнда выполняются одной микрокомандой. Для 32-битной арифметики у 64 битных процессоров есть соответствующие маски. Т.е. что 64 битная команда, что 32 битная - всё равно одна микрокоманда.
Но если используется 8битная арифметика, то некоторые современные процессоры впадают в ступор (пропускают такты) на примитивнейших командах типа ADD AH,AL. Дело в том, что здесь действие-то выполняется над частями одного регистра EAX (один и тот же регистр одновременно и первый операнд, и второй операнд и результат).
Но на самом деле не всё так просто. Сейчас новая парадигма программирования - принцип локальности данных.
Программисты стараются расположить рядом совместно используемые данные чтобы они поодновременнее попадали в кэш-память.
Соответственно, если уместите свои переменные в меньшее количество строк кэш-памяти, то и загружаться данные будут быстрее.
Итак резюме. Если данных много (мегабайты), то по возможности сжимайте их и используйте чуть ли не побитно. Усложнение программы будет незначительным, а эксплуатация кэша снизится многократно.
Если же данные целиком лезут в кэш-память, то извращаться не надо. Более того, и x86 пользоваться не надо - лучше переходить на SSE/AVX https://ru.wikipedia.org/wiki/AVX - там и регистров больше и в каждый можно запихнуть несколько переменных.
А вообще, компиляторы сейчас пошли шибко умные и сами могут делать SSE/AVX при указании соответствующих ключиков.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)