Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

struct PPN {

unsigned int PFN: 22;

int: 3; // не используется

unsigned int CCA;

bool nonreacheable;

bool dirty;

bool valid;

bool global;

};

Упаковка битовых полей в виде слова слева направо приводит к следующему формату (см. раздел 25.5.5).

Битовое поле не обязано иметь имя, но если его нет, то к нему невозможно обратиться. Как это ни удивительно, но упаковка многих небольших значений в отдельное слово не всегда экономит память. На самом деле использование одного из таких значений приводит к излишнему расходу памяти по сравнению с использованием типа

char
или
int
даже для представления одного бита. Причина заключается в том, что для извлечения бита из слова и для записи бита в слово без изменения других битов необходимо выполнить несколько инструкций (которые также хранятся где-то в памяти). Не пытайтесь создавать битовые поля для экономии памяти, если у вас нет большого количества объектов с очень маленькими полями данных.

A.12.6. Объединения

Объединение (union) — это класс, в котором все члены расположены в одной и той же области памяти. В каждый момент времени объединение может содержать только один элемент, причем считывается только тот элемент объединения, который был записан последним. Рассмотрим пример.

union U {

int x;

double d;

}

U a;

a.x = 7;

int x1 = a.x; // OK

a.d = 7.7;

int x2 = a.x; // Ой!

Правила согласованного чтения и записи членов объединения компилятором не проверяются. Мы вас предупредили.

A.13. Шаблоны

Шаблон (template) — это класс или функция, параметризованные набором типов и/или целыми числами.

template<class T>

class vector {

public:

// ...

int size const;

private:

int sz;

T* p;

};

template<class T>

int vector<T>::size const

{

return sz;

}

В списке шаблонных аргументов ключевое слово

class
означает тип; его эквивалентной альтернативой является ключевое слово
typename
. Функция-член шаблонного класса по умолчанию является шаблонной функцией с тем же списком шаблонных аргументов, что и у класса.

Целочисленные шаблонные аргументы должны быть константными выражениями.

template<typename T, int sz>

class Fixed_array {

public:

T a[sz];

// ...

int size const { return sz; };

};

Fixed_array<char,256> x1; // OK

int var = 226;

Fixed_array<char,var> x2; // ошибка: неконстантный шаблонный аргумент

A.13.1. Шаблонные аргументы

Аргументы шаблонного класса указываются каждый раз, когда используется его имя.

vector<int> v1; // OK

vector v2; // ошибка: пропущен шаблонный аргумент

vector<int,2> v3; // ошибка: слишком много шаблонных аргументов

vector<2> v4; // ошибка: ожидается тип шаблонного аргумента

Аргументы шаблонной функции обычно выводятся из ее аргументов.

template<class T>

T find(vector<T>& v, int i)

{

return v[i];

}

vector<int> v1;

vector<double> v2;

// ...

int x1 = find(v1,2); // здесь тип T — это int

int x2 = find(v2,2); // здесь тип T — это double

Можно объявить шаблонную функцию, для которой невозможно вывести ее шаблонные аргументы. В этом случае мы должны конкретизировать шаблонные аргументы явно (точно так же, как для шаблонных классов). Рассмотрим пример.

  • Читать дальше
  • 1
  • ...
  • 482
  • 483
  • 484
  • 485
  • 486
  • 487
  • 488
  • 489
  • 490
  • 491
  • 492
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: