Skip to content

Instantly share code, notes, and snippets.

Created September 12, 2017 14:49
Show Gist options
  • Save anonymous/d865b8a3610c758495efb70751ce03b2 to your computer and use it in GitHub Desktop.
Save anonymous/d865b8a3610c758495efb70751ce03b2 to your computer and use it in GitHub Desktop.
Size t c описание

Size t c описание



size_t
Стандартные типы
Что такое size_t и ptrdiff_t

Долгое время было принято считать, что размер int совпадает с размером машинного слова разрядностью микропроцессора и его можно использовать в качестве индексов, для хранения размеров объектов или указателей. Соответственно адресная арифметика также строилась с использованием типов int и unsigned. Практически каноническим выглядит пример следующего вида:. С развитием микропроцессоров и ростом их разрядности стало нерационально дальнейшее увеличение размерностей типа int. Причин для этого много: В таблице N1 приведены основные модели данных и перечислены наиболее популярные системы их использующие. Как видно из таблицы, не так просто выбрать тип переменной для хранения указателя или размера объекта. Они гарантированно могут использоваться для адресной арифметики. Теперь каноническим должен стать следующий код:. Именно он может обеспечить надежность, переносимость, быстродействие. Почему - станет ясно из дальнейшего текста статьи. Является результатом выполнения оператора sizeof. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива. Исключение составляют указатели на функции классов, но это особый случай. По этой причине именно эти типы следует использовать в качестве индексов больших массивов, для хранения указателей и арифметики с указателями. Разработчики Linux приложений часто используют для этих целей тип long. В рамках битных и битных моделей данных, принятых в Linux это действительно работает. Размер типа long совпадает с размером указателя. Но такой код несовместим с моделью данных Windows и соответственно его нельзя считать хорошо переносимым. Проблемы адресной арифметики стали активно проявлять себя с началом освоения битных систем. Наибольшее число проблем при переносе битных приложений на битные системы связанно с использованием неподходящих для работы с указателями и массивами типов, таких как int и long. Этим проблемы переноса приложений на битные системы не ограничивается, но большинство ошибок связанны именно с адресной арифметикой и работе с индексами. При этом выявить ошибку и предсказать поведение данного кода не так просто. Отладочная debug версия зависнет, но редко кто в отладочной версии будет обрабатывать гигабайты данных. А вот рабочая release версия в зависимости от настроек оптимизации и особенностей кода, может как зависнуть, так и неожиданно корректно заполнить все ячейки массива, создавая иллюзию корректной работы. В результате в программе появляются плавающие ошибки, возникающие или пропадающие после малейшего изменения кода. Подробнее о таких фантомных ошибках и их опасностях можно познакомится в статье " битный конь, который умеет считать " [1]. Пример еще одной дремлющей ошибки, которая проявит себя при определенном сочетании входных данных значении переменных A и B:. Данный код будет успешно выполняться в битном варианте и печатать на экране число "3". После компиляции битном режиме при выполнении кода возникнет сбой. Рассмотрим последовательность выполнения кода и причину ошибки:. Например, использование в качестве индекса типа int, размерность которого отличается от размерности указателя приводит к тому, что в двоичном коде будут присутствовать дополнительные команды преобразования данных. Речь идет о битном коде, в котором размер указателей стал равен битам, а размер типа int остался битным. Чтобы быть объективным необходимо использовать оптимизирующие возможности компилятора. А два варианта оптимизированного кода часто становятся слишком непохожим, чтобы легко было продемонстрировать отличие. Попытка создать нечто близкое к простому примеру увенчалась успехом только с шестой попытки. Рассмотрим код программы, переставляющий элементы массива в обратном порядке:. В примере переменные "arraySize" и "i" имеют тип unsigned. Компилятор смог построить более лаконичный код, когда использовал битные регистры. Сравнить скорость выполнения кода на современных процессорах крайне сложная задача. Но из примера видно, что когда компилятор работает с массивами, используя битные типы, он может строить более короткий и быстрый код. Во-первых, это не гарантирует корректность программы на битной системы. Во-вторых, скорее всего из-за такой замены возникнут новые ошибки, нарушится совместимость форматов данных и так далее. Не стоит забывать, что после такой замены существенно возрастет и объем потребляемой программой памяти. Причем увеличение объема требуемой памяти может замедлить работу приложения, так как в кэш будет помещаться меньше объектов, с которыми идет работа. Фактически необходимо просмотреть весь код и внести необходимые исправления. Такой подход практически является слишком дорогостоящим и неэффективным. Можно предложить 2 варианта:. Главная Статьи Новости Файлы Исходники Опросы Форумы Хостинг Eng Архив Карта. Поиск среди 20 статей:


Причины нарушения речи
Понятие гражданско процессуального права
План ликвидации аварии пла
Проекты больших деревянных домов
Состав семян подсолнечника таблица
Каталог ооо оборудование
Отхождение струпа после прижигания полипа кишечника
Как правильно делать манку для рыбалки видео
Стригущий лишай ногтей
Печать карты самары
Архип значение имени характер
Сколько стоит в автосалоне лада гранта
Пружинный маятник массой 1 кг
Полезна ли селедка
Где аэродром в пушкине
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment