Каковы варианты использования конструкции C ++ «размещение нового»?

Для тех, кто использует варево. Просто свяжите версию mysql с опцией «--force».

brew link mysql56 --force
13
задан Scottie T 12 December 2008 в 14:47
поделиться

12 ответов

кажется мне как способ выделить объект на стеке..

0
ответ дан hasen 13 December 2008 в 00:47
поделиться

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

0
ответ дан Steve Fallows 13 December 2008 в 00:47
поделиться
  • 1
    @SteveFaulkner - Благодарность Вам Steve. Есть ли любой шанс примера, добавляемого к 5,1 спецификациям где основной элемент ясно isn' t в точке Скуби-Ду? Возможно, что-то как образец в моем ответе? – Alohci 22 January 2013 в 22:09

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

Этот вид вещи был также сделан в C, но так как нет никаких конструкторов в C, это не потребовало никакой поддержки языка.

15
ответ дан David Thornley 13 December 2008 в 00:47
поделиться
  • 1
    ожидайте, что они реализуют разумный скоро – Steve Faulkner 22 January 2013 в 21:32

Новое размещение позволяет разработчику выделять память от предварительно выделенного блока памяти. Если система больше, то разработчики идут для использования нового размещения. Теперь я работаю над большим авиационным программным обеспечением там, мы выделяем память большой емкости, которая требуется для выполнения приложения в запуске. И мы используем размещение, новое для выделения памяти везде, где требуется. Это увеличивает производительность до некоторой суммы.

1
ответ дан Vinay 13 December 2008 в 00:47
поделиться

Новое размещение не о создании равных указателей (можно просто использовать присвоение для этого!).

новое Размещение для построения объекта в конкретном местоположении. Существует три способа создать объект в C++, и новое размещение является единственным, которое дает Вам явный контроль, где тот объект "живет". Это полезно для нескольких вещей, включая общую память, устройство низкого уровня ввод-вывод и пул памяти / реализация средства выделения.

выделение стека With, объект создается наверху стека, везде, где это, оказывается, в настоящее время.

С новым "регулярным", объект создается в эффективно произвольном адресе на "куче", как управляется стандартной библиотекой (если Вы не переопределили новый оператор).

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

также стоит отметить, что оператор новая функция может быть перегружен с произвольными аргументами (так же, как любая другая функция). Эти другие аргументы передаются через "новый (аргумент 2, arg3..., argN)" синтаксис. Arg1 всегда неявно передается как "sizeof (независимо от того, что Вы создаете)".

4
ответ дан Drew Hall 13 December 2008 в 00:47
поделиться

Это также используется для встроенного программирования, где устройства IO часто отображаются на определенных адресах памяти

12
ответ дан Nemanja Trifunovic 13 December 2008 в 00:47
поделиться
  • 1
    Обратите внимание что хотя это wouldn' t работают на Ваш конкретный пример - можно обойти функцию, не векторизуемую иногда путем выполнения его через эти Vectorize функция. – Dason 5 March 2013 в 16:11

Путем управления точным размещением можно выровнять вещи в памяти, и это может иногда использоваться для улучшения производительности выборки/кэша ЦП. Никогда на самом деле видел его используемый, хотя

2
ответ дан Uri 13 December 2008 в 00:47
поделиться
  • 1
    Хорошая идея, но как, я добираюсь myForm ссылка (it' s не в объеме, только разметка)? I' ve обновил HTML для обеспечения большего количества контекста. – Martin Wickman 23 February 2013 в 04:14

Новое размещение может использоваться для создания безопасных с точки зрения типов объединений, таких как Повышение variant.

класс объединения содержит буфер, столь же большой как самый большой тип, который он указан для содержания (и с достаточным выравниванием). Это размещение new с возражает в буфер как требуется.

5
ответ дан James Hopkin 13 December 2008 в 00:47
поделиться

Его полезное при создании собственного контейнера как объекты.

, Например, если необходимо было создать вектор. При резервировании пространства для большого количества объектов, Вы хотите выделить память с некоторым методом, который не вызывает конструктора объекта (как новый символ [sizeof (объект) * reserveSize]). Затем, когда люди начинают добавлять объекты в вектор, Вы используете размещение, новое для копирования их в выделенную память.

template<typename T>
class SillyVectorExample
{
    public:
        SillyVectorExample()
            :reserved(10)
            ,size(0)
            ,data(new char[sizeof(T) * reserved])
        {}
        void push_back(T const& object)
        {
            if (size >= reserved)
            {
                // Do Somthing.
            }
            // Place a copy of the object into the data store.
            new (data+(sizeof(T)*size))  T(object);
            ++size;
        }
        // Add other methods to make sure data is copied and dealllocated correctly.
    private:
        size_t   reserved;
        size_t   size;
        char*    data;
 };

пз. Я не рекомендую делать это. Это - просто упрощенный пример того, как могут работать контейнеры.

7
ответ дан Martin York 13 December 2008 в 00:47
поделиться
  • 1
    Спасибо за подсказку Jeroen, " usage" из модуля действительно помогает решить проблему упрощения разметки проверки. – Matthew Payne 4 April 2014 в 02:58

Я использовал его при построении объектов в сегменте общей памяти.

7
ответ дан Greg Rogers 13 December 2008 в 00:47
поделиться

Я использую эту конструкцию при выполнении C++ в привилегированном режиме.

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

Все это перенесено в классы и функции, но в конец я делаю новое размещение.

4
ответ дан Edouard A. 13 December 2008 в 00:47
поделиться
  • 1
    Хотя это работало бы, если бы Вы дважды Векторизовали его, например, Векторизуйте (Векторизуйте (logplusone, " x"), " x") – russellpierce 6 March 2013 в 07:40

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

1
ответ дан Tommy Herbert 13 December 2008 в 00:47
поделиться
  • 1
    You' право ре (я проверил $scope в неправильный контроллер... понятное дело). Спасибо за ответ на мой вопрос! – Martin Wickman 23 February 2013 в 05:47
Другие вопросы по тегам:

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