стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 12:24
Оценка: -1
Здравствуйте, Кодт, Вы писали:

E>>Например на мокрософтовском компиляторе такой вот код:

К>
 int plus( int arg )
E>>{
E>>    static const int seed = calc_seed();
E>>    return seed + arg;
E>>}
К>

E>>долгое время приводил к GP (АКА AV)

К>Ну, здесь-то явно баг компилятора. Зачем было класть в секцию констант объект, который инициализируется в рантайме?


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

11.09.07 20:06: Ветка выделена из темы Вопрос знатокам стандарта C++
Автор:
Дата: 04.09.07
— Павел Кузнецов
11.09.07 20:06: Ветка выделена из темы Вопрос знатокам стандарта C++ — Павел Кузнецов
Re: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 12:27
Оценка:
Здравствуйте, dandy, Вы писали:

D>Ну, вообще код типа этого — объявление статической переменной внутри функции, это потенциальный источник ошибок в мало — мальски обьемной программе. Это, наверное, не мое

D>дело, но думаю, что так писать код вообще не стоит.

Чего?
Тебе кажется, что так писать не стоит?
double foo( double x )
{
    static const sin_pi_6 = sin( pi / 6 );
    return use_it( sin_pi_6, x );
}


А почему?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: стиль: объявление статической переменной внутри функции
От: igna Россия  
Дата: 05.09.07 12:36
Оценка:
Здравствуйте, dandy, Вы писали:

D>Ну, вообще код типа этого — объявление статической переменной внутри функции, это потенциальный источник ошибок в мало — мальски обьемной программе. Это, наверное, не мое дело, но думаю, что так писать код вообще не стоит.


Приведи пример, пожалуйста, где стоит объявлять статическую переменную?
Re[2]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 13:03
Оценка:
Здравствуйте, Erop, Вы писали:

E>Чего?

E>Тебе кажется, что так писать не стоит?
double foo( double x )
E>{
E>    static const sin_pi_6 = sin( pi / 6 );
E>    return use_it( sin_pi_6, x );
E>}


E>А почему?


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

class CSinus
{
public:
static const double
_pi_6,
_pi_4,
_pi_3;
};

const double CSinus::_pi_3 = sin( pi / 3 );
const double CSinus::_pi_4 = sin( pi / 4 );
const double CSinus::_pi_6 = sin( pi / 6 );

Но тут может быть много вариаций. И у компилятора такой код протестов не вызовет.
Re[2]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 13:12
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, dandy, Вы писали:


D>>Ну, вообще код типа этого — объявление статической переменной внутри функции, это потенциальный источник ошибок в мало — мальски обьемной программе. Это, наверное, не мое дело, но думаю, что так писать код вообще не стоит.


I>Приведи пример, пожалуйста, где стоит объявлять статическую переменную?


Увы, такого не попадалось.
Re[3]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 13:32
Оценка:
Здравствуйте, dandy, Вы писали:

D>const double CSinus::_pi_3 = sin( pi / 3 );

D>const double CSinus::_pi_4 = sin( pi / 4 );
D>const double CSinus::_pi_6 = sin( pi / 6 );

D>Но тут может быть много вариаций. И у компилятора такой код протестов не вызовет.


Тут будут всякие косяки с порядком инициализации. А ещё константа может иметь смысл только в рамках функции...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 13:33
Оценка:
Здравствуйте, dandy, Вы писали:

D>>>Ну, вообще код типа этого — объявление статической переменной внутри функции, это потенциальный источник ошибок в мало — мальски обьемной программе. Это, наверное, не мое дело, но думаю, что так писать код вообще не стоит.

I>>Приведи пример, пожалуйста, где стоит объявлять статическую переменную?
D> Увы, такого не попадалось.

тут что-то не так...
Автор: dandy
Дата: 05.09.07
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 13:41
Оценка:
Здравствуйте, Erop, Вы писали:


E>Тут будут всякие косяки с порядком инициализации.


Код инициализации в этом случае выполняется при запуске программы. Можно поподробнее про косяки?

E>А ещё константа может иметь смысл только в рамках функции...


Ну если навсегда только одна эта константа и только в одной этой функции... Но как — то странно это.
Re[5]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 13:51
Оценка:
Здравствуйте, dandy, Вы писали:

E>>А ещё константа может иметь смысл только в рамках функции...

D>Ну если навсегда только одна эта константа и только в одной этой функции... Но как — то странно это.
А что, ты никогда сложные вычислительные функции не писал?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 13:52
Оценка:
Здравствуйте, dandy, Вы писали:

E>>Тут будут всякие косяки с порядком инициализации.

D>Код инициализации в этом случае выполняется при запуске программы. Можно поподробнее про косяки?
Ну представь себе, что sin не всегда посчитать можно, а только после инициализации какого-нибудь статическогообъекта...
Функции-то разные бывают. Бывают и сложные...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 14:06
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну представь себе, что sin не всегда посчитать можно, а только после инициализации какого-нибудь статическогообъекта...

E>Функции-то разные бывают. Бывают и сложные...

Если так, то понятнее было бы сделать эту переменную глобальной нестатической а инициализировать ее сразу после инициализации этого "какого-нибудь статического объекта..." если хотите сэкономить каплю времени. Если несколько тактов процессора некритично, то почему бы не сделать эту переменную локальной?
Re[7]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 14:15
Оценка: :)
Здравствуйте, dandy, Вы писали:

D>Здравствуйте, Erop, Вы писали:


E>>Ну представь себе, что sin не всегда посчитать можно, а только после инициализации какого-нибудь статическогообъекта...

E>>Функции-то разные бывают. Бывают и сложные...

D>Если так, то понятнее было бы сделать эту переменную глобальной нестатической а инициализировать ее сразу после инициализации этого "какого-нибудь статического объекта..." если хотите сэкономить каплю времени. Если несколько тактов процессора некритично, то почему бы не сделать эту переменную локальной?


Одно нехорошо — для первого случая опять же придется писать оберточный класс.
Re[7]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 14:15
Оценка:
Здравствуйте, dandy, Вы писали:

D>Если так, то понятнее было бы сделать эту переменную глобальной нестатической а инициализировать ее сразу после инициализации этого "какого-нибудь статического объекта..." если хотите сэкономить каплю времени. Если несколько тактов процессора некритично, то почему бы не сделать эту переменную локальной?


А если не несколько тактов?
И что делать с тем, что этот коэффициент не имеет смысла вне функции?

И главное, в чём смысл этой бескомпромиссной борьбы со статическими в функциях числами?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 14:36
Оценка:
Здравствуйте, Erop, Вы писали:

E>А если не несколько тактов?

А сколько времени нужно процессору, чтобы выделить память под
automatic const double
? Возможно мне что — то непонятно?

E>И что делать с тем, что этот коэффициент не имеет смысла вне функции?


В класс их завернуть... И функцию, и коэффициенты.

E>И главное, в чём смысл этой бескомпромиссной борьбы со статическими в функциях числами?


Не видел кода этой программы, но, насколько мог вас понять, что — то в этом роде приходилось дебажить. Занятие не для слабонервных.
Re[3]: стиль: объявление статической переменной внутри функции
От: igna Россия  
Дата: 05.09.07 14:42
Оценка: +1
Здравствуйте, dandy, Вы писали:

I>>Приведи пример, пожалуйста, где стоит объявлять статическую переменную?


D> Увы, такого не попадалось.


За сколько лет программирования на C++?
Re[9]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 14:46
Оценка:
Здравствуйте, dandy, Вы писали:

D>А сколько времени нужно процессору, чтобы выделить память под
automatic const double
D>
? Возможно мне что — то непонятно?


Время занимает конечно не выдлеение памяти под число, а его вычисление...

E>>И что делать с тем, что этот коэффициент не имеет смысла вне функции?

D>В класс их завернуть... И функцию, и коэффициенты.

Ну в класс завернуть идея хорошая. Но дальше-то что делать? Опять начнутся проблемы с порядком инициализации?

E>>И главное, в чём смысл этой бескомпромиссной борьбы со статическими в функциях числами?


D>Не видел кода этой программы, но, насколько мог вас понять, что — то в этом роде приходилось дебажить. Занятие не для слабонервных.


Ну что-то считаем. Константы, которые вычисляются долго и нами кэшируем при помощи статических в функциях переменных. В чём вред такого подхода --
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 15:01
Оценка:
Здравствуйте, Erop, Вы писали:

E>Время занимает конечно не выдлеение памяти под число, а его вычисление...

E>Ну в класс завернуть идея хорошая. Но дальше-то что делать? Опять начнутся проблемы с порядком инициализации?

Написать такой класс (классы), чтобы не было проблем с порядком инициализации — это сложнее, но не настолько... Вы считаете что это невозможно?

E>Ну что-то считаем. Константы, которые вычисляются долго и нами кэшируем при помощи статических в функциях переменных. В чём вред такого подхода --


Вред от такого подхода обычно начинается сразу после ухода с проекта 1 — го разработчика.
Re[11]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 15:17
Оценка:
Здравствуйте, dandy, Вы писали:

D>Написать такой класс (классы), чтобы не было проблем с порядком инициализации — это сложнее, но не настолько... Вы считаете что это невозможно?

Я считаю, что это не нужно.
Я не люблю синглетоны, но в данном случае, ИМХО, имеет место случай так называемого перебдения

E>>Ну что-то считаем. Константы, которые вычисляются долго и нами кэшируем при помощи статических в функциях переменных. В чём вред такого подхода --


D>Вред от такого подхода обычно начинается сразу после ухода с проекта 1 — го разработчика.

И состоит он в том, что?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: стиль: объявление статической переменной внутри функции
От: dandy  
Дата: 05.09.07 15:22
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, dandy, Вы писали:


I>>>Приведи пример, пожалуйста, где стоит объявлять статическую переменную?


D>> Увы, такого не попадалось.


Это имеет смысл делать в тестовых программах. Несколько сотен строк кода, не более.

I>За сколько лет программирования на C++?


Вопрос личный. По этому поводу: как — то работал в одной конторе с программистом, у которого стаж работы был более 20 — ти лет(только C/C++). Он хронически (на протяжении 6 — ти лет) не мог отладить свою программу — она вылетала у юзеров постоянно. Так что стаж работы — это характеристика та еще... В другой конторе, прога писалась на протяжении 6 — ти лет, написана она была так, что на ее отладку ушло около 3 — х месяцев (чистого времени) — при том что кода там было с гулькин хвост. Причем самый плохой код был написан разработчиком, который, знал С++ лучше всех (из тех кто над этим проектом работал)
Делайте выводы
Re[5]: стиль: объявление статической переменной внутри функции
От: Erop Россия  
Дата: 05.09.07 15:24
Оценка:
Здравствуйте, dandy, Вы писали:

D>...В другой конторе, прога писалась на протяжении 6 — ти лет, написана она была так, что на ее отладку ушло около 3 — х месяцев (чистого времени) — при том что кода там было с гулькин хвост.


НУ в целом "6 лет писали 3 месяца отлаживали" соотношение неплохое. Но от чего 6 лет писали "с гулькин хвост кода" не понятно
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.