Скорее всего, да. Всё зависит от того, в какой степени Вы пользуетесь ЯП.
У меня (C++) используется класс SecureString, который шаблонно наследуется от ряда стратегий, например, QuotesStrategy и HtmlStrategy. Каждая стратегия может быть Throw, Skip, Escape, Ignore. В этих случаях при встрече запрещенного символа будет соответсвенно либо брошено исключение, либо символ не попадёт в результирующую строку, либо будет заэскейплен, либо будет пропущен в результат. Вместе с Qt и implicit sharing, всё проверяется и приводится к нужным типам почти мгновенно, так как нет лишних копирований, а только один проход при присваивании/другом изменении.
При этом в HTML-вывод пользователю не может попасть строка, у которой HtmlStrategy — это Ignore, что гарантирует система приведения типов во время компиляции.
Да, это так. Типичным способом решения данной проблемы, когда operator delete не пустой, является выделение дополнительного кусочка памяти перед основным вовзращаемым блоком и запись туда служебной информации (вроде адреса аллокатора). Так, например, работают new[] и delete[] — new[] пишет перед выделяемым блоком количество элеметов, а delete[] это считывает и вызывает деструкторы нужное количество раз.
К сожалению, нет. nothrow delete вызывается только в случае, если при вызове nothrow new конструктор выкинул исключение, и за ним нужно почистить память. При вызове delete будет вызвана обычная версия, что приведёт к попытке удаления из пула объекта, заведённого в свободной памяти.
Нет. Существует три версии new со следующими сигнатурами:
void* operator new(size_t) throw(std::bad_alloc) — обычный
void* operator new(size_t, void*) throw() — размещающий
void* operator new(size_t, const std::nothrow_t&) throw() — оператор, который вместо выкидывания std::bad_alloc при проблемах вернёт нулевой указатель.
Используется последний примерно так:
X *p = new(std::nothrow) X;
if (!p) exit(1);
Хорошим тоном считается при перегрузке операторов выделения памяти перегружать и последний вариант.
Своп двух переменных делает UB, так как перемення изменяется дважды в одной sequence point. Скорее всего, не будет работать при определенном сочетании компилятор/флаги.
Пожалуйста, расскажите про новый продукт PCS.
Чем его ядро отличается от ядра PVC / OpenVZ, кроме встроенного PSBM? Если отличия существенные, планируется ли вливать их в PVC / OpenVZ / апстрим?
Это не баг, а документированное поведение — функция возвращает int, который может быть либо меньше нуля, либо больше нуля, либо равен нулю, и почти всегда по размеру больше, чем char. Ошибка именно в MySQL.
У меня был G900, проработал нормально ровно год (правда, вроде-бы, нужно было поставить какой-то хак, чтобы цифры на русской раскладке работали). Потом просто перестал включаться.
Ещё один вариант — слепить маленькую длинную арифметику с базой 2^16 и 3 разрядами. Тогда умножение и бинарный сдвиг легко реализуются в 32битных числах.
N-ое простое число имеет порядок примерно n * ln n, значит его длина — ln n + ln ln n или примерно ln n (если верить статье и считать, что ln ln n это очень мало). Получается, алгоритм работает за O(ln n * n^(1/2)). А это тоже совсем не экспоненциально, и даже быстрее, чем линейно.
У меня (C++) используется класс SecureString, который шаблонно наследуется от ряда стратегий, например, QuotesStrategy и HtmlStrategy. Каждая стратегия может быть Throw, Skip, Escape, Ignore. В этих случаях при встрече запрещенного символа будет соответсвенно либо брошено исключение, либо символ не попадёт в результирующую строку, либо будет заэскейплен, либо будет пропущен в результат. Вместе с Qt и implicit sharing, всё проверяется и приводится к нужным типам почти мгновенно, так как нет лишних копирований, а только один проход при присваивании/другом изменении.
При этом в HTML-вывод пользователю не может попасть строка, у которой HtmlStrategy — это Ignore, что гарантирует система приведения типов во время компиляции.
void* operator new(size_t) throw(std::bad_alloc) — обычный
void* operator new(size_t, void*) throw() — размещающий
void* operator new(size_t, const std::nothrow_t&) throw() — оператор, который вместо выкидывания std::bad_alloc при проблемах вернёт нулевой указатель.
Используется последний примерно так:
X *p = new(std::nothrow) X;
if (!p) exit(1);
Хорошим тоном считается при перегрузке операторов выделения памяти перегружать и последний вариант.
Пожалуйста, расскажите про новый продукт PCS.
Чем его ядро отличается от ядра PVC / OpenVZ, кроме встроенного PSBM? Если отличия существенные, планируется ли вливать их в PVC / OpenVZ / апстрим?
Вроде бы, O(n^(1/2)) — это не экспоненциальный рост, а экспоненциальный — это O(a^n).