Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
1

Char, short, int, long: какой тип выбрать?

25.09.2015, 00:06. Просмотров 3472. Ответов 10
Метки нет (Все метки)

Всем привет

Читая книги по C++ столкнулся с тем, что везде пишут примерно одно и тоже. Допустим про char, short, int, long пишут что типо лучше всего использовать тип int. И приводят доводы что это так сказать золотая середина между всеми этими типами.

Но вот допустим если я знаю, что у меня в программе будут использоваться числа не превосходящие число 100. Зачем мне попросту тратить память указывая тип int(4 байта), когда вместо этого я бы мог обойтись типом short(2 байт).

Итого если у меня в программе предположим используется 10 типов int - это займет 40 байт. А если использовать short то всего лишь 20 байт. Разница на мой взгляд есть.


Так вот хотелось бы услышать ваше мнение по этому поводу, стоит ли использовать short или все же лучше пользоваться int и не заморачиваться.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2015, 00:06
Ответы с готовыми решениями:

Размер для данных (int, char, long, double, short, unsigned, float)
Напишите программу, которая будет определять размер для данных (int, char, long, double, short,...

Создать объединение, что содержит элементы типов char int short fload long string
всем доброго времени суток! мне нужно создать объединение, что содержит элементы типов char int...

Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию
1. Какие типы данных лучше всего использовать для хранения следующих значений: а) возраст человека...

Перевести long long unsigned int в массив char
Подскажите, пожалуйста, как превратить число типа long long unsigned int в массив символов? Каждый...

10
1358 / 582 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
25.09.2015, 00:13 2
Цитата Сообщение от dicros Посмотреть сообщение
лучше всего использовать тип int
Если именно так пишут в книгах, книгу закрыть и уничтожить.

Поначалу лучше всего, вначале обучения, но не действительно лучше.
До той поры, пока не придет осознание, что в этот вот тип вмещается столько-то байт, а больше мне и не надо, имеет смысл использовать int (unsigned int).

А в short вообще-то не обязательно 2 байта.
2
2368 / 1779 / 387
Регистрация: 15.12.2013
Сообщений: 7,526
25.09.2015, 00:21 3
Цитата Сообщение от dicros Посмотреть сообщение
Зачем мне попросту тратить память указывая тип int(4 байта), когда вместо этого я бы мог обойтись типом short(2 байт).
размер таких типов может различаться. Но вы можете использовать типы с фиксированной длинной:
http://www.cplusplus.com/reference/cstdint/
1
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
25.09.2015, 00:23  [ТС] 4
Цитата Сообщение от daslex Посмотреть сообщение
А в short вообще-то не обязательно 2 байта.
видимо я чего-то не знаю потому что везде пишут что это 2 байта, а вот int уже имеет зависимость.

Цитата Сообщение от daslex Посмотреть сообщение
До той поры, пока не придет осознание, что в этот вот тип вмещается столько-то байт, а больше мне и не надо
Ну а если допустим еще меньше взять тип char(хоть и пишут что он больше используется для символов) это же не означает что его не льзя использовать с числами. Или это уже перебор будет
0
Эксперт С++
8163 / 3765 / 809
Регистрация: 15.11.2014
Сообщений: 8,543
25.09.2015, 00:32 5
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от dicros Посмотреть сообщение
Зачем мне попросту тратить память
рассмотрим пример:

http://rextester.com/LOM90476

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct sample1
{
    int   value1;
    short value2;
};
struct sample2
{
    int value1;
    int value2;
};
 
int main()
{
    std::cout<<"size of sample1 = "<< sizeof(sample1)<<'\n';
    std::cout<<"size of sample2 = "<< sizeof(sample2)<<'\n';
}
как видите, размер структур одинаковый,
и использование short не сэкономило вам память.

другой пример:
http://rextester.com/FKWTN73961

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    typedef decltype(short() + short()) sum;
    
    if( is_same<sum, int>::value == 1 )
        cout<<"decltype( short()+short() ) is int"<<endl;
    
    short v1 = 0;
    short v2 = 0;
    
    if( is_same<decltype(v1 +v2), int>::value == 1 )
        cout<<"decltype( v1+v2 ) is int"<<endl;
    
    auto v3 = v1+v2;
    
    if( is_same<decltype(v3), int>::value == 1 )
        cout<<"decltype( v3 ) is int"<<endl;
}
здесь мы видим, что результат сложения двух short имеет тип int

возникает вопрос:
почему компилятор стремится выровнять данные по границе int?

это связанно с оптимизацией вычислений по разрядной сетке машины.

int - это тип данных, который лучше всего обрабатывается на данной платформе.

поэтому, что бы оптимизировать различные вычисления,
компилятор стремится выравнивать данные в структурах по его границе
(здесь есть нюансы,
например double выравнивается по границе двойного машинного слова,
но не суть)

цемес в том, что используя short вы действительно можете сэкономить память,
но только если хорошо понимание что делаете.

однако в большинстве случаев либо сэкономить вообще не получится.
либо вы сэкономите копейки, ценой потери быстродействия.

Добавлено через 2 минуты
Цитата Сообщение от dicros Посмотреть сообщение
видимо я чего-то не знаю потому что везде пишут что это 2 байта
вы чего то не знаете.

стандарт гарантирует:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
однако фактические размеры типов (за искл char) - могут плавать.
http://en.cppreference.com/w/cpp/language/types
4
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
25.09.2015, 00:43  [ТС] 6
hoggy, т.е лучше не заморачиваться да
0
1358 / 582 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
25.09.2015, 01:05 7
dicros, вообще имеет смысл заморачиваться. Надо понимать что нет панацеи от всех болезней и иногда выгодно одно, а иногда другое.

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
25
26
27
#include <iostream>
#pragma pack(push, 1)
 
struct sample1
{
    long long int   value1;
    short value2;
};
 
struct sample2
{
    int   value1;
    short value2;
};
 
struct sample3
{
    int   value1;
    int value2;
};
 
int main()
{
    std::cout<<"(long long int) + (short)  = "<< sizeof(sample1)<<'\n';
    std::cout<<"(int) + (short) = "<< sizeof(sample2)<<'\n';
    std::cout<<"(int) + (int) = "<< sizeof(sample3)<<'\n';
}
1
Эксперт С++
8163 / 3765 / 809
Регистрация: 15.11.2014
Сообщений: 8,543
25.09.2015, 01:23 8
Цитата Сообщение от dicros Посмотреть сообщение
т.е лучше не заморачиваться да
если есть возможность не заморачиваться - лучше не заморачиваться.
1
181 / 179 / 66
Регистрация: 15.02.2015
Сообщений: 515
25.09.2015, 10:31 9
Важно не хранить указатели ни в одном из этих типов (например int и long), что сгубило многие x86 приложения (библиотеки) при переходе на x64. Для подобных случаем есть, как уже заметили про cstdint, тип "intptr_t" и "uintptr_t".
2
Evg
Эксперт CАвтор FAQ
21121 / 8137 / 628
Регистрация: 30.03.2009
Сообщений: 22,455
Записей в блоге: 30
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);
}
При запуске 32-битного gcc с опцией -O2 получаю код:

Код
        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
Теперь заменяем char на int и получим более быстрый код

Код
        movl    a, %eax
        imull   b, %eax
        movl    c, %ecx
        imull   d, %ecx
        cltd
        idivl   %ecx
        movl    %eax, a
        ret
Какая из всего этого сентенция? Если вы где-то краем уха слышали, что если писать так, то можно сэкономить три байта памяти, а если писать эдак, то можно сэкономить 3 микросекунды на исполнении, то не стОит придавать этому большое значение. Для начала просто научитесь программировать. Потом научитесь программировать хорошо. И только потом думайте о том, чтобы писать эффективный код (да и то только тогда, когда это реально нужно). В 99% случаев эффективный код получается за счёт правильного проектирования программы, а вовсе не за счёт точечных действий типа использования int'а вместо char'а, или использования сдвига на 3 вместо умножения на 8
1
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
25.09.2015, 21:32  [ТС] 11
Всем спасибо за разъяснения, учту на будущее...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2015, 21:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Программа, которая выводит на экран значение функции sizeof от типов short, int, long и тд
Кого не затруднит, создайте новый проект. Определите размерность базовых типов в вашей системе. Для...

Преобразование 2-х char в один short int
Пробую преобразовать 2 char в один short int таким образом: char buf; short int skl; int...

записать по-битого один short int в два char
Здрасьте, всем. Записать побитого два char в один short int это: char char1; char char2; short...

Двоичный дамп short и char выводится как int
Доброго дня! Пытаюсь выводить двоичный дамп переменных char, short и int вот таким образом:...


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

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

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