Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.75
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
#1

uint32, size_t и подобные им - C++

01.09.2013, 10:53. Просмотров 7201. Ответов 41
Метки нет (Все метки)

Собственно, в чем смысл данных типов, в отличие от обычных unsigned int, int и подобных им?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2013, 10:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос uint32, size_t и подобные им (C++):

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

uint32 и UINT64
Господа, не подскажете ли, какие магические слова надо написать, чтобы начать...

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

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

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

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

41
reisal78
891 / 642 / 218
Регистрация: 28.04.2013
Сообщений: 1,835
01.09.2013, 10:59 #2
Использование memsize типов (таких как size_t, ptrdiff_t, INT_PTR) в 64-битных программах, вместо 32-битных типов (int, unsigned) позволяет:
  1. Построить компилятору более простой и, следовательно, более быстрый код, в котором будут отсутствовать лишние преобразования 32-битных и 64-битных данных. Особенно это полезно при работе с адресной арифметикой и индексации массивов.
  2. Избежать ряда ошибок при обработке большого объема входных данных, когда количество обрабатываемых элементов превышает количество UINT_MAX.
  3. Избежать ряда других, более специфичных ошибок.
  4. Сделать код более переносимым между 64-битными Windows и Linux системами, в которых используются различные модели данных. Так, например, в Linux системах для индексации больших массивов можно использовать тип unsigned long, а в Windows нет.
как то так )

Добавлено через 3 минуты
http://www.viva64.com/ru/a/0050/
1
Kuzia domovenok
2209 / 1978 / 441
Регистрация: 25.03.2012
Сообщений: 6,944
Записей в блоге: 1
01.09.2013, 12:50 #3
Например, переносимость. Если использовать, например, unsigned int вместо size_t, программа будет работать только на 32разрядных системах! Например, придётся писать отдельную программу для 64х разрядных, например.
...например.
1
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
01.09.2013, 12:57 #4
uint32 - это тип фиксированного размера (32-бита). Иметь такие типы иногда очень желательно.
Например, вы передаете данные по сети и хотите быть уверенными, что на другой стороне
их тоже прочитают правильно. Независимо от версии компилятора и разрядности ОС.

А размер size_t (также, как и ptrdiff_t) варьируется, в зависимости от архитектуры.
На x86 size_t равен 4 байтам, а на x64 - уже восьми. Это помогает поддерживать
работу с объемами памяти соответствующего размера. Кроме того, название size_t
более описательно, чем int: видя функцию, которая возвращает size_t, сразу
становится понятно, что возвращается какой-то размер, а не просто число.
1
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 13:11 #5
Цитата Сообщение от nexen Посмотреть сообщение
Собственно, в чем смысл данных типов, в отличие от обычных unsigned int, int и подобных им?
Не читая предыдущих сообщений скажу:
size_t - беззнаковый целый тип, гарантирующий правильную ( [0,размер массива] ) индексацию массива не зависимо от платформы. Грубо говоря - максимальный беззнаковый целый тип платформы.
uint32 - видимо имелось в виду uint32_t. Это беззнаковый целый тип, гарантирующий размерность ("ширину") переменной 32 бита.
unsigned int - так сказать, language-specific, просто беззнаковый целый тип, "ширина" которого может отличаться от платформы и ОС, т.е. например, компилируя 32-битное приложение "ширина" типа unsigned int будет равна 32-м битам, в 64-битном приложении "ширина" будет равна 64-м битам.
Остальное по-аналогии.
2
OhMyGodSoLong
01.09.2013, 13:17
  #6

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
Например, вы передаете данные по сети и хотите быть уверенными, что на другой стороне их тоже прочитают правильно. Независимо от версии компилятора и разрядности ОС.
Для этого надо передавать байты. Endianness же.

2
castaway
01.09.2013, 13:20
  #7

Не по теме:

Тут я не могу не согласится с OhMyGodSoLong. Пример не очень удачный..

1
fasked
01.09.2013, 13:20
  #8

Не по теме:

OhMyGodSoLong, для этого есть htonl/ntohl

1
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
01.09.2013, 13:20 #9
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Для этого надо передавать байты. Endianness же.
Согласен. Просто как пример.
А для реальной платформо-независимости лучше вообще XML/JSON...
1
castaway
01.09.2013, 13:23
  #10

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
OhMyGodSoLong, для этого есть htonl/ntohl
Не думаю что кто-то применяет её для "преобразования" данных для последующей передачи.

1
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.09.2013, 13:26 #11
Цитата Сообщение от castaway Посмотреть сообщение
Не думаю что кто-то применяет её для "преобразования" данных для последующей передачи.
Я просто не могу представить для чего еще их можно применять, потому что именно для этого они и сделаны:
htonl, htons, ntohl, ntohs - convert values between host and network byte order
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2013, 13:28 #12
Цитата Сообщение от fasked Посмотреть сообщение

Не по теме:

OhMyGodSoLong, для этого есть htonl/ntohl

Не по теме:

У которых нет стандартных вариантов для восьмибайтных величин. И которых нет на POSIX-несовместимых системах.

1
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 13:30 #13
Цитата Сообщение от fasked Посмотреть сообщение
Я просто не могу представить для чего еще их можно применять, потому что именно для этого они и сделаны
Ты не совсем правильно понял то что я хотел донести.. Если есть функция для преобразования порядка байтов в "правильный" порядок, то это не значит что ей обязаны пользоваться все поголовно. Я к тому, что "матерые" программисты ей не пользуются передавая данные.
1
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.09.2013, 13:45 #14
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
У которых нет стандартных вариантов для восьмибайтных величин. И которых нет на POSIX-несовместимых системах.
В стандарте много чего нет, и всегда можно быстро набросать что-то подобное:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define TYP_INIT 0 
#define TYP_SMLE 1 
#define TYP_BIGE 2 
 
unsigned long long htonll(unsigned long long src) { 
  static int typ = TYP_INIT; 
  unsigned char c; 
  union { 
    unsigned long long ull; 
    unsigned char c[8]; 
  } x; 
  if (typ == TYP_INIT) { 
    x.ull = 0x01; 
    typ = (x.c[7] == 0x01ULL) ? TYP_BIGE : TYP_SMLE; 
  } 
  if (typ == TYP_BIGE) 
    return src; 
  x.ull = src; 
  c = x.c[0]; x.c[0] = x.c[7]; x.c[7] = c; 
  c = x.c[1]; x.c[1] = x.c[6]; x.c[6] = c; 
  c = x.c[2]; x.c[2] = x.c[5]; x.c[5] = c; 
  c = x.c[3]; x.c[3] = x.c[4]; x.c[4] = c; 
  return x.ull; 
}
Передавать байтами, а потом склеивать это, как говорится, "те же яйца, только в профиль".
Цитата Сообщение от castaway Посмотреть сообщение
"матерые" программисты ей не пользуются передавая данные
Ну-ну
1
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2013, 13:46  [ТС] #15
Убежденный, int на x86 = 4, а на x64 = 8?
0
castaway
01.09.2013, 13:49
  #16

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
Ну-ну
Вы изменитесь в моих глазах, если скажете что используете данную функцию при каждой передаче данных в сеть.

0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
01.09.2013, 13:50 #17
Цитата Сообщение от nexen Посмотреть сообщение
Убежденный, int на x86 = 4, а на x64 = 8?
На Windows они равны. LLP64.
На счет других ОС - не поручусь.
1
castaway
Эксперт С++
4926 / 3033 / 453
Регистрация: 10.11.2010
Сообщений: 11,089
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 13:51 #18
Цитата Сообщение от nexen Посмотреть сообщение
Убежденный, int на x86 = 4, а на x64 = 8?
x86 - это 386, 486, 586, 686 и т.п.
А что такое x64 ?
1
fasked
01.09.2013, 14:05
  #19

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Вы изменитесь в моих глазах, если скажете что используете данную функцию при каждой передаче данных в сеть.
Теперь уже не использую, потому что в связи со сменой проекта работаю на гораздо более высоком уровне. Ну и к слову, "grep -R htonl ." по исходникам прошивки DDWRT для роутеров выдает достаточное количество совпадений, чтобы опровергнуть слова о "матерых" программистах. Относительно стандартное применение htonl-like функции выглядит так:
Код
./btstream.cpp:  *p = htonl(idx); p++;
./btstream.cpp:  *p = htonl(off); p++;
./btstream.cpp:  *p = htonl(len);

1
ValeryS
Модератор
7128 / 5396 / 669
Регистрация: 14.02.2011
Сообщений: 18,215
01.09.2013, 14:11 #20
Цитата Сообщение от castaway Посмотреть сообщение
x86 - это 386, 486, 586, 686 и т.п.
А что такое x64 ?
x86 принято так называть 32 битные процессоры
в них не входит 8086, 8088, 80186, 80286 они не 32 битные
x64 соответственно 64битные
1
01.09.2013, 14:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 14:11
Привет! Вот еще темы с решениями:

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

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

Ошибка при использовании size_t
Выдает много ошибок связанные с использованием typedef std::size_t ...

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


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

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

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