static + local var
От: Аноним  
Дата: 07.07.11 16:58
Оценка:
привет
Подскажите в каком случае выгодно добавлять static к временной локальной переменной в функции?
Чтобы она не создавалась каждый раз на стеке(хранить состояние между вызовами не нужно)
c++ static local var
Re: static + local var
От: jyuyjiyuijyu  
Дата: 07.07.11 17:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>привет

А>Подскажите в каком случае выгодно добавлять static к временной локальной переменной в функции?
А>Чтобы она не создавалась каждый раз на стеке(хранить состояние между вызовами не нужно)
статик внутри функции это всегда непереносимая функция какашка годная только для одного проекта и специфического контекста несовместимая с многопоточностью вообщем это плохо этого надо избегать при любой возможности хорошие мобильные и реентабельные функции не должны обращатся к глобальнывм данным к этому надо стремится в идеале
Re: static + local var
От: purser Россия  
Дата: 07.07.11 18:00
Оценка: :)
Я,к примеру, реализую семантику "заморозки" метода после первого вызова с помощью 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 effect
    
    return 0;
}




Здравствуйте, Аноним, Вы писали:

А>привет

А>Подскажите в каком случае выгодно добавлять static к временной локальной переменной в функции?
А>Чтобы она не создавалась каждый раз на стеке(хранить состояние между вызовами не нужно)
Re[2]: static + local var
От: igna Россия  
Дата: 07.07.11 18:03
Оценка: 1 (1) +3 :)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>статик внутри функции это всегда непереносимая функция какашка годная только для одного проекта и специфического контекста несовместимая с многопоточностью


Вот пример не вызывающий вышеуказанных проблем:

void f()
{
    static char const s[] = "abcd";
    . . .
}
Re[2]: static + local var
От: Cyberax Марс  
Дата: 07.07.11 18:10
Оценка: +1
Здравствуйте, purser, Вы писали:

P>Я,к примеру, реализую семантику "заморозки" метода после первого вызова с помощью static.

P>
P>int main(int argc, char* argv[])
P>{
P>    Temp t1;
P>    t1.f();//have output
P>    t1.f();//no effect
P>    t1.f();//no effect

P>    Temp t2;
P>    t2.f();//have output
P>    t2.f();//no effect
P>    t2.f();//no effect
    
P>    return 0;
P>}
P>

Багокод!

int main(int argc, char* argv[])
{
    {
        Temp t1;
        t1.f();//have output
        t1.f();//no effect
        t1.f();//no effect
    }

    {
        Temp t2;
        t2.f();//no effect!?!?! WTF???
    }
    return 0;
}

Если указатели this совпадут случайно.
Sapienti sat!
Re[3]: static + local var
От: purser Россия  
Дата: 07.07.11 18:17
Оценка: :)
Да, косячок...

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

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


P>>Я,к примеру, реализую семантику "заморозки" метода после первого вызова с помощью static.

P>>
P>>int main(int argc, char* argv[])
P>>{
P>>    Temp t1;
P>>    t1.f();//have output
P>>    t1.f();//no effect
P>>    t1.f();//no effect

P>>    Temp t2;
P>>    t2.f();//have output
P>>    t2.f();//no effect
P>>    t2.f();//no effect
    
P>>    return 0;
P>>}
P>>

C>Багокод!

C>
C>int main(int argc, char* argv[])
C>{
C>    {
C>        Temp t1;
C>        t1.f();//have output
C>        t1.f();//no effect
C>        t1.f();//no effect
C>    }

C>    {
C>        Temp t2;
C>        t2.f();//no effect!?!?! WTF???
C>    }
C>    return 0;
C>}
C>

C>Если указатели this совпадут случайно.
Re[3]: static + local var
От: jyuyjiyuijyu  
Дата: 07.07.11 18:20
Оценка:
Здравствуйте, igna, Вы писали:

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


J>>статик внутри функции это всегда непереносимая функция какашка годная только для одного проекта и специфического контекста несовместимая с многопоточностью


I>Вот пример не вызывающий вышеуказанных проблем:


I>
I>void f()
I>{
I>    static char const s[] = "abcd";
I>    . . .
I>}
I>

я говорю про проблемы при попытке выполнить кукок кода несколько десятков функций
вызывающих друг друга сразу в нескольких потоках если там есть статики то
поимееш геморой и самое простое будет влепить синхронизацию а если бы сразу
писался в расчете на многопоточное выполнение то архитектура была бы другая
Re[3]: static + local var
От: jyuyjiyuijyu  
Дата: 07.07.11 18:27
Оценка:
Здравствуйте, igna, Вы писали:

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


J>>статик внутри функции это всегда непереносимая функция какашка годная только для одного проекта и специфического контекста несовместимая с многопоточностью


I>Вот пример не вызывающий вышеуказанных проблем:


I>
I>void f()
I>{
I>    static char const s[] = "abcd";
I>    . . .
I>}
I>

получается так что хороший реентабельный код всегда независим а со статиками
очень контекстнозависим м очень специфичен для конкретной проги отношение из
за этого к нему "фуу..."
Re: static + local var
От: Erop Россия  
Дата: 07.07.11 18:28
Оценка: +1 :)))
Здравствуйте, Аноним, Вы писали:

А>Подскажите в каком случае выгодно добавлять static к временной локальной переменной в функции?

А>Чтобы она не создавалась каждый раз на стеке(хранить состояние между вызовами не нужно)

Когда тебе кажется, что тебя завтра уволят без выходного пособия
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: static + local var
От: ДимДимыч Украина http://klug.org.ua
Дата: 07.07.11 18:32
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>несовместимая с многопоточностью


Для многопоточного приложения достаточно обеспечить к такой переменной синхронный доступ, и проблем не будет.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[3]: static + local var
От: jyuyjiyuijyu  
Дата: 07.07.11 18:40
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

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


J>>несовместимая с многопоточностью


ДД>Для многопоточного приложения достаточно обеспечить к такой переменной синхронный доступ, и проблем не будет.

вот именно обеспечить а если это не твой код и ты в нем в зуб ногой
ну как обеспечиш ? когда разберешся чтоб где то в другом не накосячить
конечно если это твой код то можеш хоть что делать
статик это сплошные грабли ни одного плюса только минусы
Re[2]: static + local var
От: Erop Россия  
Дата: 07.07.11 18:45
Оценка: :)
Здравствуйте, 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;
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: static + local var
От: purser Россия  
Дата: 07.07.11 19:04
Оценка: :)
Здравствуйте, 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>Для просветления советую помедитировать над кодом:

E>void ups()
E>{
E>    Temp t;
E>    t.f();
E>}

E>int main(int argc, char* argv[])
E>{
E>    for( int i = 0; i < 10; i++ ) {
E>        ups();
E>    }
E>    return 0;
E>}
E>

И что здесь не так?
Re[4]: static + local var
От: Vain Россия google.ru
Дата: 07.07.11 19:28
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

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

J>вызывающих друг друга сразу в нескольких потоках если там есть статики то
J>поимееш геморой и самое простое будет влепить синхронизацию а если бы сразу
J>писался в расчете на многопоточное выполнение то архитектура была бы другая
Вы ставите условие с многопоточностью как заведомо не ложное, но забываете что условие ставите не вы.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: static + local var
От: Vain Россия google.ru
Дата: 07.07.11 19:36
Оценка:
Здравствуйте, purser, Вы писали:

E>>4) А в многпоточном окружении это не работает просто фатально

P>А мне и не надо в многопоточном.
E>>5) Ну и тупо поле с флагом проще, понятнее, эффективнее и надёжнее.
P>Мне удобней вставить одно слово в функцию, чем заводить флажки и методы для них
А мне нифига не удобней читать чужой г-код из-за того что кому-то стало неудобно заводить флажки и методы для них. Первое правило программиста — ты пишешь код не для себя! Ты его нарушил — поведение твоих коллег по отношение к тебе — UB! Намёк понятен?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: static + local var
От: Vain Россия google.ru
Дата: 07.07.11 19:40
Оценка: :)
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>>>несовместимая с многопоточностью

ДД>>Для многопоточного приложения достаточно обеспечить к такой переменной синхронный доступ, и проблем не будет.
J>вот именно обеспечить а если это не твой код и ты в нем в зуб ногой
J>ну как обеспечиш ? когда разберешся чтоб где то в другом не накосячить
Стопудовая логика, код не понял — поставлю мютекс.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: static + local var
От: purser Россия  
Дата: 07.07.11 19:46
Оценка:
Здравствуйте, Vain, Вы писали:

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


E>>>4) А в многпоточном окружении это не работает просто фатально

P>>А мне и не надо в многопоточном.
E>>>5) Ну и тупо поле с флагом проще, понятнее, эффективнее и надёжнее.
P>>Мне удобней вставить одно слово в функцию, чем заводить флажки и методы для них
V>А мне нифига не удобней читать чужой г-код из-за того что кому-то стало неудобно заводить флажки и методы для них. Первое правило программиста — ты пишешь код не для себя! Ты его нарушил — поведение твоих коллег по отношение к тебе — UB! Намёк понятен?

Тебе сложно один раз прочитать макрос и понять для чего он ? Ну так и будешь всю жизнь флажки копипастить.
Re[3]: static + local var
От: Cyberax Марс  
Дата: 07.07.11 19:53
Оценка: +1
Здравствуйте, ДимДимыч, Вы писали:

J>>несовместимая с многопоточностью

ДД>Для многопоточного приложения достаточно обеспечить к такой переменной синхронный доступ, и проблем не будет.
Не поможет с реентарабельным кодом.
Sapienti sat!
Re[6]: static + local var
От: Cyberax Марс  
Дата: 07.07.11 19:55
Оценка:
Здравствуйте, purser, Вы писали:

V>>А мне нифига не удобней читать чужой г-код из-за того что кому-то стало неудобно заводить флажки и методы для них. Первое правило программиста — ты пишешь код не для себя! Ты его нарушил — поведение твоих коллег по отношение к тебе — UB! Намёк понятен?

P>Тебе сложно один раз прочитать макрос и понять для чего он ? Ну так и будешь всю жизнь флажки копипастить.
"У каждой проблемы есть простое, красивое и неправильное решение" (с) Генри Менкен
Sapienti sat!
Re[7]: static + local var
От: purser Россия  
Дата: 07.07.11 20:05
Оценка:
Здравствуйте, Cyberax, Вы писали:

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


V>>>А мне нифига не удобней читать чужой г-код из-за того что кому-то стало неудобно заводить флажки и методы для них. Первое правило программиста — ты пишешь код не для себя! Ты его нарушил — поведение твоих коллег по отношение к тебе — UB! Намёк понятен?

P>>Тебе сложно один раз прочитать макрос и понять для чего он ? Ну так и будешь всю жизнь флажки копипастить.
C>"У каждой проблемы есть простое, красивое и неправильное решение" (с) Генри Менкен

Язык должен позволять создавать новые абстракции, называть их и пользоваться ими. Я просто попытался создать нужную
мне абстракцию на С++.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.