Re[2]: Хозяйке на заметку: compile-time CRC32
От: SkyDance Земля  
Дата: 28.11.13 22:33
Оценка:
L>А хардкодить хэш в виде константы нынче уже совсем не спортивно?

Ага, и каждый раз как буковка в запросе меняется, так ре-хешировать каждый раз. Нет, спасибо

06.12.13 18:15: Ветка выделена из темы Хозяйке на заметку: compile-time CRC32
Автор: SkyDance
Дата: 20.11.13
— Кодт
06.12.13 18:16: Перенесено модератором из 'C/C++' — Кодт
Re[3]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 29.11.13 08:10
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>Ага, и каждый раз как буковка в запросе меняется, так ре-хешировать каждый раз. Нет, спасибо


В случае, если строк много и они часто меняются, я бы считал их в рантайме.
Re[4]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 29.11.13 10:19
Оценка:
Здравствуйте, Lazin, Вы писали:

L>В случае, если строк много и они часто меняются, я бы считал их в рантайме.

зачем?

а если используется mpl::map<> ?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 29.11.13 11:05
Оценка: -3 :)
Здравствуйте, niXman, Вы писали:

X>а если используется mpl::map<> ?


А вы не используйте mpl, fission и им подобный булшит и н придется считать crc32 компилятором. Мне лично жалко тратить время на подобное
Re[6]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 29.11.13 12:37
Оценка:
Здравствуйте, Lazin, Вы писали:

L>А вы не используйте mpl, fission и им подобный булшит и н придется считать crc32 компилятором. Мне лично жалко тратить время на подобное

мдя, Женя, два года тебя на форумах не видел, а ты ничуть не изменился, и все так же троллишь используемые технологии... а вроде бы должен был повзрослеть =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 29.11.13 12:38
Оценка:
минус — не мой, если чо
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 29.11.13 22:36
Оценка:
Здравствуйте, niXman, Вы писали:

X>мдя, Женя, два года тебя на форумах не видел, а ты ничуть не изменился, и все так же троллишь используемые технологии... а вроде бы должен был повзрослеть =)


Я и правда использую spirit и fusion в работе, точнее не столько использую, сколько поддерживаю код, написанный с их помощью. В проекте примерно 300K LOC и он при этом собирается минут эдак 40. Артефакты сборки получаются такие — 700Мб статических библиотек и пол гига исполняемых файлов Спасибо метопрограммированию на шаблонах за все хорошее
Причем я всерьез занимался оптимизацией сборки по размеру и по времени.

Использование обеих упомянутых библиотек в коде большого проекта сложно оправдать.
Re[8]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 29.11.13 22:52
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Я и правда использую spirit и fusion в работе, точнее не столько использую, сколько поддерживаю код, написанный с их помощью.

ты более на плюсах не пишешь? только C#?

тем не менее, есть задачи, где использование проприетарного софта недопустимо по причинам безопасности. а mono и openjdk — костыли.

L>В проекте примерно 300K LOC и он при этом собирается минут эдак 40. Артефакты сборки получаются такие — 700Мб статических библиотек и пол гига исполняемых файлов

звучит страшно. но пока не приходилось получать такие объемные бинари, хотя в текущем проекте ~130К loc, а результирующий бинарь ~23 Мб.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[9]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 30.11.13 08:52
Оценка:
Здравствуйте, niXman, Вы писали:

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


L>>Я и правда использую spirit и fusion в работе, точнее не столько использую, сколько поддерживаю код, написанный с их помощью.

X>ты более на плюсах не пишешь? только C#?
Как это следует из моего комментария? Я на С# уже больше года ничего не писал. Я пишу на плюсах, каждый день, на работе + pet project. В нем, кстати, я вообще boost не использую, тем не менее, проект кроссплатформенный

X>звучит страшно. но пока не приходилось получать такие объемные бинари, хотя в текущем проекте ~130К loc, а результирующий бинарь ~23 Мб.

У нас там очень много boost.sprit грамматик. Они все живут в отдельных cpp файлах и не торчат в хэдерах, но тем не менее. Но spirit грамматики по крайней мере легко изменять, а вот в код, который юзает fusion и mpl очень сложно вносить изменения.
Re[10]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 30.11.13 09:51
Оценка:
Здравствуйте, Lazin, Вы писали:

L>В нем, кстати, я вообще boost не использую, тем не менее, проект кроссплатформенный


так а в чем смысл велосипедить? почему не юзать уже готовый код, т.е. boost, etc... ?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[11]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 30.11.13 10:43
Оценка:
Здравствуйте, niXman, Вы писали:

X>так а в чем смысл велосипедить? почему не юзать уже готовый код, т.е. boost, etc... ?


А кто велосипедит? Я просто использую другие библиотеки, например apr, она сишная и умеет все что мне нужно
Re[12]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 30.11.13 11:27
Оценка:
Здравствуйте, Lazin, Вы писали:

L>А кто велосипедит? Я просто использую другие библиотеки, например apr, она сишная и умеет все что мне нужно

хардкор, однако...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[13]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 30.11.13 20:45
Оценка: +1 :)
Здравствуйте, niXman, Вы писали:

L>>А кто велосипедит? Я просто использую другие библиотеки, например apr, она сишная и умеет все что мне нужно

X>хардкор, однако...

Это как раз не хардкор, хардкор, это считать, непонятно зачем, хэши от строк в процессе компиляции.
Использовать сишные либы — одно удовольствие. Очень просто понимать как работает код. Исключений там ни одна функция не кидает, нет неявных вызовов конструкторов/деструкторов/операторов преобразования типа, временных объектов тоже нет. Это очень продуктивно.
Re[14]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 30.11.13 21:19
Оценка: :)
Здравствуйте, Lazin, Вы писали:

L>Это как раз не хардкор, хардкор, это считать, непонятно зачем, хэши от строк в процессе компиляции.

L>Использовать сишные либы — одно удовольствие. Очень просто понимать как работает код. Исключений там ни одна функция не кидает, нет неявных вызовов конструкторов/деструкторов/операторов преобразования типа, временных объектов тоже нет. Это очень продуктивно.

думается мне, таким образом ты выражаешь протест, против чего-то... (против С++? так почему на Си не пишешь?)
в общем, мне это кажется крайне странным, чем-то вроде регресса.

к тому же, даже не могу представить, что можно написать не используя шаблонов %)
ну да ладно..
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[15]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 30.11.13 23:13
Оценка: 1 (1) +3
Здравствуйте, niXman, Вы писали:

X>думается мне, таким образом ты выражаешь протест, против чего-то... (против С++? так почему на Си не пишешь?)

Какой еще протест? Я на форумах не сижу, код свой вам не показываю. На Си не пишу, так как пишу на С++, лол. Я использую классы, шаблоны, стандартную библиотеку С++ и все такое. Я не злоупотребляю возможностями языка, и не использую штуки, которые так делают. Более восьми лет использования С++ чему-то да научили.

X>в общем, мне это кажется крайне странным, чем-то вроде регресса.

Регресс, это когда у тебя есть задача — посчитать хэши для набора строк, известных во время компиляции, а ты, вместо того, чтобы написать простой, понятный и поддерживаемый код, пишешь compile time crc32, который а) нужно тестировать б) нужно поддерживать в) отличается от crc32 ф-ии, используемой в рантайме г) увеличивает время компиляции д) тянет за собой дополнительное метапрограммирование (список строк нужно хранить в чем-нибудь вроде boost::fusion::vector или хз где и обходить через какой-нибудь fusion.for_each, в общем, не то, что обычно используют в рантайме) е) нельзя дебажить. Вывод: данный подход не дает никаких преимуществ перед тупым вычислением хэшей при старте программы, одни недостатки, он контрпродуктивен и сеет в коде иррациональное зло

Ну если только автор хотел использовать эти хэши для ad-hoc генерации идентификаторов, но это тоже попахивает, ибо нет защиты от коллизий и их сложно будет детектить (дебажный код под ifdef не напишешь).
Re[16]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 30.11.13 23:45
Оценка:
Здравствуйте, Lazin, Вы писали:

абсурд какой-то %)
или со мной что-то не так...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[17]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 01.12.13 08:13
Оценка:
Здравствуйте, niXman, Вы писали:

X>абсурд какой-то %)

X>или со мной что-то не так...

Отличный способ вести дискуссию. И не поспоришь, и главное, все сказано по делу
Re[18]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 01.12.13 13:52
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Отличный способ вести дискуссию.

дело в том, что мне все еще не верится, что ты это всерьез. думаю, ты просто троллишь...

посмотрел я на apr, и не увидел там ничего, что могло бы меня заставить ее юзать...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[19]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 01.12.13 16:54
Оценка:
Здравствуйте, niXman, Вы писали:

X>дело в том, что мне все еще не верится, что ты это всерьез. думаю, ты просто троллишь...

нед
X>посмотрел я на apr, и не увидел там ничего, что могло бы меня заставить ее юзать...
никто тебя не заставляет
Re[17]: Хозяйке на заметку: compile-time CRC32
От: wander  
Дата: 01.12.13 22:10
Оценка: 1 (1)
Здравствуйте, niXman, Вы писали:

X>абсурд какой-то %)


Ничего подобного. Такая точка зрения обычно является результатом длительной работы в команде в конторе на фуллтайм. Где всякие программерские изыски неприемлемы и даже вредны, потому что:
а) Не все программисты обладают одинаковой квалификацией, чтобы потом читать такой код.
б) Если человек только начал работать, ему будет гораздо сложнее входить в колею.
в) Довольно часто требуется просто решить задачу, а не решить задачу самым крутым способом доступным на текущем языке. То есть времени нет писать изыски. То, что они занимают больше времени — факт, даже судя по твоим постам на форуме (да и мой собственный опыт говорит о том же).
г) Отчитываться за такой код труднее, если начальство само не балуется таким же.

Это соответствует рабочей обстановке у многих работодателей. Это не троллинг и не абсурд — реальность как она есть.
Re[16]: Хозяйке на заметку: compile-time CRC32
От: SkyDance Земля  
Дата: 01.12.13 22:40
Оценка:
L>Регресс, это когда у тебя есть задача — посчитать хэши для набора строк, известных во время компиляции, а ты, вместо того, чтобы написать простой, понятный и поддерживаемый код, пишешь compile time crc32, который а) нужно тестировать б) нужно поддерживать в) отличается от crc32 ф-ии, используемой в рантайме г) увеличивает время компиляции д) тянет за собой дополнительное метапрограммирование (список строк нужно хранить в чем-нибудь вроде boost::fusion::vector или хз где и обходить через какой-нибудь fusion.for_each, в общем, не то, что обычно используют в рантайме) е) нельзя дебажить. Вывод: данный подход не дает никаких преимуществ перед тупым вычислением хэшей при старте программы, одни недостатки, он контрпродуктивен и сеет в коде иррациональное зло

(а) протестировать достаточно единожды. Все-таки компиляторы тестируют неплохо.
(б) (в) поддерживать нужно любой код, но compile-time проверки поддерживать проще, чем crc32 в рантайме. Впрочем, в рантайме CRC32 вообще не нужно в данном проекте
(д) э нет, вот как раз CRC32 и был задействован для того, чтобы исключить дополнительное метапрограммирование.

Попробую объяснить подробно, что и зачем было сделано.
Для database connectivity на C++. Нужна простая и быстрая библиотечка, поддерживающая следующие особенности: postgres, async queries, threading (thread pool), db connection pool и prepared statements. Существующие библиотеки — "выберите чего-нибудь два", а с асинхронностью вообще плохо. Это не считая кошмарного синтаксиса и неудобного использования.
На C++ 11 как раз можно сделать удобно — спасибо variadic templates, можно писать примерно так:

vector<tuple<int, string>> results;
db_pool.query("SELECT id, name FROM accounts WHERE date>?", results, last_login_date);
for (auto account : results)
  cout << get<1>(account) << endl;


Для чего нужно CRC32? Для поддержки prepared statements, которые привязаны к соединениям. Поскольку соединений в пуле много, неизвестно, поступал ли уже этот запрос в это соединение или нет. Если поступал, то по CRC32 запроса можно его найти. Вероятность коллизии крайне мала, запросов же не сотни тысяч.

Можно делать иначе — в рантайме регистрировать каждый запрос, на стартапе получать уникальный ID, и пользовать его. Решение с CRC32 банально быстрее было написать, и меньше тестировать.
Re[18]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 02.12.13 09:55
Оценка:
Здравствуйте, wander, Вы писали:

W>Ничего подобного. Такая точка зрения обычно является результатом длительной работы в команде в конторе на фуллтайм.

а все мы тут кодим, из-за хобби? =)

W>а) Не все программисты обладают одинаковой квалификацией, чтобы потом читать такой код.

насколько я знаю, в команду не кидают тех кодеров, которые не обладают необходимыми навыками, для решения тех задач, которые решает команда.
а если же такое и случается — то такие кодеры не приживаются, и их переводят в другие команды.
никогда не наблюдал такого, чтоб команда себя ограничивала из-за одного новичка %)

W>б) Если человек только начал работать, ему будет гораздо сложнее входить в колею.

в команды, которые длительное время занимаются решением одной задачи — никогда не закинут нового человека, ибо он как пятая нога. обычно новых людей объединяют в новые команды, которые с нуля начинают решение задач.

W>в) Довольно часто требуется просто решить задачу, а не решить задачу самым крутым способом доступным на текущем языке.

т.е. в рантайме считать CRC — это быстрее в реализации, даже со всем вытекающим? как по мне — так наоборот.

W>То, что они занимают больше времени — факт

это ты субъективно.

W>даже судя по твоим постам на форуме

ну опять же — субъективно.

ну...я и мои посты — исключительный случай. я работаю исключительно удаленно, и исключительно в тех проектах, в которых я хочу участвовать. ну и занимаюсь я несколько необычными задачами, для некоторой предметной области, в которой сроки на реализацию — последнее, о чем "бос" может подумать.

W>г) Отчитываться за такой код труднее, если начальство само не балуется таким же.

начальству вообще наплевать на код. ему — чтоб продукт работал.

W>Это соответствует рабочей обстановке у многих работодателей. Это не троллинг и не абсурд — реальность как она есть.

страшная реальность. но, как говорится — сам себе враг.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[18]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 02.12.13 11:25
Оценка: 1 (1) +2
Здравствуйте, wander, Вы писали:

W>Ничего подобного. Такая точка зрения обычно является результатом длительной работы в команде в конторе на фуллтайм. Где всякие программерские изыски неприемлемы и даже вредны, потому что:

W>а) Не все программисты обладают одинаковой квалификацией, чтобы потом читать такой код.
W>б) Если человек только начал работать, ему будет гораздо сложнее входить в колею.
W>в) Довольно часто требуется просто решить задачу, а не решить задачу самым крутым способом доступным на текущем языке. То есть времени нет писать изыски. То, что они занимают больше времени — факт, даже судя по твоим постам на форуме (да и мой собственный опыт говорит о том же).
W>г) Отчитываться за такой код труднее, если начальство само не балуется таким же.

W>Это соответствует рабочей обстановке у многих работодателей. Это не троллинг и не абсурд — реальность как она есть.


На самом деле не совсем так. Просто однаждый я начал программировать не только на С++, но и на С#, а теперь еще и питоне. Эти языки намного проще, мне сначала не нравилось то, что язык, рантайм и библиотеки делают слишком многое за меня, а потом я понял как это удобно. Дело в том, что это снижает когнитивную нагрузку. Если программируя на С++, (допустим) 50% когнитивных усилий уходит на то, чтобы анализировать С++ код, а оставшиеся 50% (опять же, допустим) идут на все остальное — алгоритмы, струткуры данных и архитектуру, то когда я пишу на питоне, я могу сосредоточиться на том что делаю. Моешь чашку — думай о чашке.

Дело тут не в языках, а в сложности кода. На С++ можно тоже писать простой код. Такой код не обязательно должен делать простые вещи, скорее наоборот, только научившись писать простой код можно делать действительно солжные и интересные вещи. Когда умеешь это делать, особенно забавно наблюдать за всеми этими попытками написания "умного" кода, который использует кучу очень сложных концепций для организации чего-нибудь очень прстого, буфера там какого-нибудь в памяти, ну или interop-а с БД, как в данном случае

Причем все эти сложности, как правило, оправдываются какой-нибудь ерундой. Код выглядит красиво и просто, либо мы что-нибудь экономим, вычисляя это что-то во время компиляции. Чаще всего все эти оправдания сложности не выдерживают критики при более или менее пристальном рассмотрении. При таком рассмотрении очень часто оказывается, что ради сомнительных преимуществ просраны действительно важные инженерные аспекты, как то простота отладки и тестирования, либо эффективность процесса компиляции и скорость build-run цикла разработки.
Re[17]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 02.12.13 11:32
Оценка:
Здравствуйте, SkyDance, Вы писали:


SD>(а) протестировать достаточно единожды. Все-таки компиляторы тестируют неплохо.

То, что оно собирается, еще не значит, что оно правильно работает.

SD>Попробую объяснить подробно, что и зачем было сделано.

SD>Для database connectivity на C++. Нужна простая и быстрая библиотечка, поддерживающая следующие особенности: postgres, async queries, threading (thread pool), db connection pool и prepared statements. Существующие библиотеки — "выберите чего-нибудь два", а с асинхронностью вообще плохо. Это не считая кошмарного синтаксиса и неудобного использования.
SD>На C++ 11 как раз можно сделать удобно — спасибо variadic templates, можно писать примерно так:

SD>
SD>vector<tuple<int, string>> results;
SD>db_pool.query("SELECT id, name FROM accounts WHERE date>?", results, last_login_date);
SD>for (auto account : results)
SD>  cout << get<1>(account) << endl;
SD>

Я правильно понимаю, что предполагается всегда читать результаты запроса в память полностью?


SD>Для чего нужно CRC32? Для поддержки prepared statements, которые привязаны к соединениям. Поскольку соединений в пуле много, неизвестно, поступал ли уже этот запрос в это соединение или нет. Если поступал, то по CRC32 запроса можно его найти. Вероятность коллизии крайне мала, запросов же не сотни тысяч.


SD>Можно делать иначе — в рантайме регистрировать каждый запрос, на стартапе получать уникальный ID, и пользовать его. Решение с CRC32 банально быстрее было написать, и меньше тестировать.


Я правильно понимаю, что при выполнении запроса сначала по его crc32 ключу ищется prepared statement?
Re[19]: Хозяйке на заметку: compile-time CRC32
От: wander  
Дата: 02.12.13 14:38
Оценка:
Здравствуйте, niXman, Вы писали:

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


W>>Ничего подобного. Такая точка зрения обычно является результатом длительной работы в команде в конторе на фуллтайм.

X>а все мы тут кодим, из-за хобби? =)
Причем тут это? Просто в определенных условиях сложно поступать как хочется. Условия у всех разные.

W>>а) Не все программисты обладают одинаковой квалификацией, чтобы потом читать такой код.

X>насколько я знаю, в команду не кидают тех кодеров, которые не обладают необходимыми навыками, для решения тех задач, которые решает команда.
X>а если же такое и случается — то такие кодеры не приживаются, и их переводят в другие команды.
X>никогда не наблюдал такого, чтоб команда себя ограничивала из-за одного новичка %)
Команда не ограничивает, команда вырабатывает оптимальные условия.

W>>б) Если человек только начал работать, ему будет гораздо сложнее входить в колею.

X>в команды, которые длительное время занимаются решением одной задачи — никогда не закинут нового человека, ибо он как пятая нога. обычно новых людей объединяют в новые команды, которые с нуля начинают решение задач.
Ты не видел, а я видел.

W>>в) Довольно часто требуется просто решить задачу, а не решить задачу самым крутым способом доступным на текущем языке.

X>т.е. в рантайме считать CRC — это быстрее в реализации, даже со всем вытекающим? как по мне — так наоборот.
Про CRC ты спорь с теми, кто по этому поводу возражал. Я про другое говорил.

W>>То, что они занимают больше времени — факт

X>это ты субъективно.
W>>даже судя по твоим постам на форуме
X>ну опять же — субъективно.
X>ну...я и мои посты — исключительный случай. я работаю исключительно удаленно, и исключительно в тех проектах, в которых я хочу участвовать. ну и занимаюсь я несколько необычными задачами, для некоторой предметной области, в которой сроки на реализацию — последнее, о чем "бос" может подумать.
Это как раз очень нетипичный случай И ты свой нетипичный случай распространяешь на всех. Я же объяснить пытался чем обоснован тот "абсурд", который писался выше

W>>г) Отчитываться за такой код труднее, если начальство само не балуется таким же.

X>начальству вообще наплевать на код. ему — чтоб продукт работал.
Начальство бывает разных уровней. Непосредственному начальству (это может быть тимлид, или начальник отдела) на код не должно быть наплевать.

W>>Это соответствует рабочей обстановке у многих работодателей. Это не троллинг и не абсурд — реальность как она есть.

X>страшная реальность. но, как говорится — сам себе враг.
Это не тот случай, чтобы устраивать священные войны. Я понимаю что тебе такой подход симпатичен (мне тоже), но нужно иметь силы понять, что он не единственно правильный. И в других условиях другие подходы имеют резон.
Re[19]: Хозяйке на заметку: compile-time CRC32
От: wander  
Дата: 02.12.13 14:50
Оценка:
Здравствуйте, Lazin, Вы писали:

L>На самом деле не совсем так.

Ну, случаи разные. Но то, что я перечислил довольно часто является причиной отказа от определенных фич языка. Взять тот же google code style (как один из самых известных).

L>Просто однаждый я начал программировать не только на С++, но и на С#, а теперь еще и питоне. Эти языки намного проще, мне сначала не нравилось то, что язык, рантайм и библиотеки делают слишком многое за меня, а потом я понял как это удобно. Дело в том, что это снижает когнитивную нагрузку. Если программируя на С++, (допустим) 50% когнитивных усилий уходит на то, чтобы анализировать С++ код, а оставшиеся 50% (опять же, допустим) идут на все остальное — алгоритмы, струткуры данных и архитектуру, то когда я пишу на питоне, я могу сосредоточиться на том что делаю. Моешь чашку — думай о чашке.

L>Дело тут не в языках, а в сложности кода. На С++ можно тоже писать простой код. Такой код не обязательно должен делать простые вещи, скорее наоборот, только научившись писать простой код можно делать действительно солжные и интересные вещи. Когда умеешь это делать, особенно забавно наблюдать за всеми этими попытками написания "умного" кода, который использует кучу очень сложных концепций для организации чего-нибудь очень прстого, буфера там какого-нибудь в памяти, ну или interop-а с БД, как в данном случае

А мне кажется именно в языках. Просто все эти изыски родились из-за определенных ограничений того или иного языка. В попытке эти ограничения компенсировать появились и изыски. Если язык сразу позволяет думать о чашке, то и изыски не нужны.

L>Причем все эти сложности, как правило, оправдываются какой-нибудь ерундой. Код выглядит красиво и просто, либо мы что-нибудь экономим, вычисляя это что-то во время компиляции. Чаще всего все эти оправдания сложности не выдерживают критики при более или менее пристальном рассмотрении. При таком рассмотрении очень часто оказывается, что ради сомнительных преимуществ просраны действительно важные инженерные аспекты, как то простота отладки и тестирования, либо эффективность процесса компиляции и скорость build-run цикла разработки.


Согласен в целом. Профессионализм — в чувстве баланса. Не соглашусь, что это всегда плохо, но тем не менее. Опять же, метапрограммирование — не всегда заумная зубодробительная синтаксическая каша — иногда и оно дает простой и понятной код, который не стыдно отдать на ревью и легко сопровождать. Повторюсь, профессионализм в чувстве баланса.
Re[15]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 03.12.13 16:32
Оценка:
Здравствуйте, niXman, Вы писали:

X>к тому же, даже не могу представить, что можно написать не используя шаблонов %)

Ну ядро линукса, например
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[17]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 03.12.13 16:38
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>Можно делать иначе — в рантайме регистрировать каждый запрос, на стартапе получать уникальный ID, и пользовать его. Решение с CRC32 банально быстрее было написать, и меньше тестировать.


а хапросов много?

Я так понял, что речь идёт о кэше запросов же, да?
Путь номер 1)
Ну тупо std::map<std::sting, то_что_ты_хочешь_кэшировать> и программировать ничего не надо, всё уже есть, и кэш будет и риска коллизий совсем нет.

Путь номер 2)
Реализуешь бор (префиксное дерево), для хранения отображения из текста в кэшируемое значение и используешь его. Тут вообще оверхед близкий к нулевому будет

Путь номер 3)
Как-то коллекционируешь строчки, которым ты в CT хочешь читать хэши, и подбираешь натравливаешь на эту коллекуию утилиту, которая порождает функцию, которая отображает строку в уникальное число. Дальше эзаешь число и эту функцию.

Зачем наворачивать CT-вычисления тут я
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[18]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 03.12.13 19:36
Оценка:
Здравствуйте, Erop, Вы писали:

E>а хапросов много?


E>Я так понял, что речь идёт о кэше запросов же, да?

E>Путь номер 1)
E>Ну тупо std::map<std::sting, то_что_ты_хочешь_кэшировать> и программировать ничего не надо, всё уже есть, и кэш будет и риска коллизий совсем нет.

E>Путь номер 2)

E>Реализуешь бор (префиксное дерево), для хранения отображения из текста в кэшируемое значение и используешь его. Тут вообще оверхед близкий к нулевому будет

E>Путь номер 3)

E>Как-то коллекционируешь строчки, которым ты в CT хочешь читать хэши, и подбираешь натравливаешь на эту коллекуию утилиту, которая порождает функцию, которая отображает строку в уникальное число. Дальше эзаешь число и эту функцию.

E>Зачем наворачивать CT-вычисления тут я


Можно просто считать хэши в рантайме, при вызове query, можно даже только от части строки (murmurhash2 это всего навсего чуть больше 50-ти инструкций)

А вообще, самый простой и, на мой взгляд, самый правильный вариант — переложить это все на приложение. Приложение само должно вызвать prepare, сохранить statement id и использовать его потом. Библиотеке знание о том, есть ли statement id для того или иного запроса или нет — ни к чему.
Re[18]: Хозяйке на заметку: compile-time CRC32
От: Evgeny.Panasyuk Россия  
Дата: 03.12.13 20:15
Оценка:
Здравствуйте, Erop, Вы писали:

E>Путь номер 2)

E>Реализуешь бор (префиксное дерево), для хранения отображения из текста в кэшируемое значение и используешь его. Тут вообще оверхед близкий к нулевому будет

По сравнению с чем? В префиксном дереве при lookup'е нужно по узлампамяти попрыгать.
Re[19]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 03.12.13 20:49
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>По сравнению с чем? В префиксном дереве при lookup'е нужно по узлампамяти попрыгать.

А при получении данных по хэшу не нужно, что ли? Вопрос в затратах же..
Что-то мне подсказывает, что если так уж критична именно в этом месте скорострельность, то лучше всего последовательные id выдавать при регистрации запросов, или вообще не id, а хэндлы.
А если таки не важна настолько, то можно и по самой строчке вхождение в кэше искать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[16]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.12.13 22:05
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну ядро линукса, например

речь шла о С++, и о сомнительной резонности сомнительной Си-шной библиотеки в плюсовом коде.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[20]: Хозяйке на заметку: compile-time CRC32
От: Evgeny.Panasyuk Россия  
Дата: 03.12.13 22:41
Оценка: :)
Здравствуйте, Erop, Вы писали:

EP>>По сравнению с чем? В префиксном дереве при lookup'е нужно по узлампамяти попрыгать.

E>А при получении данных по хэшу не нужно, что ли? Вопрос в затратах же..

Для hashtable нужно сделать 1~2 запроса в память (если без коллизий), а для trie таких запросов в среднем будет больше. Я бы использовал trie для такого поиска только если бы была важна приемлемая worst case complexity (например o(n)) или упорядоченность, и std::map (которая есть из коробки) не подходила бы.

E>Что-то мне подсказывает, что если так уж критична именно в этом месте скорострельность, то лучше всего последовательные id выдавать при регистрации запросов, или вообще не id, а хэндлы.


Если важна скорострельность, то можно и что-то типа:
auto stmt = at_key<int_< perfect_hash("....") >>(statements);
// or
auto stmt = statements_array[compile_time_perfect_hash("....")];
// or
auto stmt = SQL_STATEMENT("....");
метапрограммирование, макросы, препроцессинг с генерацией добавить по вкусу.
Re[17]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 08:28
Оценка:
Здравствуйте, niXman, Вы писали:

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


E>>Ну ядро линукса, например

X>речь шла о С++, и о сомнительной резонности сомнительной Си-шной библиотеки в плюсовом коде.

Ох, лол :-D
APR — сомнительная библиотека, с сомнительной резонностью

APR умеет vectorised I/O, boost нет, apr может в базы данных(и даже умеет prepare), boost нет. По поводу сишечки — я вот например иногда использую т.н. structure hack, для производительности, в c++ коде. Может ты сумеешь предложить типобезопасный аналог на шаблона, раз уж ты такой их фанат?
Re[18]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 08:39
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Ох, лол :-D

дешево вбрасываешь...
да и зачем столько смайликов?

L>APR умеет vectorised I/O

т.е. умеет прикидываться UIO? да, это гениально!

L>boost нет

а должен?

L>apr может в базы данных(и даже умеет prepare), boost нет.

а должен?

глядя на твои примеры, складывается ощущение, что только Си-шные библиотеки(или только ARP?) умеют описанное.

L>По поводу сишечки — я вот например иногда использую т.н. structure hack, для производительности, в c++ коде. Может ты сумеешь предложить типобезопасный аналог на шаблона, раз уж ты такой их фанат?

знать бы еще о чем речь..
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[19]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 09:03
Оценка:
Здравствуйте, niXman, Вы писали:

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


L>>Ох, лол :-D

X>дешево вбрасываешь...
X>да и зачем столько смайликов?
Я отталкиваясь от уровня аргументации оппонента

L>>APR умеет vectorised I/O

X>т.е. умеет прикидываться UIO? да, это гениально!
Мне надо было кроссплатформенно читать и писать в файлы подобным образом. Буст не может

L>>boost нет

X>а должен?
Поддерживать довольно базоаую возможность, нет конечно

L>>apr может в базы данных(и даже умеет prepare), boost нет.

X>а должен?
Кто этими базами данных пользуется…?

X>глядя на твои примеры, складывается ощущение, что только Си-шные библиотеки(или только ARP?) умеют описанное.

Чего это вдруг? Я такого не утверждал, просто привел apr в качестве примера. Мне она правда больше подходит чем буст.

L>>По поводу сишечки — я вот например иногда использую т.н. structure hack, для производительности, в c++ коде. Может ты сумеешь предложить типобезопасный аналог на шаблона, раз уж ты такой их фанат?

X>знать бы еще о чем речь..

Google — struct hack
Re[20]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 09:27
Оценка: -1
Здравствуйте, Lazin, Вы писали:

L>Я отталкиваясь от уровня аргументации оппонента

правильно будет так: "Я субъективного+предвзято+заинтересованно отталкиваясь от уровня аргументации оппонента "
(даже смайлик твой вклеил, для подтверждения серьезности твоей аргументации)

L>Мне надо было кроссплатформенно читать и писать в файлы подобным образом. Буст не может

а еще он не умеет окошечки.

L>Поддерживать довольно базоаую возможность, нет конечно

если мыслить твоими критериями — окошечки это тоже весьма базово, даже базовей базового.

L>Кто этими базами данных пользуется…?

...
L>Чего это вдруг? Я такого не утверждал, просто привел apr в качестве примера. Мне она правда больше подходит чем буст.
...
L>Google — struct hack

— выдаешь желаемое за действительно. жги ишо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[21]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 10:10
Оценка:
Здравствуйте, niXman, Вы писали:


L>>Поддерживать довольно базоаую возможность, нет конечно

X>если мыслить твоими критериями — окошечки это тоже весьма базово, даже базовей базового.

Да хрен с ними, с окошечками. Логирование в буст добавили уже?

Есть такое понятие, как cross-platform support middleware. Boost, это как раз оно и есть. Но кроме буста есть APR, GLib, commonc++, POCO.
Просто когда я написал, что не использую буст, ты сначала обвинил меня в велосипедостроительстве, а apr назвал сомнительной библиотекой. (Лол)

L>>Кто этими базами данных пользуется…?

X>...
L>>Чего это вдруг? Я такого не утверждал, просто привел apr в качестве примера. Мне она правда больше подходит чем буст.
X>...
L>>Google — struct hack

X> — выдаешь желаемое за действительно. жги ишо!


Что из процитированого я выдаю за действительное по твоему?
Re[22]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 10:47
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Да хрен с ними, с окошечками. Логирование в буст добавили уже?


google -> 'boost logging'

L>Есть такое понятие, как cross-platform support middleware. Boost, это как раз оно и есть. Но кроме буста есть APR, GLib, commonc++, POCO.

хорошо, что есть.
ты считаешь, что все это нужно объединить в одну кучу?
(а POCO уже умеет IOCP/epoll/qkueue, или все еще select и poll ?)
(и да, POCO я однажды рассматривал для применения, но качество кода мне не понравилось.)

L>Просто когда я написал, что не использую буст, ты сначала обвинил меня в велосипедостроительстве, а apr назвал сомнительной библиотекой. (Лол)

обвинений не было.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[18]: Хозяйке на заметку: compile-time CRC32
От: B0FEE664  
Дата: 04.12.13 11:04
Оценка:
Здравствуйте, Lazin, Вы писали:

L> По поводу сишечки — я вот например иногда использую т.н. structure hack, для производительности, в c++ коде. Может ты сумеешь предложить типобезопасный аналог на шаблона, раз уж ты такой их фанат?


Дурное дело не хитрое, тем более hack с UB.
И каждый день — без права на ошибку...
Re[19]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 11:47
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Дурное дело не хитрое, тем более hack с UB.

Ну а если мне нужно? И где же здесь UB?
Re[20]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 12:37
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Google — struct hack

по рукам бы надавал за такое.

можно увидеть хоть какое-то обоснование этому рукоблудству? из реальной задачи, пожалуйста.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[18]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 12:40
Оценка:
Здравствуйте, Lazin, Вы писали:

L>я вот например иногда использую т.н. structure hack

APR предоставляет какое-то удобство для этого?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[20]: Хозяйке на заметку: compile-time CRC32
От: B0FEE664  
Дата: 04.12.13 12:45
Оценка:
Здравствуйте, Lazin, Вы писали:

BFE>>Дурное дело не хитрое, тем более hack с UB.

L>Ну а если мне нужно?
Что конкретно? Задача какая?

L>И где же здесь UB?


C draft n1124

J.2 Undefined behavior

— Addition or subtraction of a pointer into, or just beyond, an array object and an
integer type produces a result that does not point into, or just beyond, the same array
object.
— Addition or subtraction of a pointer into, or just beyond, an array object and an
integer type produces a result that points just beyond the array object and is used as
the operand of a unary * operator that is evaluated

и

— An array subscript is out of range, even if an object is apparently accessible with the
given subscript (as in the lvalue expression a[1][7] given the declaration int
a[4][5])


И каждый день — без права на ошибку...
Re[21]: Хозяйке на заметку: compile-time CRC32
От: watchmaker  
Дата: 04.12.13 13:02
Оценка: 3 (1)
Здравствуйте, B0FEE664, Вы писали:


BFE>>>Дурное дело не хитрое, тем более hack с UB.


L>>И где же здесь UB?


BFE>C draft n1124

BFE> :xz:

Не то цитируешь. В этом же документе n1124 написано как реализовать struct hack без UB. Пример приведён после пункта с описанием flexible array member.
Вот в С++ нет исключения для flexible array member, там реализовать без формального UB не получится, а в С — всё по стандарту.
Re[22]: Хозяйке на заметку: compile-time CRC32
От: B0FEE664  
Дата: 04.12.13 13:38
Оценка:
Здравствуйте, watchmaker, Вы писали:

BFE>>>>Дурное дело не хитрое, тем более hack с UB.

L>>>И где же здесь UB?
BFE>>C draft n1124
BFE>>
W>Не то цитируешь. В этом же документе n1124 написано как реализовать struct hack без UB. Пример приведён после пункта с описанием flexible array member.

Забавно. Значит узаконили это безобразие.

W>Вот в С++ нет исключения для flexible array member, там реализовать без формального UB не получится, а в С — всё по стандарту.

placement new не поможет?
И каждый день — без права на ошибку...
Re[23]: Хозяйке на заметку: compile-time CRC32
От: watchmaker  
Дата: 04.12.13 14:25
Оценка:
Здравствуйте, B0FEE664, Вы писали:



W>>Вот в С++ нет исключения для flexible array member, там реализовать без формального UB не получится, а в С — всё по стандарту.

BFE>placement new не поможет?

Сохранить точно такой же синтаксис при использовании, как я понимаю, не получится. Но идейно схожую реализацию на C++ написать, конечно, можно.
Просто придётся, например, заменить
instance.array[i]
на
instance.array()[i]
или что-то подобное, скрыв внутри метода операции с указателями. Ну и размечая через placement new память в отдельности для структуры-без-массива и, собственно, элементов самого массива.
Re[23]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 19:00
Оценка: :)
Здравствуйте, niXman, Вы писали:

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


L>>Да хрен с ними, с окошечками. Логирование в буст добавили уже?


X>google -> 'boost logging'


Ну надо же, добавили, в 1.54. Ждем http сервер в 1.65 и драйвер БД в 1.87.
Re[21]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 19:03
Оценка:
Здравствуйте, niXman, Вы писали:

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


L>>Google — struct hack

X>по рукам бы надавал за такое.

X>можно увидеть хоть какое-то обоснование этому рукоблудству? из реальной задачи, пожалуйста.


В последний раз мне это понадобилось когда у меня было хранилище данных с страничной организацией и страницы содержали массив индексов переменной длины. Что-то вроде этого:

struct Page {
...
Metadata
...
int32_t num_items;
int32_t offsets[];
};
Re[24]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 19:09
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Сохранить точно такой же синтаксис при использовании, как я понимаю, не получится. Но идейно схожую реализацию на C++ написать, конечно, можно.

W>Просто придётся, например, заменить
instance.array[i]
на
instance.array()[i]
или что-то подобное, скрыв внутри метода операции с указателями. Ну и размечая через placement new память в отдельности для структуры-без-массива и, собственно, элементов самого массива.


Дело в том, что этот прием поддерживается всеми основными с++ компиляторами. Куча кода зависит от этого. Так что это формальный UB, как правильно сказали выше

Сделать более читабельно без UB — нельзя. Сделать по другому в принципе можно, но это сложно. Метод array должен еще выравнивание учитывать, нормально реализовать это до C++11 было нельзя, только через костыли. В С++11 это реализуется относительно нормально, с помощью alignof, но конечно более многословно.
Re[19]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 04.12.13 19:11
Оценка:
Здравствуйте, niXman, Вы писали:

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


L>>я вот например иногда использую т.н. structure hack

X>APR предоставляет какое-то удобство для этого?

А при чем тут APR? Я привел в пример struct hack просто для того, чтобы показать, что некоторые вещи проще сделать в стиле Си
Re[24]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 23:18
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Ну надо же, добавили, в 1.54.

а толку-то?
казалось бы, банальная задача — что-то залогировать. но то что реализовали — инопланетные технологии.
нет, я не боюсь нового, и не ленюсь читать доку. но boost.log — хороший пример того, как из простого можно сделать нечто нереально сложное.
до его исходников я все еще не добрался. надеюсь, хоть качество кода нормальное..

L>Ждем http сервер в 1.65

еще в 1.35 добавили. не навороченные, правда — но очень даже рабочие.
http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/examples.html

L>драйвер БД в 1.87.

это, вроде как, лишнее. иначе после этого можно будет ожидать GUI библиотечку...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[22]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 04.12.13 23:21
Оценка:
Здравствуйте, Lazin, Вы писали:

L>В последний раз мне это понадобилось когда у меня было хранилище данных с страничной организацией и страницы содержали массив индексов переменной длины. Что-то вроде этого:


L>
L>struct Page {
L>...
L>Metadata
L>...
L>int32_t num_items;
L>int32_t offsets[];
L>};
L>

не уверен что правильно понял, но разве offsets не может быть каким-нить контейнером?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[25]: Хозяйке на заметку: compile-time CRC32
От: SkyDance Земля  
Дата: 05.12.13 03:29
Оценка:
X>нет, я не боюсь нового, и не ленюсь читать доку. но boost.log — хороший пример того, как из простого можно сделать нечто нереально сложное.

Да я бы не сказал, что там сложно.
Просто... непривычно. По крайней мере, ни у кого из команды не зачесались руки перейти с чрезвычайно комфортного (пусть и слегка тормозного) log4cpp.
Re[24]: Хозяйке на заметку: compile-time CRC32
От: night beast СССР  
Дата: 05.12.13 05:34
Оценка:
Здравствуйте, Lazin, Вы писали:

L>>>Да хрен с ними, с окошечками. Логирование в буст добавили уже?


X>>google -> 'boost logging'


L>Ну надо же, добавили, в 1.54.


лучше бы не добавляли
Re[23]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 05.12.13 07:08
Оценка: +1
Здравствуйте, niXman, Вы писали:


X>не уверен что правильно понял, но разве offsets не может быть каким-нить контейнером?


+1 лишняя аллокация и косвенность на страницу...
Ну и +1, или больше указатель соответственно ещё.

В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[24]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.12.13 07:23
Оценка:
Здравствуйте, Erop, Вы писали:

E>+1 лишняя аллокация и косвенность на страницу...

E>Ну и +1, или больше указатель соответственно ещё.
ну это-то понятно.

E>В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед...

если учесть, что "это" используется для хранилища данных — предположу что для харда — то основной тормоз тут не аллокации и не указатели — а тот самый хард. тогда какой смысл в таких оптимизациях?

к тому же, думается мне, сам offsets может быть указателем, указывающим либо на участок какой-то глобальной таблицы offset`ов, либо указателем на конкретный буфер offset`ов, выдаваемый пулом буферов.

в общем — не вижу смысла в таком хаке.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[25]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.12.13 07:28
Оценка:
Здравствуйте, niXman, Вы писали:

X>... предположу что для харда ...

в смысле, данные либо считываются с харда, либо записываются на него. либо — и то и другое.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[25]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 05.12.13 07:44
Оценка:
Здравствуйте, niXman, Вы писали:

E>>В общем и по скорости и по памяти и по рабочему множеству и по локальности доступа оверхед...

X>если учесть, что "это" используется для хранилища данных — предположу что для харда — то основной тормоз тут не аллокации и не указатели — а тот самый хард. тогда какой смысл в таких оптимизациях?

Такой, что для харда возможность отмапировать тупо файл на память и юзать как хранилище -- ценна, как нигде.
Ну и потом чем компактнее и локальнее лежат данные, тем быстрее будет же...

X>в общем — не вижу смысла в таком хаке.

Зря.

Кроме того, его же можно безопасно завернуть в С++ шаблон...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[26]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.12.13 07:53
Оценка:
Здравствуйте, Erop, Вы писали:

E>Такой, что для харда возможность отмапировать тупо файл на память и юзать как хранилище -- ценна, как нигде.

нее..наверное со мной действительно что-то не так...

а почему не просто сериализовать эту структуру с контейнером, и потом получившееся дописывать в представление?

E>Кроме того, его же можно безопасно завернуть в С++ шаблон...

Lazin это просил.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[27]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 05.12.13 08:08
Оценка:
Здравствуйте, niXman, Вы писали:

X>а почему не просто сериализовать эту структуру с контейнером, и потом получившееся дописывать в представление?


Медленнее, если при сериализации не жать...

X>Lazin это просил.

Ну и в чём проблема?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[28]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.12.13 10:16
Оценка:
Здравствуйте, Erop, Вы писали:

E>Медленнее, если при сериализации не жать...

в смысле, сжимать? что сжимать? результат сериализации?

E>Ну и в чём проблема?

не знаю, не задумывался, ибо так и не понял, почему не сделать по-человечески...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[29]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 05.12.13 16:08
Оценка:
Здравствуйте, niXman, Вы писали:

E>>Медленнее, если при сериализации не жать...

X>в смысле, сжимать? что сжимать? результат сериализации?
Результат или сами данные. Короче уменьшить обмен с диском что бы.

E>>Ну и в чём проблема?

X>не знаю, не задумывался, ибо так и не понял, почему не сделать по-человечески...
А как это "по-человечески"?

Если туда какой-нибудь std::vector вклячить, то будет сильно менее эффективно жеж, чем мэпинг файла данных непосредственно на юзабельные данные...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[30]: Хозяйке на заметку: compile-time CRC32
От: Vzhyk  
Дата: 05.12.13 17:13
Оценка: -1
12/5/2013 7:08 PM, Erop пишет:

> Если туда какой-нибудь std::vector вклячить, то будет сильно менее

> эффективно жеж, чем мэпинг файла данных непосредственно на юзабельные
> данные...
Не будет, если не отстреливать себе разные органы.
Posted via RSDN NNTP Server 2.1 beta
Re[25]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 05.12.13 22:07
Оценка:
Здравствуйте, niXman, Вы писали:

L>>Ждем http сервер в 1.65

X>еще в 1.35 добавили. не навороченные, правда — но очень даже рабочие.
X>http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/examples.html
Это пример. Он реализует поддержку очень ограниченного подмножества протокола. К тому же, хотелось бы не только сервер иметь, но и клиент. (да и вообще, как можно не иметь в век интернета поддержку http в стандартной библиотеке?)

L>>драйвер БД в 1.87.

X>это, вроде как, лишнее. иначе после этого можно будет ожидать GUI библиотечку...
Что в этом плохого?
Re[23]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 05.12.13 22:09
Оценка:
Здравствуйте, niXman, Вы писали:

X>не уверен что правильно понял, но разве offsets не может быть каким-нить контейнером?

А каким контейнером, std::vector?
Эта память мапится в файл, все что в ней оказывается — записывается в файл. Поэтому нужно контролировать layout каждого отдельного байта.
Re[31]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 05.12.13 22:11
Оценка:
Здравствуйте, Vzhyk, Вы писали:

V>Не будет, если не отстреливать себе разные органы.


а разработчики boost interprocess такие дураки, не знали этого и реализовали свои контейнеры, вот ведь незадача
Re[26]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 05.12.13 22:12
Оценка:
Здравствуйте, niXman, Вы писали:

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


X>>... предположу что для харда ...

X>в смысле, данные либо считываются с харда, либо записываются на него. либо — и то и другое.
почитай про memory mapped I/O
Re[29]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 05.12.13 22:14
Оценка:
Здравствуйте, niXman, Вы писали:

E>>Ну и в чём проблема?

X>не знаю, не задумывался, ибо так и не понял, почему не сделать по-человечески...
По "человечески" это как? Мне для memory mapped I/O или shared memory, неважно. Как будет "по человечески"?
Re[27]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 05.12.13 22:19
Оценка:
Здравствуйте, niXman, Вы писали:

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


E>>Такой, что для харда возможность отмапировать тупо файл на память и юзать как хранилище -- ценна, как нигде.

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

X>а почему не просто сериализовать эту структуру с контейнером, и потом получившееся дописывать в представление?

Сериализация это жутко медленно, к тому же, я хочу изменять массив offsets при необходимости. Если сериализовать, то нужно будет сначала десериализовать, потом изменить, потом опять сериализовать, просто жуть

E>>Кроме того, его же можно безопасно завернуть в С++ шаблон...

X>Lazin это просил.
Это должно было послужить иллюстрацией того, что метапрограммирование на шаблонах в современном с++ иногда все же просасывает примитивному коду на Си
Re[27]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 05.12.13 22:21
Оценка:
Здравствуйте, Lazin, Вы писали:

X>>>... предположу что для харда ...

X>>в смысле, данные либо считываются с харда, либо записываются на него. либо — и то и другое.
L>почитай про memory mapped I/O

Для полоного понимания того, что есть memory mapped I/O и почему это так хорошо, следует разобраться сначала с paging-ом в современных ОС и с тем как работает маппинг виртуальных адресов на физические, TLB, page-файл, вот это вот все.
Re[28]: Хозяйке на заметку: compile-time CRC32
От: B0FEE664  
Дата: 06.12.13 10:18
Оценка:
Здравствуйте, Lazin, Вы писали:

E>>>Кроме того, его же можно безопасно завернуть в С++ шаблон...

X>>Lazin это просил.
L>Это должно было послужить иллюстрацией того, что метапрограммирование на шаблонах в современном с++ иногда все же просасывает примитивному коду на Си

Ой, да ладно! Всё можно написать и на С++ и работать будет ничуть не хуже. Полный пример долго писать, а для затравки могу подкинуть вот такой код, написанный за 10 минут. Тут, конечно, есть проблемы с обработкой ошибок и преобразованием указателей, но всё это можно развить и углубить без потери производительности:

class FlexibleArrayMember
{
  public:
    FlexibleArrayMember(size_t sz, double*& data)
      :  m_sz(sz),
         m_rData(data)
    {}
  public:
    double& operator[] (size_t nIndex)
    {
       assert(0 <= nIndex && nIndex < m_sz);
       return m_rData[nIndex];
    }
  private:  
    size_t   m_sz;
    double*& m_rData;
};

int main(int argc, char * argv[])
{
  char buffer[sizeof(FlexibleArrayMember) + 100*sizeof(double)];
  double* p = (double*)(buffer + sizeof(FlexibleArrayMember)); //aligment problem
  FlexibleArrayMember oData = *(new(buffer) FlexibleArrayMember(100, p));

  for(int i = 0; i < 100; i++)
    oData[i] = i * 0.2;
    
  std::cout << oData[0] << ", ";
  for(int i = 1; i < 100; i++)
    std::cout << ", " << oData[i];
    
  oData.~FlexibleArrayMember();
  std::cout << std::endl;
  
  std::cout << "the end" << std::endl;
  return 0;
}
И каждый день — без права на ошибку...
Re[28]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.12.13 10:59
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Именно, тебе не хватает опыта для того, чтобы просто понять о чем мы тут толкуем

ну да, ну да — о великий.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[28]: Хозяйке на заметку: compile-time CRC32
От: niXman Ниоткуда https://github.com/niXman
Дата: 06.12.13 11:00
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Для полоного понимания того, что есть memory mapped I/O и почему это так хорошо, следует разобраться сначала с paging-ом в современных ОС и с тем как работает маппинг виртуальных адресов на физические, TLB, page-файл, вот это вот все.

фантик вовсе не обязан описывать то, что в нем содержится.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[29]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 06.12.13 11:11
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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


E>>>>Кроме того, его же можно безопасно завернуть в С++ шаблон...

X>>>Lazin это просил.
L>>Это должно было послужить иллюстрацией того, что метапрограммирование на шаблонах в современном с++ иногда все же просасывает примитивному коду на Си

BFE>Ой, да ладно! Всё можно написать и на С++ и работать будет ничуть не хуже. Полный пример долго писать, а для затравки могу подкинуть вот такой код, написанный за 10 минут. Тут, конечно, есть проблемы с обработкой ошибок и преобразованием указателей, но всё это можно развить и углубить без потери производительности:


BFE>
BFE>class FlexibleArrayMember
BFE>{
BFE>  public:
BFE>    FlexibleArrayMember(size_t sz, double*& data)
BFE>      :  m_sz(sz),
BFE>         m_rData(data)
BFE>    {}
BFE>  public:
BFE>    double& operator[] (size_t nIndex)
BFE>    {
BFE>       assert(0 <= nIndex && nIndex < m_sz);
BFE>       return m_rData[nIndex];
BFE>    }
BFE>  private:  
BFE>    size_t   m_sz;
BFE>    double*& m_rData;
BFE>};

BFE>int main(int argc, char * argv[])
BFE>{
BFE>  char buffer[sizeof(FlexibleArrayMember) + 100*sizeof(double)];
BFE>  double* p = (double*)(buffer + sizeof(FlexibleArrayMember)); //aligment problem
BFE>  FlexibleArrayMember oData = *(new(buffer) FlexibleArrayMember(100, p));

BFE>  for(int i = 0; i < 100; i++)
BFE>    oData[i] = i * 0.2;
    
BFE>  std::cout << oData[0] << ", ";
BFE>  for(int i = 1; i < 100; i++)
BFE>    std::cout << ", " << oData[i];
    
BFE>  oData.~FlexibleArrayMember();
BFE>  std::cout << std::endl;
  
BFE>  std::cout << "the end" << std::endl;
BFE>  return 0;
BFE>}

BFE>


Это куда более многословно, не решает проблему выравнивания (выносит ее из класса в код, создающий объект), не делает код более безопасным. Увы
Re[30]: Хозяйке на заметку: compile-time CRC32
От: B0FEE664  
Дата: 06.12.13 11:40
Оценка:
Здравствуйте, Lazin, Вы писали:

E>>>>>Кроме того, его же можно безопасно завернуть в С++ шаблон...

X>>>>Lazin это просил.
L>>>Это должно было послужить иллюстрацией того, что метапрограммирование на шаблонах в современном с++ иногда все же просасывает примитивному коду на Си

BFE>>Ой, да ладно! Всё можно написать и на С++ и работать будет ничуть не хуже. Полный пример долго писать, а для затравки могу подкинуть вот такой код, написанный за 10 минут. Тут, конечно, есть проблемы с обработкой ошибок и преобразованием указателей, но всё это можно развить и углубить без потери производительности:


L>Это куда более многословно,

Зато можно много чего написать.

L>не решает проблему выравнивания (выносит ее из класса в код, создающий объект),

Можно решить и в класс занести. Дело не хитрое.

L> не делает код более безопасным. Увы

Ну, ассёрт на индекс я поставил. А нужно-то что?
И каждый день — без права на ошибку...
Re[30]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 06.12.13 19:53
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Это куда более многословно, не решает проблему выравнивания (выносит ее из класса в код, создающий объект), не делает код более безопасным. Увы


Ну, так если хочется просто сделать безопасно, то можно просто структуру, в конец которой "приписан" массив сделать с закрытым operator new и остальной ерундой и вперёд, создавай/разрушай безопасно, а остальное как в С мона...

А если ещё хочется от массива сревисов как в С++, то чуть больше похимичить прийдётся, конечно...
Но тоже ничего нереального.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[31]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 06.12.13 20:44
Оценка:
Здравствуйте, B0FEE664, Вы писали:

L>>Это куда более многословно,

BFE>Зато можно много чего написать.

L>>не решает проблему выравнивания (выносит ее из класса в код, создающий объект),

BFE>Можно решить и в класс занести. Дело не хитрое.

Дело в том, что можно много чего там написать, но надо ли? Неужели это поможет решить какие-нибудь проблемы с этим кодом (кроме формального UB, на который лично мне фиолетово)?

L>> не делает код более безопасным. Увы

BFE>Ну, ассёрт на индекс я поставил. А нужно-то что?
assert — дело нехитрое, я тоже assert использовал
Re[31]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 06.12.13 20:48
Оценка:
Здравствуйте, Erop, Вы писали:

L>>Это куда более многословно, не решает проблему выравнивания (выносит ее из класса в код, создающий объект), не делает код более безопасным. Увы

E>Ну, так если хочется просто сделать безопасно, то можно просто структуру, в конец которой "приписан" массив сделать с закрытым operator new и остальной ерундой и вперёд, создавай/разрушай безопасно, а остальное как в С мона...
А можно просто проверять размер массива, прежде чем делать reinterpret_cast

E>А если ещё хочется от массива сревисов как в С++, то чуть больше похимичить прийдётся, конечно...

E>Но тоже ничего нереального.

Вот в том то и дело, что человеку, применяющему struct hack в коде ничего такого не хочется, скорее наоборот, "сервисы как в С++" для него выглядят как переусложнение кода
Re[32]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 07.12.13 02:40
Оценка:
Здравствуйте, Lazin, Вы писали:

L>А можно просто проверять размер массива, прежде чем делать reinterpret_cast

А зачем его вообще делать?..

Если элементы массива POD, то можно прямо как в С сделать же, тока для безопасности лучше таки new с delete переделать.
А если не POD, то всё равно их создавать/разрушать надо, то есть опять же new и delete надо прятать, а создавать/разрушать фабричными методами какими-то...


L>Вот в том то и дело, что человеку, применяющему struct hack в коде ничего такого не хочется, скорее наоборот, "сервисы как в С++" для него выглядят как переусложнение кода


В смысле "не хочется"? Ну, например, получить доступ к массиву как к паре интераторов может же захотеться? А обратный итератор, например?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[18]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 07.12.13 02:42
Оценка:
Здравствуйте, Lazin, Вы писали:

L>По поводу сишечки — я вот например иногда использую т.н. structure hack, для производительности, в c++ коде. Может ты сумеешь предложить типобезопасный аналог на шаблона, раз уж ты такой их фанат?



А в чём беда-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[33]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 07.12.13 11:21
Оценка:
Здравствуйте, Erop, Вы писали:

L>>А можно просто проверять размер массива, прежде чем делать reinterpret_cast

E>А зачем его вообще делать?..
Изначальный пример состоял в следующем — у нас есть отмаппленый в память файл, который разбит на страницы, работа с данными страниц происходит через структуру:

struct Page {
    int len;
    ...some metadata...
    int offsets[];
};


мы берем указатель на начало страницы, делаем reinterpret_cast<Page*> и работаем со страницей как с обычной структурой. Все клево и просто. Можно делать placement new, если нужно чтобы был вызван конструктор, в который можно например передать len и метаданные. Я предложил сделать это на С++, ибо все плюются от "Си кода в программе на С++"
Вообще, оффтопик изначально начался с того, что кое кто высказался на тему того, что код на "современном С++" имеет тенденцию переусложнять простые вещи. Вот и этот пример со struct hack на Си выглядит значительно проще и понятней чем все предложенные варианты на правильном современном С++.

E>Если элементы массива POD, то можно прямо как в С сделать же, тока для безопасности лучше таки new с delete переделать.

E>А если не POD, то всё равно их создавать/разрушать надо, то есть опять же new и delete надо прятать, а создавать/разрушать фабричными методами какими-то...
Какие еще фабрики? Мы же говорим о моем примере, или уже говорим в общем?

L>>Вот в том то и дело, что человеку, применяющему struct hack в коде ничего такого не хочется, скорее наоборот, "сервисы как в С++" для него выглядят как переусложнение кода

E>В смысле "не хочется"? Ну, например, получить доступ к массиву как к паре интераторов может же захотеться? А обратный итератор, например?..
Когда мне потребовалось использовать вот это вот в коде одного проекта, мне нужно было дописывать элементы в массив, сортировать их и перебирать по порядку. Reverse iterator в принципе и здесь реализуем без всяких наворотов, только вот взялся этот reverse iterator не из условий задачи, в этом то и проблема
Re[34]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 07.12.13 20:13
Оценка:
Здравствуйте, Lazin, Вы писали:

L>мы берем указатель на начало страницы, делаем reinterpret_cast<Page*> и работаем со страницей как с обычной структурой. Все клево и просто. Можно делать placement new, если нужно чтобы был вызван конструктор, в который можно например передать len и метаданные. Я предложил сделать это на С++, ибо все плюются от "Си кода в программе на С++"


Ну так в чём проблема сделать тоже самое, но на С++ и типобезопасно?


L>Вообще, оффтопик изначально начался с того, что кое кто высказался на тему того, что код на "современном С++" имеет тенденцию переусложнять простые вещи.

Скорее это свойство не С++, а плохих инженеров...

L>Вот и этот пример со struct hack на Си выглядит значительно проще и понятней чем все предложенные варианты на правильном современном С++.


Ну положим мы не будем обсуждать как написать шаблон, а будем писать ту же структуру, но на С++ и безопасную.
Как будем писать?

1) Добавим методы типа operator[] такой и сякой.
2) Добавим методы/функции формирования/создания
3) Запретим неправильные пути создания и разрушения

E>>Если элементы массива POD, то можно прямо как в С сделать же, тока для безопасности лучше таки new с delete переделать.

E>>А если не POD, то всё равно их создавать/разрушать надо, то есть опять же new и delete надо прятать, а создавать/разрушать фабричными методами какими-то...
L>Какие еще фабрики? Мы же говорим о моем примере, или уже говорим в общем?

Не фабрики, а фабричные методы, например они могут и в переданном буфере создавать объект...

L>Когда мне потребовалось использовать вот это вот в коде одного проекта, мне нужно было дописывать элементы в массив, сортировать их и перебирать по порядку. Reverse iterator в принципе и здесь реализуем без всяких наворотов, только вот взялся этот reverse iterator не из условий задачи, в этом то и проблема


Ну я про это и говорил, что если надо, можно дописать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[17]: Хозяйке на заметку: compile-time CRC32
От: enji  
Дата: 08.12.13 05:12
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>
SD>vector<tuple<int, string>> results;
SD>db_pool.query("SELECT id, name FROM accounts WHERE date>?", results, last_login_date);
SD>for (auto account : results)
SD>  cout << get<1>(account) << endl;
SD>


SD>Для чего нужно CRC32? Для поддержки prepared statements, которые привязаны к соединениям. Поскольку соединений в пуле много, неизвестно, поступал ли уже этот запрос в это соединение или нет. Если поступал, то по CRC32 запроса можно его найти. Вероятность коллизии крайне мала, запросов же не сотни тысяч.


SD>Можно делать иначе — в рантайме регистрировать каждый запрос, на стартапе получать уникальный ID, и пользовать его. Решение с CRC32 банально быстрее было написать, и меньше тестировать.


Можно сделать в лоб — считать crc32 при каждом вызове db_pool.query. С учетом скорости вычисления crc32 и того, что исполнение запроса — обычно tcp\ip, то "банально быстрее" убирает пару десятков мкс из пары десятков мс, что обычно ни о чем...
Re[18]: Хозяйке на заметку: compile-time CRC32
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.12.13 18:15
Оценка:
Здравствуйте, Lazin, Вы писали:

L>APR умеет vectorised I/O, boost нет, apr может в базы данных(и даже умеет prepare), boost нет. По поводу сишечки — я вот например иногда использую т.н. structure hack, для производительности, в c++ коде. Может ты сумеешь предложить типобезопасный аналог на шаблона, раз уж ты такой их фанат?

Я давненько ничего не писал на плюсах, хочу уточнить: целочисленные параметры на шаблонах уже отменили?
template<n> struct Page {
public Page()
{
  this->num_items = n;
}
...
Metadata
...
int32_t num_items;
int32_t offsets[n];
};

Всё типобезопасненько. Ни один верификатор не подкопается.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[19]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 10.12.13 08:23
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Я давненько ничего не писал на плюсах, хочу уточнить: целочисленные параметры на шаблонах уже отменили?

S>
S>template<n> struct Page {
S>public Page()
S>{
  this->>num_items = n;
S>}
S>...
S>Metadata
S>...
S>int32_t num_items;
S>int32_t offsets[n];
S>};
S>

S>Всё типобезопасненько. Ни один верификатор не подкопается.

Увы, n неизвестно на этапе компиляции, даже размер страницы неизвестен. Это пример из практики, там данные в страницу записываются с конца, а смещения этих данных добавляются в массив offsets. И так до тех пор, пока в странице есть место.
Re[35]: Хозяйке на заметку: compile-time CRC32
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 10.12.13 08:32
Оценка:
Здравствуйте, Erop, Вы писали:

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


L>>мы берем указатель на начало страницы, делаем reinterpret_cast<Page*> и работаем со страницей как с обычной структурой. Все клево и просто. Можно делать placement new, если нужно чтобы был вызван конструктор, в который можно например передать len и метаданные. Я предложил сделать это на С++, ибо все плюются от "Си кода в программе на С++"


E>Ну так в чём проблема сделать тоже самое, но на С++ и типобезопасно?

Я не вижу способа сделать это действительно безопасным. Ну то есть можно кое что предпринять на этапе компиляции, но все равно нужны runtime проверки.

L>>Вообще, оффтопик изначально начался с того, что кое кто высказался на тему того, что код на "современном С++" имеет тенденцию переусложнять простые вещи.

E>Скорее это свойство не С++, а плохих инженеров...
Возможно. А возможно это дает о себе знать культура, сложившаяся в сообществе С++ программистов

L>>Вот и этот пример со struct hack на Си выглядит значительно проще и понятней чем все предложенные варианты на правильном современном С++.


E>Ну положим мы не будем обсуждать как написать шаблон, а будем писать ту же структуру, но на С++ и безопасную.

E>Как будем писать?

E>1) Добавим методы типа operator[] такой и сякой.

E>2) Добавим методы/функции формирования/создания
E>3) Запретим неправильные пути создания и разрушения
Мой метод, определить это все безобразие внутри срр файла и использовать только в нем. И ничего не придется ограничивать
Re[20]: Хозяйке на заметку: compile-time CRC32
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.12.13 08:52
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Увы, n неизвестно на этапе компиляции, даже размер страницы неизвестен. Это пример из практики, там данные в страницу записываются с конца, а смещения этих данных добавляются в массив offsets. И так до тех пор, пока в странице есть место.

Ну, во-первых, тогда вы говорите о struct hack второго порядка.
Потому что классический struct hack — это фиксированный заголовок и "плавающий" хвост. И с ним в C++ всё в порядке.
Для того, чтобы получить типобезопасность, нужно понимать, что вы называете типобезопасностью.
От каких именно ошибок должен вас застраховать компилятор? От выхода за границы страницы? Невозможно — вы же до рантайма ничего не знаете о структуре страницы.
Вся разница между С и С++ в возможности обеспечить инкапсуляцию.
На С++ я опишу страницу совершенно обычным объектом, где сначала идут фиксированные поля заголовка, затем "гибкий" список смещений записей, а потом уже данные записей. А целостность я гарантирую при помощи методов типа
record* page::get_record(int i)
{
  return (record*)(this->raw_data + this->record_offsets[i]);
}

и
record* page::add_record(size_t recSize)
{
  size_t newOffset = this->record_offsets[(this->rec_count)++] - recSize;
  this->record_offsets[this->rec_count]=newOffset;
  return (record*)(this->raw_data + newOffset)
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[36]: Хозяйке на заметку: compile-time CRC32
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.12.13 09:04
Оценка:
Здравствуйте, Lazin, Вы писали:

E>>Ну так в чём проблема сделать тоже самое, но на С++ и типобезопасно?

L>Я не вижу способа сделать это действительно безопасным. Ну то есть можно кое что предпринять на этапе компиляции, но все равно нужны runtime проверки.
Вся небезопасность сосредоточена в корректной интерпретации. На C++ это делается при помощи класса указателя PageRef, который инкапсулирует всю логику — в частности, проверяет что его нельзя сконструировать из неверно выравненного указателя, а также что по указанному адресу лежит действительно валидная страница.
С этого момента все операции со страницей гарантированно корректны, т.к. все reinterpret_cast спрятаны внутрь безопасных методов, типа page->records[2]->fields[3]->AsInt64(), и производительностью, эквивалентной c-style записи того же самого.

L>>>Вот и этот пример со struct hack на Си выглядит значительно проще и понятней чем все предложенные варианты на правильном современном С++.

У меня сложилось впечатление, что собственно Си вы не застали. "на Си" предложенный вами хак — это минное поле, где шаг вправо-влево приводит в лучшем случае к access violation, а в худшем — к потере данных. На всякий случай напомню, что никакой инкапсуляции в С нет, так что если вы где-то в прикладном коде забыли assert, то вы запросто угробите всю вашу страницу в момент обращения к соседней.

L>Мой метод, определить это все безобразие внутри срр файла и использовать только в нем. И ничего не придется ограничивать

Вы описываете решение на С++, а не на C.
В абстрактно-общем случае ничего более полезного, чем описанная инкапсуляция, получить не удастся. Т.е. у вас будет минимальная гарантия — при ошибке в прикладном коде у вас будет не загадочная потеря данных, а внятное исключение. Это уже огромный прогресс по сравнению с С, где вся инкапсуляция построена на передаче void*, и никак не защищает от перепутывания указателя на запись с указателем на страницу.

В более специфичном случае, к примеру, если известны структуры хранимых записей, можно сделать вообще полностью типобезопасную обёртку, которая статически будет вам гарантировать отсутствие в рантайме вещей типа record index out of bounds.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[36]: Хозяйке на заметку: compile-time CRC32
От: Erop Россия  
Дата: 10.12.13 10:11
Оценка:
Здравствуйте, Lazin, Вы писали:

L>Я не вижу способа сделать это действительно безопасным. Ну то есть можно кое что предпринять на этапе компиляции, но все равно нужны runtime проверки.


В смысле? У теюя там будет просто массив с динамическим размером. Работай на интервалах итераторв -- будет тебе безопасно без проверок.

L>Возможно. А возможно это дает о себе знать культура, сложившаяся в сообществе С++ программистов

Ну там есть несколько нехороших парней, которые сами по себе может и хорошие инженеры, но пример показать любят дурной...
Вообще там слишком много, на мой вкус, перекоса в математику.

E>>1) Добавим методы типа operator[] такой и сякой.

E>>2) Добавим методы/функции формирования/создания
E>>3) Запретим неправильные пути создания и разрушения
L>Мой метод, определить это все безобразие внутри срр файла и использовать только в нем. И ничего не придется ограничивать

Зачем? А если ты хочешь отдать дерево наружу? Так надо какой-то интерфейс тулить, а так просто отдаёшь наружу живую структуру, которой можно [53], например сказать или GetCountOfNodeElements() скажем...

Так легко может оказаться и удобнее и безопаснее и быстрее...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[22]: Хозяйке на заметку: compile-time CRC32
От: TarasB  
Дата: 12.12.13 13:22
Оценка: :)
Здравствуйте, Lazin, Вы писали:

L>Что-то вроде этого:


L>
L>struct Page {
L>...
L>Metadata
L>...
L>int32_t num_items;
L>int32_t offsets[];
L>};
L>


Безо всяких хаков и УБ:
type Page (LoOfs,HiOfs : integer) is new record 
   ...
   Metadata
   ...
   Offsets : Integer_Array (LoOfs, HiOfs);
end record;
Re[9]: Хозяйке на заметку: compile-time CRC32
От: dimgel Россия https://github.com/dimgel
Дата: 19.12.13 09:57
Оценка:
Здравствуйте, niXman, Вы писали:

X>а mono и openjdk — костыли.


В чём заключается костыльность openjdk?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.