Важная информация

User Tag List

Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 16 из 16

Тема: Имеет ли смысл использовать короткие целые типы в локальных переменных и параметрах?

  1. #11
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Насколько знаю, компилятор delphi всё выравнивает на 32 бит, по крайней мере, адреса переменных точно выравнивает. Это можно увидеть на записях (record). Так же, можно его заставить не выравнивать записи, написав "packed record".

  2. #12
    Master
    Регистрация
    27.01.2005
    Сообщений
    888
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    163
    Поблагодарили
    131 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    ИМХО.

    Все зависит от архитектуры и компиолятора.
    Если слово проца 32 бита, то как правило нет разницы для быстродействия - хранить 8 бит или 32. Считывание все равно будет один условный машинный цикл. Зато есть разница для занимаемого на стеке места. И существенная, если, напрмер много вложений или создается локальный массив.

    В общем случае, для кроссплатформы, имеет смысл использовать минимально необходимые размеры целых типов. Особенно, если предполагается такими несовершенными компиляторами как SDCC.

  3. #13
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,593
    Спасибо Благодарностей отдано 
    2,158
    Спасибо Благодарностей получено 
    130
    Поблагодарили
    96 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    Зато есть разница для занимаемого на стеке места.
    Не, именно на стеке параметр короче 32 бит будет занимать 32 бита. Исключительно из соображений эффективности хранения выравненных данных. А вот переменная такого размера в памяти будет занимать ровно присущий ей размер. И извлекаться из памяти она может менее эффективно, чем выравненная на 4 байта (насколько я помню из книги Криса Касперски).

    Для массива или структуры, разумеется, лучше использовать короткие типы.

    Цитата Сообщение от SfS Посмотреть сообщение
    В общем случае, для кроссплатформы, имеет смысл использовать минимально необходимые размеры целых типов. Особенно, если предполагается такими несовершенными компиляторами как SDCC.
    Очень правильно сказано. Хотя вопрос был про x86 и ARM. И про параметры, а не про общее использование переменных.

    Я вот не знаю. Допустим, мы использовали переменную короткого типа (16 бит), а компилятор для эффективности сделал её размером 32 бита. Будут ли потери (ожидаемые) при переполнении в расчётах или всё-таки нет? Т.е. будет ли такая переменная вести себя как короткая, чего нам и требуется (вдруг мы лихо срезали лишние старшие биты, понадеявшись на "короткость" переменной), или мы получим удивительные результаты, как будто бы она длинная? Если второе, то нуегонафиг. А если первое, то надо же занулить старшие биты, чтобы не было накладок. Притом после каждой арифметической или логической операции.
    Последний раз редактировалось Oleg N. Cher; 06.06.2017 в 01:33.

  4. #14
    Veteran
    Регистрация
    07.10.2006
    Сообщений
    1,640
    Спасибо Благодарностей отдано 
    241
    Спасибо Благодарностей получено 
    249
    Поблагодарили
    155 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Я вот не знаю. Допустим, мы использовали переменную короткого типа (16 бит), а компилятор для эффективности сделал её размером 32 бита. Будут ли потери (ожидаемые) при переполнении в расчётах или всё-таки нет? Т.е. будет ли такая переменная вести себя как короткая, чего нам и требуется (вдруг мы лихо срезали лишние старшие биты, понадеявшись на "короткость" переменной), или мы получим удивительные результаты, как будто бы она длинная? Если второе, то нуегонафиг. А если первое, то надо же занулить старшие биты, чтобы не было накладок. Притом после каждой арифметической или логической операции.
    У правильного компилятора короткая переменная ведет себя как короткая, все преобразования в длинную и обратно делаются прозрачно. На самом деле для большинства арифметических и логических операций дополнительные биты никак не влияют на переполнение коротких переменных, и занулять их не нужно. Короткая часть расширенной переменной ведет себя точно так же, как вела бы себя короткая переменная, а всё, что происходит в расширенной части, можно спокойно игнорировать.
    Исключения - сдвиг вправо, умножение/деление, ну и возможно что-то ещё. На этот случай есть процессорные команды расширения коротких значений до длинных.
    Последний раз редактировалось Spectramine; 06.06.2017 в 02:24.

  5. #15
    Master
    Регистрация
    27.01.2005
    Сообщений
    888
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    163
    Поблагодарили
    131 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Компилятору для ARM пофиг - брать со стека 8 или 32 бита. По времени это одинаково.
    А вот для 8биток - однозначно на стеке надо хранить 8 бит, если требуются 8 бит.

  6. #16
    Member
    Регистрация
    06.02.2017
    Адрес
    г. Тольятти
    Сообщений
    36
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от weiv Посмотреть сообщение
    Итак, имеет ли смысл использовать короткие целые типы в переменных и параметрах? Допустим, мы знаем, что в данном случае диапазона выбранного короткого целого типа (например, shortint / signed char) нам хватает с головой. Надо ли нам использовать именно его, или выгоднее не париться, и использовать целый тип по умолчанию (32/64-битный)? Вопрос экономии памяти в данном случае неоднозначен, т.к. команды работы с 32битными значениям обычно короче, чем с 8-16 битными (по крайней мере, для x86, если я не ошибаюсь). Да и вообще он на современных архитектурах малоактуален, особенно для переменных, а не больших массивов данных. Более актуален вопрос быстродействия.
    Лучше всего использовать "родную" разрядность.
    Например 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 при указании соответствующих ключиков.

  7. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

Страница 2 из 2 ПерваяПервая 12

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Не могу понять смысл доработки...
    от Quest в разделе Изображение
    Ответов: 4
    Последнее: 02.02.2017, 05:25
  2. Ответов: 10
    Последнее: 14.12.2016, 22:46
  3. Ответов: 21
    Последнее: 24.05.2013, 09:11
  4. Есть ли смысл Rygar'а?
    от ALKO в разделе Игры
    Ответов: 2
    Последнее: 11.01.2011, 17:12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •