LINUX.ORG.RU

знатокам C++


0

0

знатоки с++, скажите пожалуйста, насколько правильно использовать в ф-циях статические переменные, например static int a=0;

anonymous

Если сделать переменную статической когда её нужно сделать статической, то это правильно. Если сделать переменную статической когда её не нужно делать статической, то это не правильно. Вот как-то так... (с)

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

Попытаюсь внести некоторую ясность.
В C++ есть понятие объектов со свойственными им методами и атрибутами.
Так вот, static означает что это метод/атрибут класса, а не объекта, соответсвенно static member будет одним для всех instances данного класса. Прежде чем применять этот стиль, надо дать себе отчет, о том, для каких целей будет использоваться этот member. При использовании static внутри функции  означает что эта переменная будет выделена не в стеке, а в поле памяти глобальных переменных ( забыл как точно называется ). Это означает что эта функция не может использоваться рекурсивно или из нескольких тридов, при условии что каждая функция эту переменную меняет, а не использует как флаг или что то подобное. В любом случае это зависит от варианта использование. Но мое мнение, такого подхода следует избегать, потому что, maintenance будет затруднено.

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

Ох уж мне это форматирование :)

Попытаюсь внести некоторую ясность. В C++ есть понятие объектов со свойственными им методами и атрибутами. Так вот, static означает что это метод/атрибут класса, а не объекта, соответсвенно static member будет одним для всех instances данного класса. Прежде чем применять этот стиль, надо дать себе отчет, о том, для каких целей будет использоваться этот member. При использовании static внутри функции означает что эта переменная будет выделена не в стеке, а в поле памяти глобальных переменных ( забыл как точно называется ). Это означает что эта функция не может использоваться рекурсивно или из нескольких тридов, при условии что каждая функция эту переменную меняет, а не использует как флаг или что то подобное. В любом случае это зависит от варианта использование. Но мое мнение, такого подхода следует избегать, потому что, maintenance будет затруднено.

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

> курить

> http://ianzag.megasignal.com/ftp/pub/doc/books/C++/Modern%20C++.pdf

> в направлении "Singleton" (глава 6).

klalafuda, опять не ту траву куришь, мы о другом говорим. Но автору поста сие почитать очень будет полезно. Кстати поставлю пиво тому, кто в Symbian сможет применить singletones в апликухах.

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

> klalafuda, опять не ту траву куришь, мы о другом говорим. Но автору поста сие почитать очень будет полезно.

AFAIU они весьма близки обсуждаемой теме.

> Кстати поставлю пиво тому, кто в Symbian сможет применить singletones в апликухах.

пардон, про симбиан это не ко мне.

// wbr

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

> В C++ есть понятие объектов со свойственными им методами и атрибутами

В С++ нет таких понятий, там есть:

 - data members
 - member functions

И все это - CLASS MEMBERS

aton
()

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

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

> Если эта переменная тебе нужна только в пределах данной функции, то
очень даже правильно - инкапсуляция.

забавная интерпретация. ладно, тогда получается, что для любой

int
foo(int a, int b)
{
    int c = a + b;
    return c / 10;
}

..c должна быть статической? она ведь "нужна только в пределах данной функции" foo, right?

// wbr

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

Несовсем... 

 Человеку внутри функции понадобилась static переменная, но он
сомневался в том что объявление ее внутри функции корректно, на самом
деле это ни так, почему читай мой пост выше.


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

чего то не понял, а зачем она там static вообще? в чем плюсы?

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

> Человеку внутри функции понадобилась static переменная, но он сомневался в том что объявление ее внутри функции корректно

ну, если быть точным, в оригинале было

> знатоки с++, скажите пожалуйста, насколько правильно использовать в ф-циях статические переменные, например static int a=0;

i.e. "правильно". что само по себе вещь весьма субъективная и зависит от каждого конкретного случая. допустим, в приведенном мною примере это явно не так :)

ps: я не исходил из предположения, что автор сомневается в самой возможности объявления переменной как статической (это предпологается очевидным).

> на самом деле это ни так, почему читай мой пост выше.

ну с тем, что внутри функции можно объявить переменную как static никто и не спорит.

// wbr

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

Мы по разному поняли вопрос :) А все от того что при такой постановке
он вообще смысла не имеет.

aton
()

Вообще говоря вам тут все замечательно пояснили... Один небольшой комментарий: если есть хоть малейшее подазрение на то, что метод/функция будет использована в многопоточной прикладе -- никаких статических переменных (в ней).

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

> Не факт, такую переменную ( объект ) всегда можно защетить

а не проще не делать ее статической ?
Не слишком большой расход ресурсов на такую простецкую вещь?
Варианты защиты:
1) Mutex - ресурсы системы ( ограниченное число )
2) Флаг - странновато
3) Асинхронная обработка (очередь)- те функция является хэндлером - трудоемко

типичный пример функции inet_XXX - подавляющее большинство not multi-thread safe, вот и мучаются люди.

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

> а не проще не делать ее статической ?
 Все зависит от конкретной ситуации

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

 

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

пример применения static:
void Editor::newFile()
{
static int documentNumber = 1;

curFile = tr("document%1.txt").arg(documentNumber);
setCaption(curFile);
isUntitled = true;
++documentNumber;
}
Функция newFile() генерирует новое имя документа, например document2.txt. Поскольку переменная documentNumber объявлена как статическая, то она существует в единственном экземпляре, для всех объектов класса Editor.

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

Согласен, но я обычно выношу это в мемберы. Как именно лучше делать именно в таком случае не скажу. Наверное это остается на совести програмера.

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