LINUX.ORG.RU

[cpp][noob]Помогите разобраться с использованием памяти

 


0

0

Допустим есть функция:

void foo()
{
  int bar = 0;
  ...
}

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

★★★★★

Делать переменную статической или нет - это зависит от логики её дальнейшего использования. Что же ты такое пишешь, что критичными становятся накладные расходы на создание переменной?

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

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

Turbid ★★★★★
() автор топика
Ответ на: комментарий от Turbid

Никто тебе не будет выделять память под каждую автоматическую переменную. На этапе компиляции для каждой функции уже известно, сколько ей на это дело нужно памяти, и всё будет ок. Добавление/удаление одной переменной на скорости не отразится

Gvidon ★★★★
()
Ответ на: комментарий от Turbid

Когда тебе нужно сохранять значение между вызовами функций. Искренне Ваш, К. О.

Gvidon ★★★★
()

Время на выделение памяти для этой переменной тратится и так не будет. Будут затраты только на присваивание нуля.

mikki
()
Ответ на: комментарий от mikki

>Время на выделение памяти для этой переменной тратится и так не будет. Будут затраты только на присваивание нуля.

+1

annulen ★★★★★
()
Ответ на: комментарий от Turbid

> когда вообще может понадобится static?

Не знаешь когда и хорошо, к тому же он с многопоточностью не дружит.

anonymous
()
Ответ на: комментарий от anonymous

>Не знаешь когда и хорошо, к тому же он с многопоточностью не дружит.

Сейчас почитал еще всякого и выяснил:
1. static-атрибуты доступны для общего использования объектами данного класса
2. static-методы можно использовать вообще без объектов

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

Turbid ★★★★★
() автор топика
Ответ на: комментарий от Turbid

> 2. static-методы можно использовать вообще без объектов

static переменные-члены тоже можно использовать вообще без объектов.

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

Неужели в твоей книжке совсем нет примеров?

anonymous
()
Ответ на: комментарий от anonymous

>Неужели в твоей книжке совсем нет примеров?

http://www.intuit.ru/department/pl/cpp/15/

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

2. static-методы можно использовать вообще без объектов

static переменные-члены тоже можно использовать вообще без объектов.


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

Turbid ★★★★★
() автор топика

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

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

ival ★★
()
Ответ на: комментарий от Turbid

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

Aneko
()
Ответ на: комментарий от Turbid

счетчик объектов данного класса, правильно?

да

Aneko
()
Ответ на: комментарий от Turbid

>когда мне может потребоваться первое и второе пока не представляю, а про многопоточность вообще пока и не думал.
не парься. просто пиши большую кучу мелких велосипедов. static вклинится сам. (может быть... он нужен уж в очень редких случаях)

xydo ★★
()

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

не имеет. к тому же чревато багом, ибо при следующем вызове foo она уже не будет равна 0.

и время на выделение памяти всё равно может тратиться даже если ты все переменные объявишь static. к тому же тебе опять-таки придется их переинициализировать.

xydo ★★
()

По уму static используется, как C-шный аналог анонимного неймспейса. Т.е. когда ты создаёш какие-то конструкции (глобальные объекты, утилитарные функции), и тебе же хочется сделать так, что бы их символы не экспортировались (т.е. не влияли никак на другие модули). У тебя тут два выхода:

namespace
{
   const char[] g_some_string = "sdadasda";
   const SomeObject g_global_object;

   void utility_function()
   {
     ...
   }
}
или
   static const char[] g_some_string = "sdadasda";
   static const SomeObject g_global_object;

   static void utility_function()
   {
     ...
   }
В обоих случаях, объекты будут считаться локальными и не будут влиять на модули, линкуемые с данным, и не будут засирать глобальный неймспейс.

А в реальности static в плюсах нужен, преимущественно, для создания тысяч говнокода и мега-орхитектуры, вылазящих потом багами вплоть до полного закрытия проекта, за невозможностью его стабилизировать. Например можно сделать так:

class DisgustingSingleton
{
 public:
 static void foo();
 static int  bar();

 private:
 static int m_some_membet;
 static void* m_some_other_membet;
} 

И не сделать там никакой синхронизации. А потом удивляться, чё ж это всё говно иногда падает при обращении к невалидному указателю например.

Или можно сделать как-то так

class SomeNormalSingleton;

SomeNormalSingleton* GetInstance()
{
  static SomeNormalSingleton* singleton_instance = new SomeNormalSingleton();

  return singleton_instance;
}

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

Remington
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.