Forwarded from Библиотека собеса по C++ | вопросы с собеседований
Какую проблему метапрограммирования решают шаблоны с переменным числом аргументов совместно с рекурсией?
Anonymous Quiz
15%
Динамическое выделение памяти для параметров
12%
Проверка корректности аргументов при выполнении
6%
Генерация случайных типов для тестирования
64%
Обход всех элементов пакета параметров поочерёдно
3%
Создание потоков для каждого аргумента пакета
😁1
🕯️ Hello World в 2 МБ
Простейшая программа на C++ с
•
• Флаг
• Тенденция по версиям GCC показательна: тот же
Принцип «не плати за то, что не используешь» на практике работает ровно до того момента, пока компилятор сам не решит, что тебе нужно.
👉 Более детальный разбор
✏️ Вы проверяли, сколько весит ваш «минимальный» бинарник?
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
Простейшая программа на C++ с
iostream и статической линковкой на GCC 15 выдаёт бинарник в 2,3 МБ. Для вывода 11 символов — как-то многовато.•
iostream тянет за собой инициализацию std::cout, std::stringstream, локали, виртуальные функции и шаблоны — всё это ради одного вызова operator<<. Замена на printf сразу роняет размер до 42,5 КБ• Флаг
-s срезает ~1,2 МБ отладочной информации, которую компилятор зачем-то пихает в релизный бинарник по умолчанию• Тенденция по версиям GCC показательна: тот же
iostream-бинарник на GCC 3.4.2 весил 260 КБ, на 15.2.0 — уже 1,05 МБ. С каждой версией зависимости жиреютПринцип «не плати за то, что не используешь» на практике работает ровно до того момента, пока компилятор сам не решит, что тебе нужно.
👉 Более детальный разбор
✏️ Вы проверяли, сколько весит ваш «минимальный» бинарник?
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
😁7❤5👍1
Forwarded from Библиотека задач по C++ | тесты, код, задания
😁3🔥1
В прошлый раз мы генерировали диапазоны на лету с помощью iota и repeat. Теперь научимся их комбинировать — объединять несколько источников данных в один поток, не копируя ни байта.
std::vector<std::string> names = {"Алиса", "Борис", "Виктор"};
std::vector<int> scores = {95, 82, 78};
// Получаем пары (имя, балл)
for (auto [name, score] : views::zip(names, scores)) {
std::cout << name << ": " << score << "\n";
}
// Алиса: 95
// Борис: 82
// Виктор: 78zip заканчивается на самом коротком диапазоне — безопасно при разной длине. Внутри возвращается
std::tuple, а structured bindings разбирают его на отдельные переменные.❗️
views::zip возвращает ссылки на элементы исходных контейнеров. Модификация через structured binding изменит оригинальные данные.std::vector<int> data = {10, 50, 30, 90, 20};
for (auto [i, val] : data | views::enumerate) {
if (val > 40) {
std::cout << "Первое превышение на позиции " << i << "\n";
break;
}
}
// Первое превышение на позиции 1Раньше для этого приходилось писать
views::zip(views::iota(0), data) (см. предыдущий пост про генераторы). Теперь — в одну строку.❗️ Тип индекса в
enumerate — это range_difference_t, а не int или size_t. На практике разница редко бьёт, но при сравнении с size() компилятор может выдать предупреждение о знаковости.🧊 Главное свойство
Как и все views,
zip и enumerate ленивые — они не создают копий и не выделяют память. Это лёгкие обёртки поверх исходных данных, которые вычисляются только при обращении к элементу.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1