Есть ли какие-либо хорошие пользовательские средства выделения для C++, которые максимизируют местность ссылки?

У меня была такая же проблема после обновления докера с 17.05-го до 17.06-го через докер-машину

  1. Обновление /etc/systemd/system/docker.service.d/10 -machine.conf

    заменить пример

    `docker daemon` => `dockerd`
    

    с

    [Service]
    ExecStart=
    ExecStart=/usr/bin/docker deamon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic
    Environment=
    

    на

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic
    Environment=
    
  2. сбросить изменения на выполнить:

    sudo systemctl daemon-reload
    
  3. перезапустить докер:

    sudo systemctl restart docker
    
5
задан Neil G 20 May 2009 в 00:49
поделиться

7 ответов

Просто создайте свой собственный.

Посмотрите на мой старый вопрос, чтобы узнать, как начать:

Улучшения для этого распределителя стека C ++?

5
ответ дан 18 December 2019 в 13:18
поделиться

Поскольку вы не заботитесь о де- распределения вы можете использовать линейный распределитель. Выделите огромный объем памяти заранее и сохраните указатель на начало. malloc (x) перемещает указатель выделения вперед на x байтов и возвращает старое значение указателя, delete (x) заменяется заглушкой. Как упоминалось здесь, другой плакат уже имеет имплементацию

Выделения упакованы максимально плотно, выделения выполняются невероятно быстро, а память возвращается в порядке выделения. Когда ваша симуляция завершена, вы просто сбрасываете указатель распределителя на начало памяти и очищаете все указатели, которые у вас есть извне распределителя, на объекты внутри него.

Распределители пула - отличный выбор, если вы хотите удалить объекты, быстрее, чем куча, но не будет упаковывать ваши данные в память так близко и не так быстро. Используйте boost: pool для тех. Это отличный выбор для игр, если у вас есть x байтов для хранения, скажем - уровень - и вы готовы выбросить все это одновременно.

В стороне, если вас интересует производительность памяти, см. Что должен знать каждый программист о памяти-PDF . Он охватывает такие вещи, как местоположение ссылки и ее влияние на производительность. В частности, вы можете создать пул для каждого типа объектов, которые используются вместе, или объявить свои объекты как структуру массивов, а не как массив структур

Это отличный выбор для игр, если у вас есть x байтов для хранения, скажем - уровень - и вы готовы выбросить все это одновременно.

В стороне, если вас интересует производительность памяти, см. Что должен знать каждый программист о памяти-PDF . Он охватывает такие вещи, как местоположение ссылки и ее влияние на производительность. В частности, вы можете создать пул для каждого типа объектов, которые используются вместе, или объявить свои объекты как структуру массивов, а не как массив структур

Это отличный выбор для игр, если у вас есть x байтов для хранения, скажем - уровень - и вы готовы выбросить все это одновременно.

В стороне, если вас интересует производительность памяти, см. Что должен знать каждый программист о памяти-PDF . Он охватывает такие вещи, как местоположение ссылки и ее влияние на производительность. В частности, вы можете создать пул для каждого типа объектов, которые используются вместе, или объявить свои объекты как структуру массивов, а не как массив структур

4
ответ дан 18 December 2019 в 13:18
поделиться

Набор Распределитель блоков фиксированного размера работает довольно хорошо и имеет очень привлекательную лицензию (MIT).

1
ответ дан 18 December 2019 в 13:18
поделиться

Как насчет Boost.Pool?

2
ответ дан 18 December 2019 в 13:18
поделиться

Интерфейсы и реализации C Дэйва Хэнсона включают очень хороший распределитель на основе арены. Если используется память, метаданные с объектами не сохраняются, и они выделяются из непрерывного свободного пространства, так что это примерно столько места, на которое вы можете надеяться.

1
ответ дан 18 December 2019 в 13:18
поделиться

Обычным методом является выделение фиксированных блоков. См .: Леа , Робинсон , Ноултон , Грюнвальд .

Изменить: фиксированное распределение блоков действительно может оставлять пробелы, если есть частые выделения и освобождения. Один из проектов, с которым я работал, где класс мог выделить много подобъектов разного размера, но должен был сохранить их смежными, мы использовали простой пул памяти: выделить всю память, необходимую для всего содержимого объекта сразу, а затем использовать новое размещение для размещения их внутри.

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

Foo *a = new Foo();
Bar *b = new Bar;
b == ((byte *)(a)) + sizeof(Foo);

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

1
ответ дан 18 December 2019 в 13:18
поделиться

Это довольно обширная тема, просто обратитесь к википедии . Один конкретный пример был в книге Александреску и должен быть реализован в его библиотеке Локи . GCC также поставляется с несколькими реализациями std :: allocator , просто посмотрите на свой дистрибутив.

0
ответ дан 18 December 2019 в 13:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: