All streams
Search
Write a publication
Pull to refresh
151
0
Евгений @Izaron

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

Send message

Было бы неплохо "из коробки" иметь возможность часть нового кода писать на Rust и связывать его с плюсами. C++ может использовать C, в котором другая система линковки, через extern "C". Почему бы не поддержать в компиляторах extern "Rust" ? Это дало бы буст к юзабельности Rust в реальных проектах и все вышеназванные проекты можно было бы перевезти постепенно.

В той же паре Java/Kotlin можно совершенно бесшовно вызывать код одного языка из другого языка.

Вы имеете в виду String и &str? Это практически аналоги std::string и std::string_view соответственно из плюсов, с такими же сферами применения. У этих двух типов сферы использования пересекаются, но есть случаи когда конкретный тип нужнее. В C++ и в Rust оба типа используются постоянно.

Извините, но вы оба считаете что-то не то...

Это первый вариант (оптимизированный):

std::vector<int> result(NumOfValues);
for (много раз) {
	result.resize(NumOfValues);
	std::iota(out.begin(), out.end(), 1);
}

Это второй вариант (оптимизированный):

for (много раз) {
	std::vector<int> out(NumOfValues);
	std::iota(out.begin(), out.end(), 1);
}

Вызов resize не влияет совсем, так как размер вектора уже достаточный. Но во втором коде лишняя аллокация и деаллокация памяти, из-за чего второй вариант "типа" медленнее. Я поменял одну строку, результат эквивалентный: https://quick-bench.com/q/fSU3z97n18YhNGBgHmojrtW0Y0U

Возникает чувство, что в C++ не хватает достаточно мощных инструментов для работы с типами.

"Вычисление" типа происходит через лютые фокусы. Хотя казалось бы, имея нормальную связь типов с их метаобъектами (это есть в Reflection TS, но там тоже руки сильно связаны), можно было бы посчитать тип человеческим алгоритмом. Но имеем такие статьи.

Но вы же прочитали мой комментарий, который я написал за пару минут, и ответили на него? Вот ненулевой выхлоп. А код, на который вы потратили кучу времени, я никогда не прочитаю и на меня он не повлияет. Вот и нулевой выхлоп =)

Вы уверены что у вас есть желание контрибутить, а не _искать причины чтобы не контрибутить_?

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

У меня история open source намного менее насыщенная. Я просто при очередном желании контрибьютить куда-нибудь сталкивался с подмножеством проблем из списка:

  • Неуловимый Джо: В подавляющем большинстве случаев проектом пользуется полтора человека на Земле. Раз уж мы хотим тратить свое драгоценное время, не лучше ли контрибьютить в то, чем косвенно пользуются миллиарды людей?

  • Trust me, I'm an engineer: Отсутствие на момент старта проекта каких-то фич в языке или Генеральная Линия Партии приводит к велосипедам уровня поддержки ООП в Си. В итоге от чтения исходников кровоточат глаза.

  • Nothing To Do Here: Всё самое содержательное написано в первые пару лет проекта, ничего нового особо не напишешь, "всё уже украдено до нас". Часто идёт в ногу с ревью PR раз в квартал.

  • Атлант расправил плечи: Проект билдится около 8 часов, и то приходится отключать debug-символы, чтобы он собрался в бинарник без сжирания всего RAM.

  • Ты не пройдёшь!: Иногда проект имеет высокий порог входа настолько, что надо несколько месяцев/лет учить матчасть (ядро ОС, компиляторы и т.д.) Такие проекты часто разрабатывают люди из Microsoft/Google/Apple/etc. на зарплате, потому что за "спасибо" - никому не сдалось.

  • Где деньги, Лебовски?: На факт контрибьютинга в open source всем пофигу, работодатели не выстраиваются в очередь, и офферы не начнут приходить рекой.

Круто! Про особенности переноса с VisualBasic на C++ - полноценный RangeArr можно получить "бесплатно", унаследовав от std::array

template<class T, long Begin, long End>
class range_arr : public std::array<T, End - Begin + 1> {
public:
    using underlying_t = std::array<T, End - Begin + 1>;
    using typename underlying_t::reference;
    
    constexpr reference operator[](long pos) {
        return underlying_t::operator[](pos - Begin);
    }
    constexpr reference operator[](long pos) const {
        return underlying_t::operator[](pos - Begin);
    }
};

Про опциональные ссылки - можно по умолчанию ссылаться на "свалку", если не будет проблем с многопоточностью (пример не идеальный):

template<typename T>
T dummy;

template<typename T>
T& dummy_ref(T value) {
    dummy<T> = value;
    return dummy<T>;
}

void addValue(int step, int& number = dummy_ref<int>(0)) {
    number = step;
}

Это перевод инициализации во время работы программы в инициализацию на этапе компиляции. Пример constexpr, который может находиться почти в каждом .cpp файле:

constexpr std::string_view HELLO_WORLD = "Hello world";

Если бы вместо constexpr был const, то этот объект построился бы в старте работы программы до вызова int main(). В больших программах таких объектов много, до нескольких тысяч.

Также в compile-time строить прочие простые объекты: контейнеры (пока не STL), регулярные выражения.

тут я не понял последний пример - почему ui.reset() для const unique_ptr& OK? Это ведь иммутабельный объект.

Я закомментировал строку с ui.reset(), имея в виду, что эта строка не скомпилируется, но сейчас вижу, что текущий вид сбивает с толку. Спасибо, поменяю!

Плюс к тому, я не совсем понял как propconst должен решить проблему constexpr p = make_unique<int>(); В идеале должна выделиться compile-time память под мутабельный в рантайме int.

Нет, как раз вся задумка в том, чтобы этот int был наглухо иммутабельный в рантайме.

По задумке авторов предложения, non-transient память должна быть разрешена, только если никаким образом нельзя получить к какой-то ее части mutable-доступ (без const_cast и пр. хаков). Ясно что объект const unique_ptr<int> недостаточно силён, чтобы это гарантировать.

Смысл попытки введения propconst в том, чтобы усилить выразительность языка, и гарантировать иммутабельность всего, что нагенерировалось в constexpr. Объект типа const unique_ptr<int propconst> смог бы это гарантировать.

Тем не менее, предложение еще в разработке, и финальный результат (non-transient память) мы увидим в С++26 или дальше, потому что feature freeze для C++23 происходит в 2021 году.

не шибко то и уклончиво - запись в const объект всегда ведет к UB. А const_cast лишь преобразует типы ссылок/указателей.

Перечитал еще раз стандарт - да, так и есть, const_cast "can produce UB" лишь постольку, что может являться "посредником" для записи в const-объект. Неоднозначностей вроде нет.

Добрый день! Интересно, как вы тестируете работоспособность новой версии "прошивки" (бэкенд + образ docker с бинарями)? Вы запускаете какой-нибудь "имитатор" типичного контеста, который стреляет в бэкенд?

разрабатывать новые алгоритмы, ОС и компиляторы

Боюсь, среднестатистический программист-выпусник вуза разработал примерно ноль новых алгоритмов, ОС, и компиляторов. Хотя нет, был один такой товарищ (Билл Гейтс), но вуз он что-то не окончил.

Ну а мантра «научить учиться» это просто религия, со всеми вытекающими.

Это секта Свидетелей Учившихся Учиться. У нас был "прохвессор", не сделавший за жизнь табуретки, но утверждавший, что человек останавливается в развитии, как только заканчивает учебу и выходит на работу.

Закончишь бакалавра, магистратуру, аспирантуру, потом кандидатскую писать, чтобы доцентом стать на кафедре, а потом докторскую и профессорскую должность, в общем, к 40 годам жизнь уже пролетит, зато заработаешь лычку "вучёного".

SDL написан на Си, код для работы с ним чисто сишный, на плюсах так не пишут. Графической библиотекой для C++ является, например, SFML.

Заклинаю вас, никогда так не делайте и не давайте таких советов.
https://eel.is/c++draft/lex.name#3.2

В данном случае нарушения нет, такие символы как члены класса, локальные переменные, методы и переменные внутри блока namespace - не являются находящимися в "global namespace".

Хаб C++ и картинка с C++ неправильные - nginx написан на кондовом C, для которого есть отдельный хаб, а принципы разработки другие.

Сам блог дает маловато контекста - непонятно что такое ngx_command_s, который в итоге нашли, но почему-то не стали смотреть его определение; что значат все аргументы в регистрации команды; и т.д. - всё время метод "скопируй и запусти".

Есть предложение в стандарт, которое вероятно попадет в ближайшие версии C++, в нем вводятся рекурсивные лямбды - self это неявный аргумент, являет собой объект closure.

auto fib = [](this auto self, int n) {
    if (n < 2) return n;
    return self(n-1) + self(n-2);
};

Пропорциональность возможности потребления определяется социальным рейтингом

"А судьи кто?..."

Или вы не понимаете разницы между однопоточным и многопоточным приложениями или не понимаете проблем с CoW.

Вы меня не так поняли - я за отмену CoW, но предпочел бы, чтобы это делал сам GCC (и прочие, к кому относится) без пинков от комитета.

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

Но это личная точка зрения.

через plugin для clang добавление нового ключевого слова не провернуть?

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

Но сами плагины тоже супер мощные, и с помощью них можно форматировать код (clang-format), фиксить простые ошибки (clang-fixit), рефакторить, делать линтеры (которые ищут опасные паттерны и предлагают их убрать). Это вспомогательные программы.

Выше пишут, что на libclang сделан qt-moc. Судя по описанию, эта надстройка ищет макрос внутри класса и генерирует по нему исходник. Я не разбираюсь в Qt, не могу сказать правда ли так, но теоретически это возможно.

Information

Rating
Does not participate
Registered
Activity