Страница 2 из 3

Re: Занимательная задачка: однократный вызов

Добавлено: 13 ноя 2015, 11:55
Сионист
А чем так плох флаг?

Re: Занимательная задачка: однократный вызов

Добавлено: 13 ноя 2015, 12:28
Romeo
Ничем. Это была просто занимательная задачка.

Re: Занимательная задачка: однократный вызов

Добавлено: 14 ноя 2015, 19:33
Absurd

Код: Выделить всё

void foo() {
  static struct Bar {
    Bar() {
      method1();
    }
  } bar;
  method2();
}
Вариант с статической переменной плох тем что возникает race condition в многопоточном коде. Если сделать через локальный класс, то там при включенной многопоточной сборке добавляется неявный барьер и race не происходит.

Re: Занимательная задачка: однократный вызов

Добавлено: 14 ноя 2015, 20:26
Romeo
Это какой такой компилятор неявный барьер на инициализация локального статического объекта делает? В стандарте про такое ничего не сказано, насколько я знаю. Или я отстал от жизни? Где это описано, можно ссылочку? Может 14-й стандарт? Я его ещё не штудировал глубоко, только по верхам посмотрел.

Re: Занимательная задачка: однократный вызов

Добавлено: 14 ноя 2015, 20:42
Absurd
Да, действительно "magic static" реализован только в gcc. Но давно, уже 10 лет. На Вижуалке только начиная с 2015.

http://blogs.msdn.com/b/vcblog/archive/ ... eview.aspx

Re: Занимательная задачка: однократный вызов

Добавлено: 14 ноя 2015, 21:32
Romeo
Круто, однако...

Как итог: задача из занимательной превратилась в насущную :)

Re: Занимательная задачка: однократный вызов

Добавлено: 24 ноя 2015, 16:26
Din666
вот как раз-таки вариант предложенный сишником (не++) будет падать или непредсказуемо работать в многопоточном коде )))

Re: Занимательная задачка: однократный вызов

Добавлено: 24 ноя 2015, 16:38
Din666

Код: Выделить всё

bool FunctionWithCodeA() {
   <CodeA>
   return true; // или false пофиг )
}

void Function() {

   static const bool once __attribute__((unused)) = FunctionWithCodeA();
   <CodeB> 
}
а можно даже так:

Код: Выделить всё

void Function()  {                                                                  
                                                          
       struct Function {                                                              
           static const bool WithCodeA() {
              <CodeA>                                            
               return true;                                                           
           }                                                                          
       };                                                                             

       static const bool once __attribute__((unused)) = Function::WithCodeA();                                                                                                                                                                                                   

      <CodeB> 
} 

Re: Занимательная задачка: однократный вызов

Добавлено: 25 ноя 2015, 12:59
Romeo
Последний вариант полностью анологичен моему варианту, со вложенным классом.

Re: Занимательная задачка: однократный вызов

Добавлено: 25 ноя 2015, 16:44
Din666
Сорри твоего варианта не нахожу. Это не тот ли, что на с++11 ?
если да, то требование было на c++98!

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

Вот как вспомню пример, напишу, юзал VS2008.