Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
суть задачи есть необходимость написать библиотечные inline- функции (имеется в виду статическая библиотека). т.е. код для инлайнинга должен лежать в .lib, это важно, не в .h вариант делать как обычно - дефиницию помещать в .h не подходит, т.к. функции тянут за собой довольно тяжелые внешние зависимости, которые в целевом проекте не нужны (чтоб не портить ctags/intellisense и прочий автокомплит). ну и не разрешать девелоперу просто так юзать третьесторонние фичи без спросу. в visual c++ удалось подобное запинать через __inline __forceinline и обязательный /GL с /LTCG (кроссмодульно инлайнит только на линковке, иначе никак инлайниться не пожелало). в GСC же получился какой-то явный brainfuck с __attribute__ ((gnu_inline)), возврат к GNU89 семантике как-то показался сильно подозрительным. в Solaris Studio аналогично - свои чудные бубенцы с флагами обратной совместимости. до других компиляторов руки еще не дошли. собственно вопрос - у кого-то есть пример как надо правильно и кроссплатформенно делать сабж? пример библиотек? компиляторы - последних-предпоследних версий. усиленный гуглеж в течение суток убедительных примеров не дал. и желательно еще и случай .dll/.so, хотя последние не обязательны (они используются только для ускорения линковки при разработке, там все равно debug режим, а релиз собирается целиком статическим блобом) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 23:09 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
А если попробовать LTO как описано здесь? http://stackoverflow.com/questions/5987020/can-the-linker-inline-functions ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 23:44 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА если попробовать LTO как описано здесь? http://stackoverflow.com/questions/5987020/can-the-linker-inline-functions c GCC опциями компилятора проблем нет, там проблема в том, что inline атрибут на функцию указывается немного через одно место - в соответствии c С99/C11 стандартами, с выплевыванием куч warning и прочими малопонятными не покрытыми внятной документацией приседанями. кучерявыми макросами и научным тыком все это конечно решается, но осадок сырости остался. меня больше интересовал вопрос как это в принципе нужно грамотно делать, на примере существующих решений, вроде APR, QT и подобных библиотек, в проекции на все актуальные компиляторы. изучение же кроссплатформенных библиотек результата не дало - там эта тема не раскрыта, что довольно странно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 00:46 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Так при LTCG/LTO помечать как inline вообще не нужно. Компайлер сам разберется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 01:00 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojavaизучение же кроссплатформенных библиотек результата не дало - там эта тема не раскрыта, что довольно странно. Ничего странного. Inline на современных процах особой роли не играет. Поэтому никто не заморачивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 01:03 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Ну и вот эта мотивация очень специфическая. nojavaвариант делать как обычно - дефиницию помещать в .h не подходит, т.к. функции тянут за собой довольно тяжелые внешние зависимости, которые в целевом проекте не нужны (чтоб не портить ctags/intellisense и прочий автокомплит). ну и не разрешать девелоперу просто так юзать третьесторонние фичи без спросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 01:07 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskynojavaизучение же кроссплатформенных библиотек результата не дало - там эта тема не раскрыта, что довольно странно. Ничего странного. Inline на современных процах особой роли не играет. Поэтому никто не заморачивается. да да, ты еще скажи, что между O0 и O3 на современных процах разницы нет. задача явного управления инлайном - это просто ограничение маневра анализатору - а то он там сам наанализирует. Anatoly MoskovskyНу и вот эта мотивация очень специфическая. Вот тут да, ты прав, там мотивация - сделать из C/C++ среду прикладного, а не системного программирования. Стандартные библиотеки и остальное на прикладные задачи совсем не тянут - попросту неадекватны, потому и должны быть гарантированно выкинуты из доступных. Такое изначально никому не нужно - мало кто отважится сделать свой "еще один Objective C" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 03:13 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojavaсуть задачи есть необходимость написать библиотечные inline- функции (имеется в виду статическая библиотека). т.е. код для инлайнинга должен лежать в .lib, это важно, не в .h inline не могут быть библиотечными. Либо inline, либо библиотечные. Т.е. в современном последнем стандарте inlinе функции должны быть определены в заголовочном файле. Примут модули -- будет по-другому, но в любом случае не в .lib они будут лежать (видимо) nojava вариант делать как обычно - дефиницию помещать в .h не подходит, т.к. функции тянут за собой довольно тяжелые внешние зависимости, которые в целевом проекте не нужны (чтоб не портить ctags/intellisense и прочий автокомплит). Это не связанные вещи. nojavaну и не разрешать девелоперу просто так юзать третьесторонние фичи без спросу. Как бы если ты хочешь использовать inline-функции, это неизбежно. nojavaсобственно вопрос - у кого-то есть пример как надо правильно и кроссплатформенно делать сабж? пример библиотек? Никак. это невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 07:05 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojavaда да, ты еще скажи, что между O0 и O3 на современных процах разницы нет. В вашем случае нет разницы. Когда функция является оберткой над скрытой имплементацией, то инлайнь ее или нет - пофиг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 08:19 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojavaAnatoly MoskovskyНу и вот эта мотивация очень специфическая. Вот тут да, ты прав, там мотивация - сделать из C/C++ среду прикладного, а не системного программирования. Стандартные библиотеки и остальное на прикладные задачи совсем не тянут - попросту неадекватны, потому и должны быть гарантированно выкинуты из доступных. Шутник, синтаксис у С++ тоже не совсем адекватен для прикладного проганья а нативный движок + скрипты для прикладников чем не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 08:21 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Тут - целый топик про преждевременную оптимизацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 10:01 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
MasterZivinline не могут быть библиотечными. Либо inline, либо библиотечные. MasterZivНикак. это невозможно. твое мнение очень ценно для нас (с) ты еще раз прочитай первые два поста - там вполне сказано, что очень даже можно, вопрос лишь стоял в том - как именно принято делать это правильно и хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 10:38 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskynojavaда да, ты еще скажи, что между O0 и O3 на современных процах разницы нет. В вашем случае нет разницы. Когда функция является оберткой над скрытой имплементацией, то инлайнь ее или нет - пофиг. вообще-то не пофиг, потому что инлайнится builtin целочисленной арифметики, с проверкой переполнения. https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html#Integer-Overflow-Builtins и аналогичные интринзики из MVCC https://msdn.microsoft.com/en-us/library/windows/desktop/ff516460(v=vs.85).aspx плюс атомарные builtin , плюс чекалки доступа памяти, плюс... которые в каждой платформе свои особо кустистые, и делать их обычными функциями - это просад по перфомансу до 50% а так да - мнение, инлайнить или нет - очень ценное мнение, выскажешь его еще раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 10:43 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)nojavaпропущено... Вот тут да, ты прав, там мотивация - сделать из C/C++ среду прикладного, а не системного программирования. Стандартные библиотеки и остальное на прикладные задачи совсем не тянут - попросту неадекватны, потому и должны быть гарантированно выкинуты из доступных. Шутник, синтаксис у С++ тоже не совсем адекватен для прикладного проганья а нативный движок + скрипты для прикладников чем не устраивает? синтаксис у С++ вполне адекватен, я не говорил обратного. неадекватны стандартные библиотеки, они не заточены под программирование к примеру тех-же бухгалтерских или веб задач, дебет кредит, база данных-HTML рендеринг. если в Oracle есть свой BCD подобный тип NUMBER, то в C++ есть только IEEE float с потерей точности, за использование которого в финансовых задачах нужно просто брать руки и зажимать их нежно в дверь. в теории GCC поддерживает decimal float, но по факту - нет. и это мы только по типам данных для денег прошлись, дальше можно и по остальным неадекватностям прогуляться - от ORM, то веб-темплейтов, будет, мягко говоря, не весело, но мне уже немного лень ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 10:48 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojavaсобственно вопрос - у кого-то есть пример как надо правильно и кроссплатформенно делать сабж?Кроссплатформенно - никак. Это надо, чтобы компилятор генерировал не готовый машинный код, в который линкер только подставляет адреса внешних функций, а некое промежуточное представление. Что далеко не всегда имеет место быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 11:09 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojava, я крайне сомневаюсь, что у вас получится одновременно extern и inline. Более того, я уверен, что у вас так не получится, чтобы это ещё и реально работало, допустим, под gcc, clang и MS C++ compiler ... а ведь можно ещё про интел вспомнить и Сан Оракл ... Но если вдруг получится - поделИтесь секретом, ладно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 11:17 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojavaесли в Oracle есть свой BCD подобный тип NUMBER, то в C++ есть только IEEE float с потерей точности, за использование которого в финансовых задачах нужно просто брать руки и зажимать их нежно в дверь. std::ratio<1, 100> - чем он хуже, чем в Oracle есть свой BCD подобный тип NUMBER? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 11:38 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Вася Уткинnojavaесли в Oracle есть свой BCD подобный тип NUMBER, то в C++ есть только IEEE float с потерей точности, за использование которого в финансовых задачах нужно просто брать руки и зажимать их нежно в дверь. std::ratio<1, 100> - чем он хуже, чем в Oracle есть свой BCD подобный тип NUMBER? Они ничем не хуже и не лучше. Когда вы работаете в Oracle PLSQL с типом NUMBER то вы воспроизводите NULL-семантику реляционной алгебры. Тоесть при расчете avg(..) от трех строк в таблице {0,null,6} вы не должны заменять null на 0 а учитывать его как несуществующее значение в коллекции. Тоесть среднее должно быть равно 3 а не 2. Также у вас не должно быть попытки расширять тип NUMBER больше 40 десятичных разрядов на клиенте. Тоесть не должно быть в принципе такой возможности. При сериализации-десериализации не должно быть потерь или внезапных приобретений в значениях числа. Также надо посмотреть в сторону погрешностей расчетов. Нужно 100% эмулировать BCD-арифметику иначе расчеты клиента и сервера где-то не сойдутся. Кому-то последний пункт может показаться не очень важным но это еще один способ стрельнуть себе в ногу в неожиданном месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:04 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojavaвообще-то не пофиг, потому что инлайнится builtin целочисленной арифметики, с проверкой переполнения. https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html#Integer-Overflow-Builtins и аналогичные интринзики из MVCC https://msdn.microsoft.com/en-us/library/windows/desktop/ff516460(v=vs.85).aspx плюс атомарные builtin , плюс чекалки доступа памяти, плюс... которые в каждой платформе свои особо кустистые, и делать их обычными функциями - это просад по перфомансу до 50% Да вы просто неправильно язык выбрали, вам не С++ нужен, а то-то другое :) А вообще проверка переполнения дает просадку производительности, даже если она интегрирована в языке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:09 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
nojavaа так да - мнение, инлайнить или нет - очень ценное мнение, выскажешь его еще раз? Если надо инлайнить - пишите инлайн функции в хедерах и поставляйте их с библиотекой. Это ответ на ваш вопрос как грамотно делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:38 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskynojavaа так да - мнение, инлайнить или нет - очень ценное мнение, выскажешь его еще раз? Если надо инлайнить - пишите инлайн функции в хедерах и поставляйте их с библиотекой. Это ответ на ваш вопрос как грамотно делать. в этом совете нет ни грамма про грамотность, там лишь про типовой общепринятый (и неадекватный в данном случае) подход. я уже говорил - мне не нужны в основном проекте открытые спецификации из IntSafe.h и подобное. я не хочу видеть эти платформо специфичные функции доступными в Autocomplete, доступными для непосредственного связывания. каждый раз парсить эти .h при компиляции и делать подобную ненужную работу тоже не хочу (и вот не надо тут говорить еще и про pch, там отдельная смешная печаль в этих ваших фактически некросплатформенных C/C++). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:48 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
BagaBaganojava, я крайне сомневаюсь, что у вас получится одновременно extern и inline. Более того, я уверен, что у вас так не получится, чтобы это ещё и реально работало, допустим, под gcc, clang и MS C++ compiler ... а ведь можно ещё про интел вспомнить и Сан Оракл ... Но если вдруг получится - поделИтесь секретом, ладно? это уже получилось, в gcc, mvcc, clang, sunpro. никакого секрета нет - везде используется link time optimization, ключи естественно разные, но cmake им вполне можно обучить. форсирование инлайнинга везде делается по-разному, но чудные макросы INLINE решают и эту проблему. в debug режиме (O0) это все, естественно, не работает со временем будет опубликовано на github, пока не время :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 12:56 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
любителям ректального подхода надо понимать что инлайн потом оптимизация != компиляция потом инлайн маш.кода смысла мало ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 13:03 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
Barlonenojavaвообще-то не пофиг, потому что инлайнится builtin целочисленной арифметики, с проверкой переполнения. https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html#Integer-Overflow-Builtins и аналогичные интринзики из MVCC https://msdn.microsoft.com/en-us/library/windows/desktop/ff516460(v=vs.85).aspx плюс атомарные builtin , плюс чекалки доступа памяти, плюс... которые в каждой платформе свои особо кустистые, и делать их обычными функциями - это просад по перфомансу до 50% Да вы просто неправильно язык выбрали, вам не С++ нужен, а то-то другое :) А вообще проверка переполнения дает просадку производительности, даже если она интегрирована в языке. другие языки еще более неадекватны - там или сборщик мусора, или фактическое отсуствие кроссплатформенности, или производительность кода никудышняя. кроме того, С/C++ по факту наиболее развиты в части оптимизации кода и поддержка в IDE одна из лучших BarloneА вообще проверка переполнения дает просадку производительности, даже если она интегрирована в языке. между интеграцией в язык и доступностью в библиотечных функциях есть очень большая разница. этож основы контрактного программирования. если у тебя в for (int i = 0; i < n; i++) проверка на переполнение встроена уже в i < n, то ясное дело, ее нет никакой нужны делать еще и в i++. но такое дармовое контрактное условие выполняется/проверяется не всегда, потому у разработчика должен быть выбор. а конктерно в контексте выше - проверка на целочисленное переполнение нужна в случае как раз библиотеки для финансовой математики - если в случае double переполнение будет решено просто потерей значимых цифр (без всякого exception), то если делать fixed point number тип для подсчета денег, то переполнение значимых цифр может привести к катастрофе (опять-же, без exception) - а это надо отлавливать и проверять. говоря проще - никто не собирается включать проверку целочисленного переполнения глобально, это глупо, да и в случае фунций хеширования и чексумм - еще и недопустимо, там алгоритмы на переполнении как раз и построены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 13:05 |
|
||
|
inline extern из библиотеки, как правильно декларировать-имплементировать?
|
|||
|---|---|---|---|
|
#18+
maytonКому-то последний пункт может показаться не очень важным но это еще один способ стрельнуть себе в ногу в неожиданном месте. Неожиданное место начинается в безобидном числе 0.3, которое никак не может быть представлено через double/float даже специальный сайт есть с описанием этого... феномена http://0.30000000000000004.com/ кстати, даже в Delphi есть специальный тип Currency . Кстати, реализован именно как Fixed point number, хотя BСD там тоже есть http://docwiki.embarcadero.com/RADStudio/Seattle/en/BCD_Support_Routines Аналогичная ситуация в .NET Хотя умудренные опытом мейнфрейм деды говорят не про BCD, а про decimal floating point , который в .NET тоже есть https://msdn.microsoft.com/en-us/library/364x0z75.aspx и примерно подобный в Java http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html надо понимать, что BCD != DFP != Fixed point, это разные подходы к точному подсчету денег. А в Oracle NUMBER - это вообще base-100 тип. самый скоростной и переносимый - fixed point, ибо крутится на integer (int64/int128) а avg() это отдельная тема, и NULL во float/double вроде как принято представлять через NaN, нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2016, 13:41 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39280918&tid=2018218]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 297ms |
| total: | 555ms |

| 0 / 0 |
