@ProCxx

Страница 2083 из 2477
Владимир
23.05.2018
11:55:04
Nikita
23.05.2018
12:15:23
есть ли гарантия в стандарте, что конструктор статической переменной функции вызовется не раньше первого вызова функции?

Max
23.05.2018
12:16:00
он вызовется при первом заходе в нее

в этом и фича

Google
Max
23.05.2018
12:16:44
иначе будет неотлаживаемый гемор с порядком инициализации глобалстатиков, если они еще друг от друга зависят то пипец

Nikita
23.05.2018
12:17:01
спасибо

Constantine
23.05.2018
12:17:06
http://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables Variables declared at block scope with the specifier static have static storage duration but are initialized the first time control passes through their declaration (unless their initialization is zero- or constant-initialization, which can be performed before the block is first entered). On all further calls, the declaration is skipped.

т.е. не при заходе в функцию, а выполняется в точности один раз при достижении объявления

потокобезопасно, да

Nikita
23.05.2018
12:18:28
ога, сеньк

Constantine
23.05.2018
12:18:50
только с порядком деинициализации глобал статиков

Aidar
23.05.2018
12:19:56
Достаточно иметь структурную а не алгоритмическую последовательность

Max
23.05.2018
12:20:43
кстати а вот вопрос. а что если вот такая функция со статиком описана в хедере. и этот хедер по всей программе инклюдится. получается много таких функций в коде и куда компилятор запихнет определение? и не будет ли такого что у нескольких единиц трансляции будут свои разные копии такой функции?

Google
Aidar
23.05.2018
12:22:56
Если функция не static там какаяниюудь

Если тупо inline

Max
23.05.2018
12:23:26
ща гляну может и статик

просто там типа синглтон так сделан

но я удивился что в хедере тело функции

Alex
23.05.2018
12:23:58
ну inline по сути раскроется линейно, даже наверняка. а вообще не проще ли посмотреть дизасм листинг?)

Max
23.05.2018
12:24:00
статик

static DbLog & inst() { static DbLog instance; return instance; }

в хедере

Aidar
23.05.2018
12:24:45
,это не тот статик

Max
23.05.2018
12:25:22
а какой нужен

Aidar
23.05.2018
12:25:24
Я про сишный static

Max
23.05.2018
12:25:37
что за статик такой?

отдельная функция не член класса статическая?

Aidar
23.05.2018
12:26:17
Да

Max
23.05.2018
12:27:18
ну тут не обьявлен инлайн

Constantine
23.05.2018
12:27:24
где?

Google
Max
23.05.2018
12:27:31
static DbLog & inst() { static DbLog instance; return instance; }

Aidar
23.05.2018
12:27:40
Оно неявно инлайн

Max
23.05.2018
12:27:41
это статическая/ функция член класса

Aidar
23.05.2018
12:27:43
Потомучто член класса

Constantine
23.05.2018
12:27:53
любая функция, реализованная в объявлении класса, inline

Max
23.05.2018
12:28:06
вот этого не знал

вообще насколько я знаю компилятор сам ершает что инлайнить а что нет

типа даже на инлайн не смотрит

проверял - то что инлайн - инлайнит. то что нет - нет

но я не вдавался в разные варианты

Aidar
23.05.2018
12:28:58
inline это просто параметр линковки который говорит что ты сам отвечаешь за ODR

Max
23.05.2018
12:29:46
функции которые проверял были членами класса, обьявлены в хедере но определение было чуть ниже определения класса

Max
23.05.2018
12:29:55
и вот в определении было инлайн

Constantine
23.05.2018
12:29:57
угу

Max
23.05.2018
12:30:00
они инлайнились

Constantine
23.05.2018
12:30:01
inline это два слова

Aidar
23.05.2018
12:30:01
Constantine
23.05.2018
12:30:07
одно из них это подстановка

этим вы не управляете

другое это то, что значит ключевое слово в C++ и это инструкция линковщику

Google
Max
23.05.2018
12:30:26
Constantine
23.05.2018
12:30:33
Существует два режима линковки

(а) функция реализована один раз (б) (inline) функция реализована во всех использующих TU одинаково (см. ODR)

Aidar
23.05.2018
12:31:24
Шаблоны ещё дичь творят же

Там ваще магия

Constantine
23.05.2018
12:31:45
шаблоны по сути inline режим используют сразу

с уточнением про "нет требования реализации во всех TU"

Max
23.05.2018
12:32:31
еще есть кейз с шаблоном класса. когда в теле класса есть обьявление функции, а само определение скрыто в соседнем файле .tcc который инклюдится в хедер, где все определения шаблонных методов класса скрыты. они тоже все будут инлайн?

Admin
ERROR: S client not available

Aidar
23.05.2018
12:33:00
Ты должен их пометить ж

Constantine
23.05.2018
12:33:02
inline это свойство отдельной функции

Aidar
23.05.2018
12:33:10
Хотя смотря куда синклудил

Max
23.05.2018
12:33:14
Ты должен их пометить ж
предпочел и пометить да. но все же

Aidar
23.05.2018
12:33:33
Если синклудил до закрывающей скобки класса то нет проблем

не делай так

Constantine
23.05.2018
12:34:10
технически MSVC от 2015 вижака выдавал потенциальный ODR violation на попытку использовать лямбды в шаблонных функциях в .h файлах

Max
23.05.2018
12:34:25
копий не будет, чего вы вообще решили что они должны быть?
с того что содержимое хедера препроцессором копируется по всем файлам проета. и вызов конструктора статической переменной тоже

Google
Constantine
23.05.2018
12:34:34
вроде Энтони говорил, что вижак чудит

Max
23.05.2018
12:35:10
Если синклудил до закрывающей скобки класса то нет проблем
т.е. получается что инлайн неявный толкьо если определение функции внутри класса? а если только обьявление то нет?

Constantine
23.05.2018
12:35:21
да

Max
23.05.2018
12:35:28
все спасибо

Constantine
23.05.2018
12:35:40
в случае нескольких реализаций не инлайн функции вы в любом случае ошибку линкера получаете

а в случае разных реализаций одной инлайн функции linker UB no diagnosis

Сиие
23.05.2018
12:36:33
Max
23.05.2018
12:37:05
у меня вообще была ситуация на прошлой работе где написали шаблонов, crtp и прочей магии так что я менял тело функции но вызывалась старая реализация и курсор при отладке прыгал между функциями. так что все бывает)

и то бывало что гарды не ставили кое где

Сиие
23.05.2018
12:38:03
в один цппшник не выйдет изза гардов
да вообще не выйдет, Смейк так не работает

Alex
23.05.2018
12:38:20
к чему все гадания когда есть дизассемблер

Max
23.05.2018
12:38:43
objdump

Alex
23.05.2018
12:39:19
можно и IDA поставить

Сиие
23.05.2018
12:39:46
к чему все гадания когда есть дизассемблер
можно и без него, просто взять указатель на функцию ф одном месте и в другом и сравнить их

Alex
23.05.2018
12:40:00
ну тем более, действительно

Сиие
23.05.2018
12:40:43
но блин, это не гадания, один файл подключается один раз, иначе це буде хуйня

Max
23.05.2018
12:40:58
в один цппшник

Сиие
23.05.2018
12:41:37
в один цппшник
В какой цппшник? В один проект

Alexander
23.05.2018
12:41:59
В какой цппшник? В один проект
но один .h может подключаться в несколько .cpp

Страница 2083 из 2477