Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
wlmn
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 200
1

Беззнаковый тип size_t: чем различие между size_t, uintptr_t, ptrdiff_t и intptr_t?

17.04.2017, 21:38. Просмотров 1196. Ответов 10
Метки нет (Все метки)

В чем вообще его смысл?
Разве запись
C
1
2
3
double a[] = {1,2,3};
int i = 1;
*(a+i)+=1;
значит, что мы перепрыгивам вперед по массиву на столько байт, сколько занимает тип i?
Просто единственное логичное объяснение, которое я нахожу: ссылка на любой объект (кроме, быть может, ссылки на функции) занимают одинакое кол-во бит. И запись a+i означает, что мы к адресу, который лежит в а прибавляем столько бит, сколько занимает i.
Не понятно только, почему у меня раньше всегда проги работали без всяких size_t.

В довесок: в чем различие между size_t, uintptr_t, ptrdiff_t и intptr_t?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2017, 21:38
Ответы с готовыми решениями:

В чем разница между uinptr_t, size_t, ptrdiff_t
В чем разница между uinptr_t, size_t, ptrdiff_t. Когда и какой из типов...

Std::size_t и std::ptrdiff_t
При вычитании одного указателя из другого, должен выходить корректный результат...

Положительное смещение: size_t vs ptrdiff_t
void foo(char* pBuffer, std::size_t size) { for (??? pos = 0; pos < size;...

size_t в операторе for
Здравствуйте. Возникла проблема с типом size_t. Данный цикл почему то...

size_t и npos
Здраствуйте! Тут в одной теме нашёл код #include<string> #include<iostream>...

10
hoggy
Заблокирован
Эксперт С++
17.04.2017, 21:47 2
Цитата Сообщение от wlmn Посмотреть сообщение
значит, что мы перепрыгивам вперед по массиву на столько байт, сколько занимает тип i?
нет.

Цитата Сообщение от wlmn Посмотреть сообщение
единственное логичное объяснение, которое я нахожу: ссылка на любой объект (кроме, быть может, ссылки на функции) занимают одинакое кол-во бит. И запись a+i означает, что мы к адресу, который лежит в а прибавляем столько бит, сколько занимает i.
нет

в выражении:
(a+i)
у вас массив типа double, и смещение i
то бишь к адресу первого элемента прибавить sizeof(double)*i байт.
получим ссылку на итый элемент.


Цитата Сообщение от wlmn Посмотреть сообщение
Не понятно только, почему у меня раньше всегда проги работали без всяких size_t.
телепаты в отпуске
0
wlmn
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 200
17.04.2017, 21:59  [ТС] 3
Работало так:
double a[] = {1.0, 2.0, 3.0};
int i = 0;
a+i всегда определялся корректно.
Стало быть, это то же самое, что a+sizeof(double)*i

Так в чем фишка size_t? В чем принципиальное отличие от int? Почему с int код корректен, но непереносим?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4802 / 2453 / 687
Регистрация: 18.10.2014
Сообщений: 4,228
17.04.2017, 22:03 4
Цитата Сообщение от wlmn Посмотреть сообщение
Не понятно только, почему у меня раньше всегда проги работали без всяких size_t.
Какое отношение приведенный кусочек кода вообще имеет к size_t? Я там никакого size_t не увидел.
0
hoggy
Заблокирован
Эксперт С++
17.04.2017, 22:09 5
Цитата Сообщение от wlmn Посмотреть сообщение
Так в чем фишка size_t?
казалось бы, какое он имеет отношение к вашей теме?

Цитата Сообщение от wlmn Посмотреть сообщение
В чем принципиальное отличие от int? Почему с int код корректен, но непереносим?
size_t - тип данных, который гарантирует,
что сможет вместить в себя циферку - размер
самого теоретически возможно большого массива
на данной платформе.

int - вообще знаковый тип.
и никаких подобных гарантий вам не даёт.
2
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
17.04.2017, 22:10 6
Цитата Сообщение от wlmn Посмотреть сообщение
в чем различие между size_t, uintptr_t, ptrdiff_t и intptr_t?
https://www.viva64.com/ru/a/0050/
0
wlmn
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 200
17.04.2017, 22:43  [ТС] 7
nd2, ага, вот я это и читаю.

Кажется, все-таки почти понял.

Типы size_t и ptrdiff_t позволяют писать переносимый код. Размер size_t и ptrdiff_t всегда совпадают с размером указателя. По этой причине именно эти типы следует использовать в качестве индексов больших массивов, для хранения указателей и арифметики с указателями.
Т.е. если в int, допустим, 32 бита, а в size_t ... сколько? Допустим, 64 бита, то интовская переменная не сможет указать на те ячейки, адрес которых занимает больше, чем 32 бита.
Правильно?

Тогда такой вопрос: а максимальный теоретический размер массива какой?
Нет, конечно, понятно, что 2^n растет очень сильно, но и памяти как таковой тоже может быть много...
Размер какого массива имеется в виду? на жестком диске, в оперативке или вообще в кэш-памяти?
0
hoggy
Заблокирован
Эксперт С++
17.04.2017, 23:06 8
Цитата Сообщение от wlmn Посмотреть сообщение
а максимальный теоретический размер массива какой?

http://rextester.com/MIGP54716

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <limits>
 
int main()
{
    std::cout <<"максимальный размер массива на данной платформе составляет " 
        << std::numeric_limits<size_t>::max() 
    << "байт\n";
}
0
wlmn
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 200
18.04.2017, 00:04  [ТС] 9
Меня интересует не сколько, а почему.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4802 / 2453 / 687
Регистрация: 18.10.2014
Сообщений: 4,228
18.04.2017, 03:21 10
Лучший ответ Сообщение было отмечено wlmn как решение

Решение

Цитата Сообщение от wlmn Посмотреть сообщение
Тогда такой вопрос: а максимальный теоретический размер массива какой?
Однозначного ответа на этот вопрос нет. Максимальный размер массива на данной платформе определяется реализацией из соображений эффективности адресации элементов массива, а также из следующих соображений:

* Реализация обязана поддерживать беззнаковый тип size_t с диапазоном [0, SIZE_MAX], в который должен помещаться размер максимального массива. Это, однако, не значит, что реализация обязана поддерживать массивы размером на весь диапазон size_t. Т.е. максимальный поддерживаемый размер массива будет меньше либо равен SIZE_MAX.

* Реализация обязана поддерживать знаковый тип ptrdiff_t с диапазоном [PTRDIFF_MIN, PTRDIFF_MAX], который предназначен для хранения разности между двумя указателями на элементы одного массива. Однако не требуется, чтобы тип ptrdiff_t был заведомо достаточен для хранения любой такой разности. То есть допускается PTRDIFF_MAX < SIZE_MAX и -PTRDIFF_MIN < SIZE_MAX.

В такой ситуации у реализаций есть несколько возможных подходов к тому, как увязать между собой максимальный размер массива и диапазоны типов size_t и ptrdiff_t:

1. Сделать тип ptrdiff_t более широким, чем тип size_t. Разрешить создание массивов размером вплоть до SIZE_MAX. Тогда разность двух указателей на элементы одного массива всегда будет помещаться в ptrdiff_t.

2. Придать типу ptrdiff_t ту же ширину, что и size_t. Разрешить создание массивов размером SIZE_MAX. Тогда вычитание двух указателей может привести к переполнению ptrdiff_t и неопределенному поведению.

3. Придать типу ptrdiff_t ту же ширину, что и size_t. Разрешить создание массивов размером не более SIZE_MAX / 2. Тогда разность двух указателей на элементы одного массива всегда будет помещаться в ptrdiff_t.

Большинство современных реализаций идет по третьему пути. То есть максимальный размер массива в них равен половине диапазона типа size_t.

Во времена платформ с сегментированной организацией памяти (DOS, Win16), реализации как правило придерживались первого или второго подхода.
5
wlmn
23 / 23 / 3
Регистрация: 05.02.2017
Сообщений: 200
19.04.2017, 05:51  [ТС] 11
TheCalligrapher, Спасибо!
0
19.04.2017, 05:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2017, 05:51

uint32, size_t и подобные им
Собственно, в чем смысл данных типов, в отличие от обычных unsigned int, int и...

Что такое Size_t
size_t чет про него так мало инфы и так мутно написанно в инете я так...

Пользовательский operator new(size_t)
Всем привет! Подскажите пожалуйста, как так получается, что при перегрузке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru