Что является более эффективным с точки зрения памяти: статические функции или функции объекта, который удаляется сразу? - PullRequest
1 голос
/ 18 декабря 2011

Вопрос, что говорит заголовок, статические функции? или функции объекта, который удаляется сразу?

Я знаю, что в реальной ситуации эта разница совершенно незаметна, но я все же хотел бы знать, какой из них более эффективен для экономии памяти. Я действительно не возражаю против накладных расходов, данных командами "new" и "delete".

MyClass::staticFunction();

или ...

myObject = new MyClass;
myObject->normalFunction();
delete myObject;

edit: второй код также может быть MyClass().normalFunction(); глупым ...

Есть несколько вещей, которые следует учитывать здесь;

  1. будет только один экземпляр myObject, и он используется только ОДИН РАЗ в приложении.
  2. после использования, он сразу удаляется, потому что он не нужен.
  3. можно было бы спросить, почему это даже в классе? почему бы просто не поместить функцию туда, где она используется с временными переменными? ответ - инкапсуляция и удобочитаемость. Я действительно считаю, что статические функции используют те же ресурсы, что и глобальные функции, поскольку на самом деле они действительно являются глобальными функциями, которые имеют область видимости класса. единственная причина, по которой я должен поместить его в свой собственный класс, - сделать мой код более читабельным и инкапсулировать.

Ответы [ 6 ]

6 голосов
/ 18 декабря 2011

В нынешнем виде ничего из этого не имеет смысла. Реальным решением было бы предоставить функцию free (функцию в области пространства имен), потому что - это то, что есть свободные функции для .

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

(Обратите внимание, что new и delete, скорее всего, будут иметь гораздо большие накладные расходы, чем то, что на самом деле функция делает , не говоря уже о ее вызове.)

4 голосов
/ 18 декабря 2011

на самом деле, они действительно являются глобальными функциями, которые пользуются классом

Я думаю, что это точка.

Это не имеет большого значения. Тем не менее, следующее будет иметь смысл lot :

{
    MyClass myObject;
    myObject.normalFunction();
}

Или даже,

MyClass().normalFunction();

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

1 голос
/ 18 декабря 2011

Мы не можем сказать наверняка, не попробовав это на конкретной платформе (или не зная деталей этой платформы), но мы, вероятно, можем сказать, что статическая не будет медленнее, чем та, что с new & delete.

0 голосов
/ 18 декабря 2011

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

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

0 голосов
/ 18 декабря 2011

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

0 голосов
/ 18 декабря 2011

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

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