"Class myclass = Class ()" тратит ресурсы? - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть класс:

class Cat {
   Cat();
   Tail longTail;
}

Я не уверен, как правильно написать конструктор для него.Я не хочу делать longTail указателем по несвязанной причине.

Cat::Cat() : longTail(length) {...} 

Это не подходит, потому что длина вычисляется в конструкторе на основе значений статических членов в момент создания;(Плохая практика вверх по течению);


Вопрос

Cat::Cat() 
{
   int length;
   ...
   longTail = Tail(length);
}

Сколько раз происходит создание и копирование Tail объектов?Их создание и копирование обходятся ЦП, и мне нужны тысячи кошек.Мне кажется, этот конструктор сначала создает объект Tail по умолчанию в longTail , после этого он создает объект Tail без имени справа от назначения, затем запускает operator = on longTail и noname Хвост .Я прав?Если да, как я должен написать это вместо того, чтобы сохранить процессор?Я повторяю: longTail нужен параметр, который рассчитывается в конструкторе, и я не могу редактировать Tail class.

Ответы [ 2 ]

8 голосов
/ 30 ноября 2011

Во второй версии ваш Tail -объект будет инициализирован по умолчанию перед запуском тела конструктора. В теле вы создаете второй Tail -объект и назначаете его первому.

Чтобы включить правильную конструкцию в списке инициализаторов, вы можете заключить вычисление параметров в статическую функцию-член (поскольку, как вы сказали, это зависит только от статических членов):

class Cat {
public:
    Cat() : longTail(calculateLength()) {...} 

private:
    static int calculateLength() {}
0 голосов
/ 30 ноября 2011

Мне кажется, этот конструктор сначала создает объект Tail по умолчанию в longTail, затем создает объект Tail без имени справа от назначения, затем запускает operator = on longTail и Tail noname. Я прав?

Да.

Если да, то как мне написать вместо этого, чтобы сохранить процессор?

Возможная альтернатива: не присваивать longTail, заполнить longTail вместо:

longTail.resize (length);
// or
longTail.reserve (length);
longTail.append (x).

У вас есть реалистичные наборы данных для проверки вашего кода?

Вы пытались профилировать свой код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...