2 :
int main()
{
using namespace std;
6 : cout « "Computing the size of some C++ inbuilt variable types"
7:
|
|
«
|
endl;
|
|
|
|
|
|
|
cout
|
«
|
"Size of bool:
|
" «
|
sizeof(bool)
|
«
|
endl;
|
|
8 :
|
|
9:
|
cout
|
«
|
"Size of char:
|
" «
|
sizeof(char)
|
«
|
endl;
|
short)
|
1 0 :
|
cout
|
«
|
"Size of unsigned short int: " «
|
|
sizeof(unsigned
|
|
cout
|
«
|
endl;
|
|
|
sizeof(short) « endl;
|
|
1 1 :
|
«
|
"Size of short int: " «
|
long)
|
1 2 :
|
cout
|
«
|
"Size of unsigned
|
long
|
int: " «
|
sizeof(unsigned
|
endl;
cout « "Size of long: " « sizeof(long) « endl;
cout « "Size of int: " « sizeof(int) « endl;
cout « "Size of unsigned long long: "
sizeof(unsigned long long)« endl;
16:
|
cout
|
«
|
"Size of long long:
|
" «
|
sizeof(long
|
long) « endl;
|
17:
|
cout
|
«
|
"Size of unsigned int: " « sizeof(unsigned
|
int) « endl;
|
18:
|
cout
|
«
|
"Size of float:
|
" «
|
sizeof(float) «
|
endl;
|
|
19:
|
cout
|
«
|
"Size of double:
|
" «
|
sizeof(double)
|
« endl;
|
2 0 :
|
cout
|
«
|
"The output changes
|
with
|
compiler, hardware
|
and OS"
|
2 1 :
|
2 2 :
|
|
«
|
endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
}
Результат
Computing the size of some C++ inbuilt variable types
Size of bool: 1
Size of char: 1
Size of unsigned short int: 2
Size of short int: 2
Size of unsigned long int: 4
Size of long: 4
Size of int: 4
Size of unsigned long long: 8
Size of long long: 8
Size of unsigned int: 4
Size of float: 4
Size of double: 8
Конкретные значения вывода зависят от компилятора, аппаратных средств и операци онной системы.
Определение размера переменной с использованием оператора sizeof
|
59
|
Анализ
Вывод листинга 3.4 демонстрирует размеры различных типов в байтах и зависит от конкретной платформы: компилятора, операционной системы и аппаратных средств. Дан ный конкретный вывод — это результат выполнения программы в 32-битовом режиме (32-битовый компилятор) на 64-битовой операционной системе. Обратите внимание, что 64-битовый компилятор, вероятно, даст другие результаты, а 32-битовый компилятор автор выбрал потому, что должен был иметь возможность запускать приложение как на 32-бито вых, так и на 64-битовых системах. Вывод оператора s iz e o f свидетельствует о том, что размер переменной знакового и беззнакового типа одинаков; единственным различием у этих двух типов MSB является наличие информации о знаке.
ПРИМЕЧАНИЕ Все размеры в выводе приведены в байтах. Размер объекта - важный пара метр при резервировании памяти для нее, особенно когда резервирование осуществляется динамически.
С++11
Возможности компилятора по выведению типов и ключевое слово a u to
некоторых случаях, когда тип переменной очевиден по присваиваемому при инициали зации значению, именно он и применяется. Например, если переменная инициализирует ся значением true, типом переменной может быть только bool. В языке С++11 есть воз можность определять тип неявно, с использованием вместо него ключевого слова auto:
auto Flag = true;
Здесь задача определения конкретного типа переменной Flag оставлена компилятору. Компилятор просто проверяет характер значения, которым инициализируется перемен ная, а затем выбирает тип, наилучшим образом подходящий для этой переменной. В дан ном случае для инициализирующего значения true лучше всего подходит тип bool. Таким образом, компилятор определяет тип bool как наилучший для переменной Flag и внутрен не рассматривает ее как имеющую тип bool, что демонстрирует листинг 3.5.
ЛИСТИНГ 3.5. Использование ключевого слова auto для выведения типов компилятором
#include 2 : using namespace std;
int main()
{
auto Flag = true;
auto Number = 2500000000000;
8 :
cout « "Flag = " « Flag;
1 0 : cout « " , sizeof(Flag) = " « sizeof(Flag) << endl;
1 1 : cout « "Number = " « Number;
1 2 : cout « " , sizeof(Number) =•" « sizeof(Number) « endl;
13:
return 0;
}
60 ЗАНЯТИЕ 3. Использование переменных, объявление констант
Результат
Flag = 1 , sizeof(Flag) = 1
Number = 2500000000000 , sizeof(Number) = 8
Анализ
Как можно заметить, вместо явного указания типа b o o l для переменной F la g и типа lo n g lo n g для переменной Number в строках 6 и 7, где они объявляются, было исполь зовано ключевое слово a u to . Это делегирует реш ение о типе переменных компилятору, который использует для этого инициализирующее значение. Чтобы проверить, создал ли компилятор фактически предполагаемые типы, используется оператор s iz e o f , позволяю щий увидеть в выводе листинга 3.4, что это действительно так.
ПРИМЕЧАНИЕ Использование ключевого слова auto требует инициализации переменной,
поскольку компилятор нуждается в инициализирующем значении, чтобы при
нять решение о наилучшем типе для переменной.
Если вы не инициализируете переменную, то применение ключевого слова auto приведет к ошибке при компиляции.
Хотя на первый взгляд ключевое слово a u to кажется не особенно полезным, оно суще ственно упрощает программирование в тех случаях, когда тип переменной сложен. Возь мем, например, случай, когда объявляется динамический массив целых чисел MyNumbers
форме s t d : : v e c to r : std::vector MyNumbers;
Вы обращаетесь к элементам массива (или перебираете их) и отображаете полученные значения, используя следующий код:
for ( vector::const_iterator Iterator = MyNumbers.begin ();
Iterator < MyNumbers.end();
++Iterator )
cout « * Iterator << " ";
Ни тип s t d : .- v e c to r, ни оператор цикла f o r еще не были объяснены, поэтому не волнуйтесь, если код кажется непонятным. Он лишь перебирает все элементы вектора, начиная с начала до конца, и отображает их значения с помощью оператора c o u t. Посмо трите на сложность первой строки, где объявляется переменная I t e r a t o r и ей присваи вается исходное значение, возвращенное методом b e g in (). Переменная I t e r a t o r имеет тип v e c t o r < i n t > : : c o n s t _ i t e r a t o r , изучать и писать который программистам весьма сложно. Вместо того чтобы знать его наизусть, программист может положиться на тип возвращаемого значения метода b e g in () и упростить код цикла f o r до следующего:
for( auto Iterator = MyNumbers.begin();
Iterator < MyNumbers.end();
++Iterator )
cout « * Iterator « "
Обратите внимание, насколько короче стала первая строка. Компилятор проверяет инициализирую щ ее значение переменной I t e r a t o r , которым является возвращ аемое
Использование ключевого слова typedef для замены типа переменной
|
6 1
|
значение метода b e g in (), и назначает его как тип переменной. Это упрощ ает программи рование на языке C++, особенно когда вы используете шаблоны не очень часто.
Использование ключевого слова typedef для замены типа переменной
Язык C++ позволяет переименовывать типы переменных в нечто, что вы могли бы найти более удобным. Для этого используется ключевое слово ty p e d e f . Например, про граммист хочет назначить типу u n s ig n e d i n t более описательное имя STRICTLY_POSI-TIVE_INTEGER.
Do'stlaringiz bilan baham: |