Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.75
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

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

01.09.2013, 10:53. Просмотров 5557. Ответов 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? - C++
В чем вообще его смысл? Разве запись double a = {1,2,3}; int i = 1; *(a+i)+=1; значит, что мы перепрыгивам вперед по...

uint32 и UINT64 - C++
Господа, не подскажете ли, какие магические слова надо написать, чтобы начать использовать тип uint32? Мне не важно, как он называется...

size_t и npos - C++
Здраствуйте! Тут в одной теме нашёл код #include<string> #include<iostream> int main(){ std::string str="/.+(STL).$1/"; ...

size_t в операторе for - C++
Здравствуйте. Возникла проблема с типом size_t. Данный цикл почему то бесконечен for ( size_t j = 10; j >= 0; j-- ) { ; } Если...

Malloc для size_t - C++
структура вида struct BufferParam { double* pBuffer; COLORREF color; size_t size; };

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

41
reisal78
675 / 588 / 139
Регистрация: 28.04.2013
Сообщений: 1,673
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
1950 / 1803 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
01.09.2013, 12:50 #3
Например, переносимость. Если использовать, например, unsigned int вместо size_t, программа будет работать только на 32разрядных системах! Например, придётся писать отдельную программу для 64х разрядных, например.
...например.
1
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 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
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 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
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 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
Эксперт С++
4948 / 2528 / 180
Регистрация: 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
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.09.2013, 13:28 #12
Цитата Сообщение от fasked Посмотреть сообщение

Не по теме:

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

Не по теме:

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

1
castaway
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
01.09.2013, 13:30 #13
Цитата Сообщение от fasked Посмотреть сообщение
Я просто не могу представить для чего еще их можно применять, потому что именно для этого они и сделаны
Ты не совсем правильно понял то что я хотел донести.. Если есть функция для преобразования порядка байтов в "правильный" порядок, то это не значит что ей обязаны пользоваться все поголовно. Я к тому, что "матерые" программисты ей не пользуются передавая данные.
1
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 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 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2013, 13:46  [ТС] #15
Убежденный, int на x86 = 4, а на x64 = 8?
0
01.09.2013, 13:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 13:46
Привет! Вот еще темы с ответами:

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

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

Ошибка при использовании size_t - C++
Выдает много ошибок связанные с использованием typedef std::size_t size_type; #include <iostream> #include <cstring> #include...

Положительное смещение: size_t vs ptrdiff_t - C++
void foo(char* pBuffer, std::size_t size) { for (??? pos = 0; pos < size; pos++) bar(pBuffer + pos); } Какого типа лучше...


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

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

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