2016-04-08 2 views
0

Мне интересно, есть ли какие-либо преимущества в объявлении Box с помощью умного указателя (как Box3 в коде ниже) над (для меня более классическим) объявлением, вызвав конструктор (как Box2 в коде ниже), или если разница между этими двумя конструкциями, по существу, является предметом субъективных предпочтений.Преимущество `make_unique` над простым конструктором?

#include <iostream> 
#include <memory> 

class Box{ 
    private: 
     double length; 
     double width; 
     double height; 
    public: 
     Box(double lengthValue, double widthValue, double heightValue); 
     double volume() const;  
}; 
Box::Box(double lValue, double wValue, double hValue): 
    length {lValue}, width {wValue}, height {hValue} { 
} 
double Box::volume() const { 
    return length * width * height; 
} 
int main() {  
    Box Box2 {1.5,2.5,3.5}; 
    std::cout << Box2.volume() << std::endl;  
    auto Box3 = std::make_unique<Box>(1.5,2.5,3.5); 
    std::cout << Box3->volume() << std::endl; 
    return 0; 
} 
+3

Это не значит, что использование указателя имеет «преимущества» по сравнению с использованием указателя.Иногда указатель * требуется *. Иногда динамическое распределение памяти * требуется *. Если они вам не нужны, не используйте их «только потому, что». –

ответ

8

Динамическое распределение - это дорогостоящая операция относительно других основных операций на C++, поэтому вы должны избегать этого там, где это не требуется.

То есть большая разница в том, что динамическое распределение происходит медленно.

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

-1

Нет преимуществ в предоставленном коде, только недостатки.

0

Box2 - выделяется в стеке

Преимущества

  • распределение дешево (просто уменьшаем указатель стека)

Disadvatages

  • ассоциированная Box для Box2 должен быть создан, когда он объявлен
  • Stack память ограничена и ваша программа, скорее всего, сбой при запуске из
  • Вы не можете переместить Box2 к другому объекту без копирования (или перемещения) все данных по отдельности.

Box3 - выделяется в куче

Преимущества

  • вы можете поймать из условий памяти `улов (станд :: bad_alloc) и, возможно, справиться с ними без сбоев
  • Вы можете создать свой объект Box после того, как вы заявите Box3
  • вы можете переместить свой объект Box без необходимости копировать (или перемещать) все отдельные элементы данных.

Disadvatages

  • Box3 выделяется в куче, которая является медленной операцией.
+0

В этом ответе есть моменты поднятия бровей. _ «Box2 никогда не может быть нулевым», установленным под «disadva [n] tages» _? В самом деле? И использование «стека»/«кучи». Что заставляет вас думать, что вы можете «переместиться» из объектов с динамическим распределением? и т. д. –

+0

# Радиус действия в орбите - я попытался отредактировать ответ, чтобы решить ваши проблемы. Пожалуйста, не стесняйтесь исправлять все, что вам кажется нужным исправить. – doron

+0

Лучше я полагаю, но вам все равно будет лучше избегать этой старой и неточной терминологии «в стеке»/«на кучу», а вместо этого говорить о семантике выделения и продолжительности хранения. –

Смежные вопросы