Этикет C++ о членских переменных на "куче"

Если вы используете более новую версию Vue.js, у вас должно быть .default - require('./components/Welcome.vue')

, поэтому строка 5 будет выглядеть следующим образом

    {path: '/', component: require('./components/Welcome.vue').default }

Переполнение стека : Зачем нужен метод по умолчанию после require () в Vue?

9
задан 2 revs 27 February 2009 в 19:02
поделиться

4 ответа

Если у Вас есть класс, это разработано для семантики копии, и Вы выделяете/освобождаете набор памяти излишне, я видел этот являющийся плохой практикой. В целом, тем не менее, это не. Существует много классов, которые могут использовать устройство хранения данных "кучи". Просто удостоверьтесь, что Вы свободны от утечек памяти (освободите вещи в деструкторе, подсчете ссылок, и т.д.), и Вы в порядке.

Если Вы хотите больше гибкости, рассматриваете разрешение Вашему пользователю указать Средство выделения. Я объясню.

Определенные классы, например. std::vector, строка, карта, и т.д. нуждается в устройстве хранения данных "кучи" для структур данных, которые они представляют. Это не рассмотрело невежливости; когда Вы имеете автоматически выделенный vector, пользователь, как ожидают, будет знать, что буфер выделяется когда vector конструктора вызывают:

void foo() {
    // user of vector knows a buffer that can hold at least 10 ints
    // gets allocated here.
    std::vector<int> foo(10);  
}

Аналогично, для std::string, Вы знаете, что существует внутреннее, выделенный "куче" char*. Существует ли один на string экземпляр обычно до реализации STL; часто времена они - считаемая ссылка.

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

template <typename T, typename Alloc = DefaultAllocator<T> >
class vector {
    // etc.
};

Внутренне, vector использование Alloc (в каких значениях по умолчанию к тому, что средство выделения по умолчанию для T) для выделения буфера и другого устройства хранения данных "кучи" это, возможно, нуждается. Если пользователям не нравится стратегия выделения по умолчанию, они могут указать одно собственное:

vector<int, MyCustomAllocator> foo(10);

Теперь, когда конструктор выделяет, это будет использовать a MyCustomAllocator вместо значения по умолчанию. Вот некоторые детали о записи Вашего собственного средства выделения STL.

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

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

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

  • Скажите, что Ваш класс имеет очень большой буфер, например, 512 КБ или 1 МБ. Если этот буфер не хранится на "куче", Ваши пользователи могли бы потенциально превысить стековое пространство по умолчанию, если они создают несколько локальных переменных Вашего класса. В этом случае имело бы смысл выделять буфер в Вашем конструкторе и хранить его как указатель.
  • При выполнении какого-либо вида подсчета ссылок Вам будет нужен указатель для отслеживания то, сколько объектов на самом деле указывает данные.
  • Если Ваша членская переменная имеет другое время жизни, чем Ваш класс, указатель является способом пойти. Идеальным примером этого являются отложенные вычисления, где Вы только платите за создание участника, если пользователь просит его.
  • Хотя это - не обязательно прямое преимущество для Ваших пользователей, время компиляции является другой причиной использовать указатели вместо объектов. При помещении объекта в класс необходимо включать заголовочный файл, который определяет объект в заголовочном файле для класса. При использовании указателя можно передать, объявляют класс и только включают заголовочный файл, который определяет класс в исходных файлах, для которых нужен он. В крупных проектах, с помощью предописаний может решительно ускорить время компиляции путем сокращения полного размера единиц компиляции.

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

10
ответ дан 4 December 2019 в 08:53
поделиться

То, куда класс помещает своих участников, менее важно, чем это, управление ими содержится в классе; т.е. клиентам и подклассам не придется волноваться о членской переменной объекта.

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

Но если Вы удостоверяетесь, что Ваши объекты моются после themeselves, который должен быть хорошо для большинства приложений.

1
ответ дан 4 December 2019 в 08:53
поделиться

хм, я действительно не понимаю Вашего вопроса.

Если у Вас есть класс:

class MyOtherClass;
class MyClass
{
  MyOtherClass* m_pStruct;
};

Затем у клиента MyClass нет реального выбора о том, как m_pStruct будет выделен.

Но это будет решение клиента о том, как класс MyClass будет самостоятельно выделен, или на стеке или на "куче":

MyClass* pMyClass = new MyClass;

или

MyClass myClass;
0
ответ дан 4 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

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