Перейти к содержанию
    

Использование ptrdiff_t и size_t

Всем доброго дня!

 

Прочитал тут статью про ptrdiff_t и не очень понял следующего:

 

Тип size_t - базовый беззнаковый целочисленный тип языка Си/Си++. Является типом результата, возвращаемого оператором sizeof. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива любого типа. Например, на 32-битной системе size_t будет занимать 32-бита, на 64-битной - 64-бита.

 

и далее следует

 

Тип ptrdiff_t - базовый знаковый целочисленный тип языка Си/Си++. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива любого типа. На 32-битной системе ptrdiff_t будет занимать 32-бита, на 64-битной - 64-бита. Как и в size_t в переменную типа ptrdiff_t может быть безопасно помещен указатель

 

С беззнаковым size_t все понятно. А как в знаковый может быть помещен адрес без каких-либо ограничений. Диапазон то сузился в 2 раза. И даже если этот тип создан для разности двух указателей, то разность будет ограничена не UINT_MAX, а INT_MAX. Может я чего-то не так понимаю? По-моему, ptrdiff_t на 32 разрядной машине должен быть уже 64 разрядным

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фактически эта проблема может возникнуть только если приложение больше 2ГБ оперативы захочет выделить себе на 32-битной машине. Что маловероятно. На 64-битной же пока что еще запаса полным-полно!

Хотя, с другой стороны, в одноплатниках вполне может понадобиться использовать и больше 2ГБ в одном приложении (если ресурсы позволяют). И тут может возникнуть проблема. Скорей бы все производители одноплатников перешли на 64-битную архитектуру!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поэтому "максимальный размер теоретически возможного массива любого типа" на 16-битной платформе - 32767 элементов. На 32-битной, соответственно, 2^31 - 1 элементов.

 

А как в знаковый может быть помещен адрес без каких-либо ограничений. Диапазон то сузился в 2 раза.
Диапазон остался тем же. Верхняя половина адресов все еще может быть представлена как отрицательные адреса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Хм.. Действительно. Проверил в MSVS. При дальнейшем использовании в выражении с size_t переменными все приводится правильно и значения верные даже если size_t переменные больше INT_MAX

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...