Table of Contents

Вопросы управления памятью в C++

Зачем мне надо знать что-либо о памяти?

Введение в память

Что делают с памятью

тут же: почему нельзя натравить delete/free на указатель дважды? Это приведет к попытке дважды удалить адрес из списка “занятых”

Типы памяти

Str:В9. Управление памятью Sut:6.1

статическая

Str:10.4.8. Локальная статическая память Std:3.7.1 Static storage duration
Str:10.4.9. Нелокальная память – статики и глобалы. Std: 3.6.2 Initialization of non-local objects

Автоматическая(стек)

Str:10.4.4. Локальные переменные Std:3.7.2 Automatic storage duration \

Константы

Динамическая/свободная

Str:10.4.5., 6.2.6 Свободная память размещаемая new. Std:3.7.3 Dynamic storage duration

Куча

Когда какой памяти надо отдавать предпочтение?

Проблемы, связанные с памятью

Типы данных C++ и выделяемая память

Часть 2

Свойства памяти

Выравнивание

Интересные примеры по выравниванию. Как можно уменьшить размер структуры, переместив в ней поля? Выравнивание и заполнение (padding).

Например, структура Padd2a будет занимать 1 (+1) + 2 + 4 (+4)=8 байт

struct Padd2a
{
  char a;
  short b;
  int c;
  char d;
};

А структура Padd2b займет всего 1+1+2+4 байта

struct Padd2b
{
  char a;
  char d;
  short b;
  int c;
};

Endianness

Средства, унаследованные от C

Выделение/освобождение

Почему не стоит использовать в C++?

Заполнение

Альтернативы им в C++

Std:20.4.4.1-20.4.4.3; Jos 15.2 * Fill (ForwardIterator first, ForwardIterator last, const T& value) - заполняет значением value весь промежуток Std:25.2.5 * uninitialized_fill(first,last,value) - FIXME пока не понял * uninitialized_copy(first,last,first2) -

Мапенье

new/delete -- введение

Std:5.3.4/9 New
Std:5.3.5 Delete

new

delete

Определение поведения при выделении и освобождении памяти

свои ::operator new() и ::operator delete()

Std 3.7.3.1 Allocation functions
Std: 3.7.3.2 Deallocation functions

свои operator new() и operator delete()

Когда есть смысл перегружать new/delete для классов? См. Mey:50

Как это делать?:

Какие грабли нас поджидают:

Обработчик new - new_handler

namespace std{

typedef void (*new_handler)();
new handler set_new_handler(new_handler p) throw();
}

Std:3.7.3.1/3

An allocation function that fails to allocate storage can invoke the currently installed new_handler (18.4.2.2),
if any. [Note: A program-supplied allocation function can obtain the address of the currently installed
new_handler using the set_new_handler function (18.4.2.3).]
* описание функции находится в Std:18.4.2.3 , замечания по использованию в Mey:49,51 . Этой фу

new[] и delete []

Размещающий ::operator new

Str:10.4.11 Размещение объектов

Пример использования

Когда это бывает полезно

nothrow new

Widget *wid = new (std::nothrow) Widget;
if (wid==0)
{
  ...
} 

Mey:49

STL

Аллокаторы

Не знаю, куда относить

Литература

Решенные вопросы

менять настоящие константы – они сидят в одной из секций ELF-файла. Обращаться к памяти, на которую ты не замапен.

пока не понимаю

Отв: Мало что, появится слово auto

вызывают malloc/free и вызывают конструктор для не-POD-типов

я пока не понял как делать аллокатор, да и thread safety знаю понаслышке. Устранить пробелы