kochevkv 0 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба Всем доброго дня! Прочитал тут статью про 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 разрядным Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба Фактически эта проблема может возникнуть только если приложение больше 2ГБ оперативы захочет выделить себе на 32-битной машине. Что маловероятно. На 64-битной же пока что еще запаса полным-полно! Хотя, с другой стороны, в одноплатниках вполне может понадобиться использовать и больше 2ГБ в одном приложении (если ресурсы позволяют). И тут может возникнуть проблема. Скорей бы все производители одноплатников перешли на 64-битную архитектуру! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба Поэтому "максимальный размер теоретически возможного массива любого типа" на 16-битной платформе - 32767 элементов. На 32-битной, соответственно, 2^31 - 1 элементов. А как в знаковый может быть помещен адрес без каких-либо ограничений. Диапазон то сузился в 2 раза.Диапазон остался тем же. Верхняя половина адресов все еще может быть представлена как отрицательные адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 0 9 марта, 2016 Опубликовано 9 марта, 2016 · Жалоба Диапазон остался тем же. Верхняя половина адресов все еще может быть представлена как отрицательные адреса. Хм.. Действительно. Проверил в MSVS. При дальнейшем использовании в выражении с size_t переменными все приводится правильно и значения верные даже если size_t переменные больше INT_MAX Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться