привет
Подскажите в каком случае выгодно добавлять static к временной локальной переменной в функции?
Чтобы она не создавалась каждый раз на стеке(хранить состояние между вызовами не нужно)
Здравствуйте, Аноним, Вы писали:
А>привет А>Подскажите в каком случае выгодно добавлять static к временной локальной переменной в функции? А>Чтобы она не создавалась каждый раз на стеке(хранить состояние между вызовами не нужно)
статик внутри функции это всегда непереносимая функция какашка годная только для одного проекта и специфического контекста несовместимая с многопоточностью вообщем это плохо этого надо избегать при любой возможности хорошие мобильные и реентабельные функции не должны обращатся к глобальнывм данным к этому надо стремится в идеале
Я,к примеру, реализую семантику "заморозки" метода после первого вызова с помощью static.
// Freeze.cpp : Defines the entry point for the console application.
//#include"stdafx.h"#include <vector>
#include <algorithm>
#define FREEZABLE(ret) static std::vector<void*> __freezeHelper__;\
std::vector<void*>::iterator result;\
result = std::find(__freezeHelper__.begin(), __freezeHelper__.end(), this);\
if (result == __freezeHelper__.end())\
__freezeHelper__.push_back(this);\
else return ret
class Temp {
public:
void f() {
FREEZABLE(;)
printf("f for Temp called");
}
};
int main(int argc, char* argv[])
{
Temp t1;
t1.f();//have output
t1.f();//no effect
t1.f();//no effect
Temp t2;
t2.f();//have output
t2.f();//no effect
t2.f();//no effectreturn 0;
}
Здравствуйте, Аноним, Вы писали:
А>привет А>Подскажите в каком случае выгодно добавлять static к временной локальной переменной в функции? А>Чтобы она не создавалась каждый раз на стеке(хранить состояние между вызовами не нужно)
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>статик внутри функции это всегда непереносимая функция какашка годная только для одного проекта и специфического контекста несовместимая с многопоточностью
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, purser, Вы писали:
P>>Я,к примеру, реализую семантику "заморозки" метода после первого вызова с помощью static. P>>
Здравствуйте, igna, Вы писали:
I>Здравствуйте, jyuyjiyuijyu, Вы писали:
J>>статик внутри функции это всегда непереносимая функция какашка годная только для одного проекта и специфического контекста несовместимая с многопоточностью
I>Вот пример не вызывающий вышеуказанных проблем:
I>
я говорю про проблемы при попытке выполнить кукок кода несколько десятков функций
вызывающих друг друга сразу в нескольких потоках если там есть статики то
поимееш геморой и самое простое будет влепить синхронизацию а если бы сразу
писался в расчете на многопоточное выполнение то архитектура была бы другая
Здравствуйте, igna, Вы писали:
I>Здравствуйте, jyuyjiyuijyu, Вы писали:
J>>статик внутри функции это всегда непереносимая функция какашка годная только для одного проекта и специфического контекста несовместимая с многопоточностью
I>Вот пример не вызывающий вышеуказанных проблем:
I>
получается так что хороший реентабельный код всегда независим а со статиками
очень контекстнозависим м очень специфичен для конкретной проги отношение из
за этого к нему "фуу..."
Здравствуйте, Аноним, Вы писали:
А>Подскажите в каком случае выгодно добавлять static к временной локальной переменной в функции? А>Чтобы она не создавалась каждый раз на стеке(хранить состояние между вызовами не нужно)
Когда тебе кажется, что тебя завтра уволят без выходного пособия
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, jyuyjiyuijyu, Вы писали:
J>>несовместимая с многопоточностью
ДД>Для многопоточного приложения достаточно обеспечить к такой переменной синхронный доступ, и проблем не будет.
вот именно обеспечить а если это не твой код и ты в нем в зуб ногой
ну как обеспечиш ? когда разберешся чтоб где то в другом не накосячить
конечно если это твой код то можеш хоть что делать
статик это сплошные грабли ни одного плюса только минусы
Здравствуйте, purser, Вы писали:
P>Я,к примеру, реализую семантику "заморозки" метода после первого вызова с помощью static.
А зачем это вообще надо? Кроме того, ТС написал, что ему не надо хранить контекст между вызовами.
P>
P>// Freeze.cpp : Defines the entry point for the console application.
P>//
P>#include"stdafx.h"
P>#include <vector>
P>#include <algorithm>
P>#define FREEZABLE(ret) static std::vector<void*> __freezeHelper__;\
P> std::vector<void*>::iterator result;\
P> result = std::find(__freezeHelper__.begin(), __freezeHelper__.end(), this);\
P> if (result == __freezeHelper__.end())\
P> __freezeHelper__.push_back(this);\
P> else return ret
P>
Теперь по этому коду. Тебя не смущает, что
1) Это не читабельно ни разу
2) Это UB
3) Это не работает в обычном случае
4) А в многпоточном окружении это не работает просто фатально
5) Ну и тупо поле с флагом проще, понятнее, эффективнее и надёжнее.
Для просветления советую помедитировать над кодом:
void ups()
{
Temp t;
t.f();
}
int main(int argc, char* argv[])
{
for( int i = 0; i < 10; i++ ) {
ups();
}
return 0;
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, purser, Вы писали:
P>>Я,к примеру, реализую семантику "заморозки" метода после первого вызова с помощью static. E>А зачем это вообще надо? Кроме того, ТС написал, что ему не надо хранить контекст между вызовами.
Допустим, есть виртуальный метод инициализации. Он должен быть вызван для объекта один раз.
Я знаю, что это ужасно выглядит для макрофобов. Скажи как мне по другому объявить такую семантику.
P>>
P>>// Freeze.cpp : Defines the entry point for the console application.
P>>//
P>>#include"stdafx.h"
P>>#include <vector>
P>>#include <algorithm>
P>>#define FREEZABLE(ret) static std::vector<void*> __freezeHelper__;\
P>> std::vector<void*>::iterator result;\
P>> result = std::find(__freezeHelper__.begin(), __freezeHelper__.end(), this);\
P>> if (result == __freezeHelper__.end())\
P>> __freezeHelper__.push_back(this);\
P>> else return ret
P>>
E>Теперь по этому коду. Тебя не смущает, что E>1) Это не читабельно ни разу
Кому как E>2) Это UB
С кем не бывает, нужно докрутить, предложения принимаются E>3) Это не работает в обычном случае
Почему же нет. Можешь проверить.
E>4) А в многпоточном окружении это не работает просто фатально
А мне и не надо в многопоточном. E>5) Ну и тупо поле с флагом проще, понятнее, эффективнее и надёжнее.
Мне удобней вставить одно слово в функцию, чем заводить флажки и методы для них
E>Для просветления советую помедитировать над кодом:
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>я говорю про проблемы при попытке выполнить кукок кода несколько десятков функций J>вызывающих друг друга сразу в нескольких потоках если там есть статики то J>поимееш геморой и самое простое будет влепить синхронизацию а если бы сразу J>писался в расчете на многопоточное выполнение то архитектура была бы другая
Вы ставите условие с многопоточностью как заведомо не ложное, но забываете что условие ставите не вы.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, purser, Вы писали:
E>>4) А в многпоточном окружении это не работает просто фатально P>А мне и не надо в многопоточном. E>>5) Ну и тупо поле с флагом проще, понятнее, эффективнее и надёжнее. P>Мне удобней вставить одно слово в функцию, чем заводить флажки и методы для них
А мне нифига не удобней читать чужой г-код из-за того что кому-то стало неудобно заводить флажки и методы для них. Первое правило программиста — ты пишешь код не для себя! Ты его нарушил — поведение твоих коллег по отношение к тебе — UB! Намёк понятен?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>>>несовместимая с многопоточностью ДД>>Для многопоточного приложения достаточно обеспечить к такой переменной синхронный доступ, и проблем не будет. J>вот именно обеспечить а если это не твой код и ты в нем в зуб ногой J>ну как обеспечиш ? когда разберешся чтоб где то в другом не накосячить
Стопудовая логика, код не понял — поставлю мютекс.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, purser, Вы писали:
E>>>4) А в многпоточном окружении это не работает просто фатально P>>А мне и не надо в многопоточном. E>>>5) Ну и тупо поле с флагом проще, понятнее, эффективнее и надёжнее. P>>Мне удобней вставить одно слово в функцию, чем заводить флажки и методы для них V>А мне нифига не удобней читать чужой г-код из-за того что кому-то стало неудобно заводить флажки и методы для них. Первое правило программиста — ты пишешь код не для себя! Ты его нарушил — поведение твоих коллег по отношение к тебе — UB! Намёк понятен?
Тебе сложно один раз прочитать макрос и понять для чего он ? Ну так и будешь всю жизнь флажки копипастить.
Здравствуйте, ДимДимыч, Вы писали:
J>>несовместимая с многопоточностью ДД>Для многопоточного приложения достаточно обеспечить к такой переменной синхронный доступ, и проблем не будет.
Не поможет с реентарабельным кодом.
Здравствуйте, purser, Вы писали:
V>>А мне нифига не удобней читать чужой г-код из-за того что кому-то стало неудобно заводить флажки и методы для них. Первое правило программиста — ты пишешь код не для себя! Ты его нарушил — поведение твоих коллег по отношение к тебе — UB! Намёк понятен? P>Тебе сложно один раз прочитать макрос и понять для чего он ? Ну так и будешь всю жизнь флажки копипастить.
"У каждой проблемы есть простое, красивое и неправильное решение" (с) Генри Менкен
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, purser, Вы писали:
V>>>А мне нифига не удобней читать чужой г-код из-за того что кому-то стало неудобно заводить флажки и методы для них. Первое правило программиста — ты пишешь код не для себя! Ты его нарушил — поведение твоих коллег по отношение к тебе — UB! Намёк понятен? P>>Тебе сложно один раз прочитать макрос и понять для чего он ? Ну так и будешь всю жизнь флажки копипастить. C>"У каждой проблемы есть простое, красивое и неправильное решение" (с) Генри Менкен
Язык должен позволять создавать новые абстракции, называть их и пользоваться ими. Я просто попытался создать нужную
мне абстракцию на С++.