реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Использование ptrdiff_t и size_t, Поясните особенности
kolobochishe
сообщение Mar 9 2016, 13:31
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



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

Прочитал тут статью про 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 разрядным
Go to the top of the page
 
+Quote Post
Эдди
сообщение Mar 9 2016, 14:36
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Фактически эта проблема может возникнуть только если приложение больше 2ГБ оперативы захочет выделить себе на 32-битной машине. Что маловероятно. На 64-битной же пока что еще запаса полным-полно!
Хотя, с другой стороны, в одноплатниках вполне может понадобиться использовать и больше 2ГБ в одном приложении (если ресурсы позволяют). И тут может возникнуть проблема. Скорей бы все производители одноплатников перешли на 64-битную архитектуру!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 9 2016, 14:37
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

Цитата(kolobochishe @ Mar 9 2016, 15:31) *
А как в знаковый может быть помещен адрес без каких-либо ограничений. Диапазон то сузился в 2 раза.
Диапазон остался тем же. Верхняя половина адресов все еще может быть представлена как отрицательные адреса.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 9 2016, 15:39
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(Сергей Борщ @ Mar 9 2016, 19:37) *
Диапазон остался тем же. Верхняя половина адресов все еще может быть представлена как отрицательные адреса.


Хм.. Действительно. Проверил в MSVS. При дальнейшем использовании в выражении с size_t переменными все приводится правильно и значения верные даже если size_t переменные больше INT_MAX
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016