Вот нагуглил некоторое объяснение истоков проблемы: https://habrahabr.ru/post/221221/
Если кратко, то до определенной версии MongoDB шла открытой по умолчанию. И пользователи, неожидавшие такой засады, ничего не подозревая, таковой ее и оставляли.
Итераторы в LevelDB делают его очень гибким.
В вашем случае, возможно, стоит еще обратить внимание на RocksDB
Это доработанный LevelDB. Он оптимизирован для SSD и подходит для больших размеров БД. Не нужны лишние конвертирования — можно хранить бинарные данные. Ну и скорость нaaaамного выше. Три дня, что-то уж совсем перебор.
Короче, LevelDB/RocksDB — то что вам нужно.
Тоже всегда искренне удивляюсь, когда вижу как кто-то открывает issue в открытом проекте со свободной лицензией и недружелюбно высказывает претензии.
Ну ёмоё! Это же открытый код! Если тебя что-то не устраивает, пришли Pull Request! Ну или хотя бы аккуратно оформленный баг-репорт.
Это такая защита от не правильного использования. std::forward предполагает использование именно с шаблонным параметром, но если кто-то вдруг захочет странного и напишет что то вроде этого:
std::forward<int&>(5)
то сработает защита. В этом случае аргумент является rvalue, поэтому компилятор выбирает вторую перегрузку, но тип ссылка на lvalue. пример
1) When the C-style cast expression is encountered, the compiler attempts to interpret it as the following cast expressions, in this order:
a) const_cast<new_type>(expression);
b) static_cast<new_type>(expression), with extensions: pointer or reference to a derived class is additionally allowed to be cast to pointer or reference to unambiguous base class (and vice versa) even if the base class is inaccessible (that is, this cast ignores the private inheritance specifier). Same applies to casting pointer to member to pointer to member of unambigous non-virtual base;
c) static_cast (with extensions) followed by const_cast;
d) reinterpret_cast<new_type>(expression);
e) reinterpret_cast followed by const_cast.
Возможная реализация для std:forward (g++ bits/move.h):
Если someContainer::iterator::operator*() возвращает ссылку или константную ссылку, то item таковым и будет, если rlalue ссылку то возвращаемое значение будет перемещено в item без создания временного объекта.
Компилятор конечно подскажет, но зачем отвлекаться?
Использование auto в данном случае не вносит никаких неоднозначностей, упрощает чтение кода и облегчает его поддержку. Так зачем усложнять?
Вы не знаете, есть какой-то способ единообразно генерировать Precompiled-Headers для clang и gcc?
Что бы в Makefile можно было просто заменить CPP = g++ на CPP = clang++?
Формулу расчета можно сильно упростить. Необходимость менять дверь легче объяснить по другому:
Если изначально принять стратегию выбора неправильной двери, то вы делаете свой выбор (выбираете неправильную дверь) с вероятностью 2/3. После того, как одна из неправильных дверей открыта, вы не меняете свой выбор относительно неправильной двери и открываете единственно возможную при первоначальном выборе правильную дверь.
Не сразу увидел ваше дополнение. Да, кажется, доступ к статическим полям не реализован. Его, кстати, не так уж и сложно реализовать. Я примерно представляю как это можно сделать. Просто это никому не было нужно.
Что касается вашего примера, то у вас статическое поле торчит наружу. Это не очень хорошо с точки зрения архитектуры. И, возможно, требуется рефакторинг. Попробуйте в вашем примере заменить static $a на private static $a и проблема сразу исчезнет.
А вообще, опишите исходную задачу, попробую накидать решение.
В настоящий момент в библиотеке есть практически все для решения основных задач, возникающих при написании расширений.
Раз уж речь о высокопроизводительном решении, то совсем не обязательно, что будет использована внешняя БД.
БД может быть встроенной. Или это вообще могут быть данные размещенные в памяти.
Ну и потом, вы учитывайте, что в режиме однопоточного сервера (он ведь однопоточный?) ответы должны быть очень быстрыми. И отказ от исключений в том случае, когда без них легко обойтись, таки имеет смысл.
Там похоже только TensorFlow запустится.
Это ни ко мне вопрос. Я просто кратко пересказал текст по ссылке. Сам я Монгой вообще не пользуюсь
Вот нагуглил некоторое объяснение истоков проблемы: https://habrahabr.ru/post/221221/
Если кратко, то до определенной версии MongoDB шла открытой по умолчанию. И пользователи, неожидавшие такой засады, ничего не подозревая, таковой ее и оставляли.
Итераторы в LevelDB делают его очень гибким.
В вашем случае, возможно, стоит еще обратить внимание на RocksDB
Это доработанный LevelDB. Он оптимизирован для SSD и подходит для больших размеров БД. Не нужны лишние конвертирования — можно хранить бинарные данные. Ну и скорость нaaaамного выше. Три дня, что-то уж совсем перебор.
Короче, LevelDB/RocksDB — то что вам нужно.
Тоже всегда искренне удивляюсь, когда вижу как кто-то открывает issue в открытом проекте со свободной лицензией и недружелюбно высказывает претензии.
Ну ёмоё! Это же открытый код! Если тебя что-то не устраивает, пришли Pull Request! Ну или хотя бы аккуратно оформленный баг-репорт.
Это такая защита от не правильного использования. std::forward предполагает использование именно с шаблонным параметром, но если кто-то вдруг захочет странного и напишет что то вроде этого:
то сработает защита. В этом случае аргумент является rvalue, поэтому компилятор выбирает вторую перегрузку, но тип ссылка на lvalue. пример
Совсем нет. Сравните: С-style-cast и std:forward
Возможная реализация для std:forward (g++ bits/move.h):
Видите разницу?
Дополнително: 1 2 3 4
На самом деле, почти всегда лучше писать
Если
someContainer::iterator::operator*()
возвращает ссылку или константную ссылку, тоitem
таковым и будет, если rlalue ссылку то возвращаемое значение будет перемещено вitem
без создания временного объекта.Зачем?
std::map::begin()
всегда возвращаетiterator
илиconst_iterator
.Если через какое то время вы поменяете сигнатуру функции
f
нато вам придется изменять также строку
на
Компилятор конечно подскажет, но зачем отвлекаться?
Использование
auto
в данном случае не вносит никаких неоднозначностей, упрощает чтение кода и облегчает его поддержку. Так зачем усложнять?У вас по всему тексту встречаются такие вот конструкции:
Что вы хотели сказать вот этим: ((Types&&)args...)?
Мне кажется, в данном случае будет уместнее использовать
std::forward
:Выглядит так, как будто вы замышляли идеальную передачу, а выполняете странное приведение типов в стиле C.
кроме того, вот эта фраза
Явно свидетельствует, что вы путаете rvalue и универсальные ссылки.
Вы не знаете, есть какой-то способ единообразно генерировать Precompiled-Headers для clang и gcc?
Что бы в Makefile можно было просто заменить
CPP = g++
наCPP = clang++
?Если изначально принять стратегию выбора неправильной двери, то вы делаете свой выбор (выбираете неправильную дверь) с вероятностью
2/3
. После того, как одна из неправильных дверей открыта, вы не меняете свой выбор относительно неправильной двери и открываете единственно возможную при первоначальном выборе правильную дверь.Что касается вашего примера, то у вас статическое поле торчит наружу. Это не очень хорошо с точки зрения архитектуры. И, возможно, требуется рефакторинг. Попробуйте в вашем примере заменить
static $a
наprivate static $a
и проблема сразу исчезнет.А вообще, опишите исходную задачу, попробую накидать решение.
В настоящий момент в библиотеке есть практически все для решения основных задач, возникающих при написании расширений.
так вы попробуйте в документацию заглянуть.
Iterable
давно просится. Наконец-то!Это сарказм был, я думаю.
Этот БД будет выплачиваться из налогов реально работающих людей?
Опять решили в социализм поиграть.
БД может быть встроенной. Или это вообще могут быть данные размещенные в памяти.
Ну и потом, вы учитывайте, что в режиме однопоточного сервера (он ведь однопоточный?) ответы должны быть очень быстрыми. И отказ от исключений в том случае, когда без них легко обойтись, таки имеет смысл.
Автору браво за развернутое объяснение.