Pull to refresh
13
0
Андрей Световой @light_and_ray

Программист C++

Send message

Признали, что стажёр обязан выплатить 13к белорусских рублей (почти 400к ₽). Аппеояцию подавать не стал, так как каждый раз ему бы приходилось платить нос пошлину в размере 500 белорусских рублей

Ммм, пожалуй вы правы. Спасибо

Какой тогда смысл оставлять что-то на рантайм?

Ну как, std::cout на compile time не получится ;)

С рантаймом вариант только явно указывать захватываемые переменные

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

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

Рефлексия работает на времени компиляции, так что компилятор учтет, что используется ссылка, и либо соптимизирует внутри функции тоже, либо не будет оптимизировать

Оптимизация не является частью языка, и, если в языке есть переменная с именем a, то ее можно было бы брать из рефлексии, даже если она соптимизированна

Кстати, если такой способ получения ссылок на переменные из вызываемой функции возможны, то с помощью перерузки строкового литерала (operator ""_f), можно сделать такие же f-строки. (только будет не префикс, а суффикс _f) И без узкоспециализированного синтаксиса только для формата. Чем и крут C++

Хотя, без синтаксической поддержки сложные выражения не подставишь, или нужен будет какой-то constexpr eval, что уже очень странно для c++. Не знаю, нужны ли вообще f-строки в этом языке, это другой вопрос. Мне интересно, можно ли вот так взять произвольную ссылку по имени на переменную из вызывающей функции

f строки это то да, этим и навеянно. Просто мне стало интересно, возможно ли такое сделать этой ревлексией без специальных языковых конструкций

Можно ли, используя эту рефлексию, реализовать примерно такое?

int a = 5;
print("a = {a}");

Чтобы функция вытащила строку между фигурными скобками, и использовала как переданную переменную a? Или как ссылку на локальную переменную из функции, из которой вызывают.

Это было бы достаточно жестко, если бы функция через рефлексию могла получить доступ к контексту, из которого ее вызывают. Как-то так:

template for (auto var : meta::calledFrom().variables())
{
    if (var.name == "a"){
        std::cout << [: var.getConstReference() :];
        break;
    }
}

Где бы вместо "a" мы взяли бы подстроку из фигурных скобок в "a = {a}". Это было бы очень мощно!

Клавиши Home, End, PgUp, PgDn находятся не как на ноутбучых клавиатурах на стрелочках, а в каком-то отдельном неудобном блоке

При чем тут практика? - тред про сложность! Вы переключаете тему и предьявляете, что никто ничего не понимает. Все прекрасно понимают, чем отличается сложность и быстрость, вы кого за дураков держите?

Тред про то, что один человек написал O(log(n)), а второй не понял, по какому основанию, я пояснил, что оно не имеет значение в данной записи

В конце рабочего дня мой начальник задумчиво говорит: „Было бы неплохо
выделить шкаф под книги. Только поставить его некуда“. Я, недолго думая,
предлагаю ему поставить этот шкаф у меня в кабинете, так как, как раз
вчера у меня был демонтирован один лишний стол. Ответ начальника меня
ошарашил: „Доверить тебе мои книги? Нет уж, я поставлю шкаф у себя“.

Может быть он не воровства боялся, а что вы в них загляните. Может быть там что-то очень личное, что даже название не хотел бы вам показывать? А то нереалистично, если он боялся воровства, то это странно

Основание не имеет значение для сложности, так как любое основание можно привести к другому, домножив на константу. log_c(x) = log_n(x)/log_n(c)

Да не переживайте, вообще пофиг кто что считает. Главное, чтобы вам нравилось

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

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

Вообще по описанию похоже, будто автоматически определяется, что возвращаемые значение функции (или часть из них) были проигнорированны, и java сама может выпилить вычисление этих значений, без побочных эффектов. Звучит круто - это какая-то серьезная эвристика. Неужели в джаве такое есть? Было бы интересно

Я тоже подумал, но это странно. Этот код не "не обезательно" выполняется, он вообще не выполняется

Кроме того, как минимум, по моему опыту, Java (в большинстве окружений) просто лучше распознает, какие фрагменты кода выполнять не обязательно, а какие критичны для функционирования программы.

Не понял, а что значит "какие фрагменты кода выполнять не обязательно"? Как это?

О(n^2/2-n/2) = О(n^2), и это следует из определения. Я точно не помню, но своими словами O(f(n)) означает, что найдутся такие k1 и k2, что k1*f(n) < f(n) < k2*f(n). Сама f(n) между двумя функциями может изгибаться как угодно

но мне обычно важно на практике, что код не перебирает лишние цифры.

Ассимптотическая сложность алгоритма не имеет к этому никакого отношения. Коэфиценты k1 и k2 могут быть сколь угодно большими или маленькими

Если хотите посчитать число операций, зачем вам вообще тогда нужно O? Просто считайте: n^2/2-n/2, а O(n^2/2-n/2) показывает полное непонимание того, что вы делаете

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity