48 / 37 / 14
Регистрация: 23.12.2015
Сообщений: 188
1

Смысл std::size_t а не size_t

31.01.2022, 19:41. Показов 2291. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здесь
Что наиболее быстро для попиксельного перекодирования? Есть ли стандартные функции?
обсуждали пример профессионального кода (исходники библиотеки SFML)
https://github.com/SFML/SFML/b... e.cpp#L303
В нем есть например строка
for (std::size_t y = 0; y < m_size.y; ++y)
В ней все очевидно, кроме выделенного.
В чем смысл так писать? Если скажем std::string компилится когда подключен "его" инклуд, а вот string только если ранее подключено пространство имен std, и есть неочевидные вопросы - что лучше, но это хоть относительно понятно, "что и о чем думать".
А почему вообще в языке существует std::size_t если size_t это внебиблиотечный целочисленный тип, и можно же писать просто size_t, это годится и без подключения std?

https://www.sfml-dev.org/docum... eoMode.php
Ранее в документации SFML той же видел такой код

C++
1
2
3
4
5
6
7
8
9
// Display the list of all the video modes available for fullscreen
std::vector<sf::VideoMode> modes = sf::VideoMode::getFullscreenModes();
for (std::size_t i = 0; i < modes.size(); ++i)
{
    sf::VideoMode mode = modes[i];
    std::cout << "Mode #" << i << ": "
              << mode.width << "x" << mode.height << " - "
              << mode.bitsPerPixel << " bpp" << std::endl;
}
Тот же вопрос.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2022, 19:41
Ответы с готовыми решениями:

Беззнаковый тип size_t: чем различие между size_t, uintptr_t, ptrdiff_t и intptr_t?
В чем вообще его смысл? Разве запись double a = {1,2,3}; int i = 1; *(a+i)+=1; значит,...

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

size_t и npos
Здраствуйте! Тут в одной теме нашёл код #include&lt;string&gt; #include&lt;iostream&gt; int main(){ ...

size_t и int
Господа программисты, подскажите пожалуйста, в чем различие этих двух типов. Когда нужно...

22
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.01.2022, 20:08 2
Цитата Сообщение от Ajir Посмотреть сообщение
это внебиблиотечный целочисленный тип
во-первых:
C++
1
2
3
4
5
int main()
{
    size_t v = 42;
    (void)v;
}
Код
Error(s):
490796605/source.cpp: In function ‘int main()’:
490796605/source.cpp:3:5: error: ‘size_t’ was not declared in this scope
     size_t v = 42;
     ^~~~~~
490796605/source.cpp:4:11: error: ‘v’ was not declared in this scope
     (void)v;
           ^
во-вторых, std::size_t - это плюсовый тип, а size_t - сишный.
и это скорее size_t добавлен в библиотеку с++, а не наоборот.
std::size_t само собой разумеющийся в с++.
0
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
31.01.2022, 20:13 3
Цитата Сообщение от Ajir Посмотреть сообщение
Если скажем std::string компилится когда подключен "его" инклуд, а вот string только если ранее подключено пространство имен std
Не понял этой фразы. Что такое "подключено пространство имен"?

И <string> нужно подключать в любом случае.

Цитата Сообщение от Ajir Посмотреть сообщение
А почему вообще в языке существует std::size_t если size_t это внебиблиотечный целочисленный тип, и можно же писать просто size_t, это годится и без подключения std?
Какой еще "внебиблиотечный тип"? std::size_t - это именно библиотечный тип, объявленный именно в стандартных заголовках. Ничего "внебиблиотечного" в нем нет.

Все имена, объявленные в "сишных" загловках, вроде <cstdlib>, находятся в пространстве имен std. То есть объявляется там именно std::size_t. Но по ряду причин "сишным" загловкам разрешается опционально дополнительно объявлять эти же имена в глобальном пространстве имен.

То есть std::size_t гарантированно есть всегда (посде подключения одного из требуемых заголовков). А вот наличия ::size_t совсем не гарантируется. Потому и принято писать именно std::size_t.

P.S. Со "старинными" заголовками, вроде <stdlib.h> ситуация обратная: гарантируется ::size_t, опционально может быть std::size_t. Но включение "старинных" заголовков в С++ является deprecated.

Ваш код по ссылке включает <cstring>. Значит он должен работаь именно с std::size_t.
1
48 / 37 / 14
Регистрация: 23.12.2015
Сообщений: 188
31.01.2022, 20:17  [ТС] 4
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Не понял этой фразы. Что такое "подключено пространство имен"?
Ну в смысле
using namespace std;
или аналогичное написано, это назвал "подключено пространство имен"?

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
То есть std::size_t гарантированно есть всегда (посде подключения одного из требуемых заголовков). А вот наличия ::size_t совсем не гарантируется. Потому и принято писать именно std::size_t.
Ну и что же, если я наивный программист, то могу в счетчике цикла писать просто int - три буквы, но если хочу быть хорошим, то и size_t мало?!
0
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
31.01.2022, 20:19 5
Цитата Сообщение от Ajir Посмотреть сообщение
Ну и что же, если я наивный программист, то могу в счетчике цикла писать просто int - три буквы, но если хочу быть хорошим, то и size_t мало?!
Можно еще сделать #define Z int. Тогда везде можно будет писать всего одну букву.
1
48 / 37 / 14
Регистрация: 23.12.2015
Сообщений: 188
31.01.2022, 20:22  [ТС] 6
Ну да, в принципе конечно можно для std::size_t ввести через define или typedef псевдоним какой по эн причин выберу, но гм - идеал плюсов что, чтобы и std::int и std::char надо было писать?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.01.2022, 20:23 7
Цитата Сообщение от Ajir Посмотреть сообщение
но гм - идеал плюсов что, чтобы и std::int и std::char надо было писать?
нет. потому что int, char и т.п. - не библиотечные типы, а встроенные.
1
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
31.01.2022, 20:25 8
Цитата Сообщение от Ajir Посмотреть сообщение
чтобы и std::int и std::char надо было писать?
size_t, в отличии от указанный типов - всего лишь псевдоним.
1
48 / 37 / 14
Регистрация: 23.12.2015
Сообщений: 188
31.01.2022, 20:28  [ТС] 9
GbaLog-, TheCalligrapher, Ну и да, мне в голову не приходило, что size_t может быть объявлен где-то в инклудах, думал, что раз целочисленный - то по определению на уровне самого языка(((
Буду знать, но это грустно(((
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
31.01.2022, 20:31 10
Цитата Сообщение от Ajir Посмотреть сообщение
и можно же писать просто size_t
Для читающего есть определённая разница: std::size_t чётко определённый задокументировнный тип, тогда же как size_t в каждом конкретном случае может оказаться чем угодно.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.01.2022, 20:38 11
Цитата Сообщение от John Prick Посмотреть сообщение
тогда же как size_t в каждом конкретном случае может оказаться чем угодно.
эээ, нет.
http://eel.is/c++draft/cstddef.syn#1
то бишь std::size_t - это тот же size_t, только в пространстве имён std.
0
2268 / 1761 / 739
Регистрация: 27.07.2012
Сообщений: 5,233
31.01.2022, 20:45 12
Цитата Сообщение от GbaLog- Посмотреть сообщение
то бишь std::size_t - это тот же size_t, только в пространстве имён std.
Я не от том. Когда читаешь код и видишь std::, то за пояснениями идёшь в документацию. А когда видишь вроде бы то же, но без std::, существует ненулевая вероятность, что это просто такое же имя для чего-то другого. Ведь никто не вынуждает включать стандартные заголовки и никто не мешает определить под известным именем какой-то свой тип.
0
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
31.01.2022, 20:53 13
Цитата Сообщение от John Prick Посмотреть сообщение
Ведь никто не вынуждает включать стандартные заголовки и никто не мешает определить под известным именем какой-то свой тип.
Если в каком-то другом пространстве имен - то да.

В С++ имена типов из стандартной библиотеки являются зарезервированными независимо от того, включены ли соответствующие стандартные заголовки. Этим С++ отличается от С.

Также http://eel.is/c++draft/extern.types: "For each type T from the C standard library, the types​ ::​T and std​::​T are reserved to the implementation and, when defined,​::​T shall be identical to std​::​T."
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
01.02.2022, 00:46 14
Ajir, Люди хотят управлять. Вот и плодят сущности без счета...
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
01.02.2022, 09:24 15
Есть две концепции:
1. Сделать программирование как можно проще, что-бы любой новичок пришёл и разобрался.
2. Максимально всё запутать, что-бы не совались со "свиным рылом в калашный ряд".
0
фрилансер
5493 / 5090 / 1046
Регистрация: 11.10.2019
Сообщений: 13,314
01.02.2022, 09:45 16
Цитата Сообщение от alexu_007 Посмотреть сообщение
Максимально всё запутать
такого нет нигде, кроме налоговой
1
-95 / 92 / 18
Регистрация: 10.03.2017
Сообщений: 306
01.02.2022, 15:15 17
Цитата Сообщение от alexu_007 Посмотреть сообщение
Максимально всё запутать
Это где например такое?
0
660 / 661 / 106
Регистрация: 29.05.2015
Сообщений: 3,964
01.02.2022, 21:39 18
Да тот же size_t - смысл один (целое число), а названий много для обозначения одного и того же.
Template мне встречалось - вызывается функция, а какая, из кода непонятно. Нужно трассировать программу, что-бы понять как и что работает. Ну и всё такое. Сделать сложно там, где можно сделать просто.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
01.02.2022, 21:59 19
Цитата Сообщение от alexu_007 Посмотреть сообщение
а названий много для обозначения одного и того же.
это, например, что?
Цитата Сообщение от alexu_007 Посмотреть сообщение
Сделать сложно там, где можно сделать просто.
а что вы предлагаете?
0
2806 / 2316 / 701
Регистрация: 29.06.2020
Сообщений: 8,562
02.02.2022, 02:58 20
Цитата Сообщение от GbaLog- Посмотреть сообщение
а что вы предлагаете?
считать на счетах

Добавлено через 3 минуты
Цитата Сообщение от alexu_007 Посмотреть сообщение
1. Сделать программирование как можно проще, что-бы любой новичок пришёл и разобрался.
2. Максимально всё запутать, что-бы не совались со "свиным рылом в калашный ряд".
Вот С#, говорят попроще ?
Недавно писал простенькую программу на С++\CLI, правила там те же что и в С#.
Так там банально нельзя сделать копию объекта.
Нужен целый вагон приблуд писать.

Если не знать возможностей и свободы С++, то может оно и ничего, хотя я сильно сомневаюсь.

Добавлено через 15 секунд
Цитата Сообщение от alexu_007 Посмотреть сообщение
1. Сделать программирование как можно проще, что-бы любой новичок пришёл и разобрался.
2. Максимально всё запутать, что-бы не совались со "свиным рылом в калашный ряд".
Вот С#, говорят попроще ?
Недавно писал простенькую программу на С++\CLI, правила там те же что и в С#.
Так там банально нельзя сделать копию объекта.
Нужен целый вагон приблуд писать.

Если не знать возможностей и свободы С++, то может оно и ничего, хотя я сильно сомневаюсь.
0
02.02.2022, 02:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2022, 02:58
Помогаю со студенческими работами здесь

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

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

А где size_t декларирован?
А где size_t декларирован?

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

Malloc для size_t
структура вида struct BufferParam { double* pBuffer; COLORREF ...

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

Типы size_t перевести в string
я нашел исходник секундомер вот код size_t millisecondsCounter(0); size_t secondsCounter(0);...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru