1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
|
|
1 | |
Char, short, int, long: какой тип выбрать?25.09.2015, 00:06. Показов 5141. Ответов 10
Метки нет Все метки)
(
Всем привет
Читая книги по C++ столкнулся с тем, что везде пишут примерно одно и тоже. Допустим про char, short, int, long пишут что типо лучше всего использовать тип int. И приводят доводы что это так сказать золотая середина между всеми этими типами. Но вот допустим если я знаю, что у меня в программе будут использоваться числа не превосходящие число 100. Зачем мне попросту тратить память указывая тип int(4 байта), когда вместо этого я бы мог обойтись типом short(2 байт). Итого если у меня в программе предположим используется 10 типов int - это займет 40 байт. А если использовать short то всего лишь 20 байт. Разница на мой взгляд есть. Так вот хотелось бы услышать ваше мнение по этому поводу, стоит ли использовать short или все же лучше пользоваться int и не заморачиваться.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
25.09.2015, 00:06 | |
Ответы с готовыми решениями:
10
Создать объединение, что содержит элементы типов char int short fload long string Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию
|
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
25.09.2015, 00:13 | 2 |
Если именно так пишут в книгах, книгу закрыть и уничтожить.
Поначалу лучше всего, вначале обучения, но не действительно лучше. До той поры, пока не придет осознание, что в этот вот тип вмещается столько-то байт, а больше мне и не надо, имеет смысл использовать int (unsigned int). А в short вообще-то не обязательно 2 байта.
2
|
2431 / 1831 / 404
Регистрация: 15.12.2013
Сообщений: 8,164
|
|
25.09.2015, 00:21 | 3 |
размер таких типов может различаться. Но вы можете использовать типы с фиксированной длинной:
http://www.cplusplus.com/reference/cstdint/
1
|
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
|
|
25.09.2015, 00:23 [ТС] | 4 |
видимо я чего-то не знаю потому что везде пишут что это 2 байта, а вот int уже имеет зависимость.
Ну а если допустим еще меньше взять тип char(хоть и пишут что он больше используется для символов) это же не означает что его не льзя использовать с числами. Или это уже перебор будет ![]()
0
|
![]() 8718 / 4299 / 957
Регистрация: 15.11.2014
Сообщений: 9,743
|
|||||||||||
25.09.2015, 00:32 | 5 | ||||||||||
![]() Решение
рассмотрим пример:
http://rextester.com/LOM90476
и использование short не сэкономило вам память. другой пример: http://rextester.com/FKWTN73961
возникает вопрос: почему компилятор стремится выровнять данные по границе int? это связанно с оптимизацией вычислений по разрядной сетке машины. int - это тип данных, который лучше всего обрабатывается на данной платформе. поэтому, что бы оптимизировать различные вычисления, компилятор стремится выравнивать данные в структурах по его границе (здесь есть нюансы, например double выравнивается по границе двойного машинного слова, но не суть) цемес в том, что используя short вы действительно можете сэкономить память, но только если хорошо понимание что делаете. однако в большинстве случаев либо сэкономить вообще не получится. либо вы сэкономите копейки, ценой потери быстродействия. Добавлено через 2 минуты вы чего то не знаете. стандарт гарантирует: http://en.cppreference.com/w/cpp/language/types
4
|
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
|
|
25.09.2015, 00:43 [ТС] | 6 |
hoggy, т.е лучше не заморачиваться да
![]()
0
|
1369 / 592 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
||||||
25.09.2015, 01:05 | 7 | |||||
dicros, вообще имеет смысл заморачиваться. Надо понимать что нет панацеи от всех болезней и иногда выгодно одно, а иногда другое.
1
|
![]() 8718 / 4299 / 957
Регистрация: 15.11.2014
Сообщений: 9,743
|
|
25.09.2015, 01:23 | 8 |
1
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|
25.09.2015, 10:31 | 9 |
Важно не хранить указатели ни в одном из этих типов (например int и long), что сгубило многие x86 приложения (библиотеки) при переходе на x64. Для подобных случаем есть, как уже заметили про cstdint, тип "intptr_t" и "uintptr_t".
2
|
![]() ![]() |
|
25.09.2015, 16:50 | 10 |
Помимо того, что переменная занимает память, ещё играет роль и скорость вычислений. Размер типа int обычно устроен таким образом, что в аппаратуре есть операции, которые умеют работать с типом такого размера. Более того, если выполнять арифметические операции над короткими типами (char и short), то по стандарту сначала операнды преобразуются к типу int, затем выполняется операция в терминах int'а, а затем результат обратно преобразуется. Во многих случаях эти преобразования успешно схлопываются оптимизациями, но не всегда
C char a, b, c, d; void foo (void) { a = (a * b) / (c * d); } Код
movsbl a, %eax movsbl b, %edx movsbl c, %ecx imull %edx, %eax movsbl d, %edx imull %edx, %ecx cltd idivl %ecx movb %al, a ret Код
movl a, %eax imull b, %eax movl c, %ecx imull d, %ecx cltd idivl %ecx movl %eax, a ret
1
|
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
|
|
25.09.2015, 21:32 [ТС] | 11 |
Всем спасибо за разъяснения, учту на будущее...
0
|
25.09.2015, 21:32 | |
Помогаю со студенческими работами здесь
11
Преобразование 2-х char в один short int записать по-битого один short int в два char Двоичный дамп short и char выводится как int Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |