C++ Academy
16.5K subscribers
616 photos
127 videos
1 file
579 links
По всем вопросам- @haarrp

@itchannels_telegram - 🔥 best it channels

РКН: clck.ru/3FmxJF
Download Telegram
Когда впервые сталкиваешься с type_traits в C++, они кажутся чем-то из мира метапрограммирования для продвинутых Сеньоров.

Но чем глубже разбираешься в плюсах, тем чаще ловишь себя на мысли: «А как вообще этот кусок кода собирается?», «Почему одна перегрузка сработала, а другая нет?», «Как можно элегантно отфильтровать типы на этапе компиляции?»

И тут внезапно узнаешь, что именно type_traits — это та самая опора, с которой можно решать такие задачи красиво и без хаков. Особенно если писать универсальный код, библиотеки, или хочешь просто понимать, как работает стандартная библиотека.

Сегодня прочитал пост Вани Ходора, бэкенд-разработчика из Яндекс Лавки, который как раз сделал гайд по type_traits — не про то, *что* они делают, а за что их можно полюбить. Не учебник, не документация, а маленькое путешествие по любимым трейтам с примерами, идеями и попытками реализации.

Будет полезно, даже если вы давно знакомы с шаблонами — с другой стороны посмотрите на знакомые конструкции, а может, и вдохновитесь на свой маленький эксперимент в шаблонном коде.
❤‍🔥6🔥42🥰1🎉1
🧠 Продвинутая задача на C++ — Оптимальный доступ к матрице с кешированием

Задача:
У вас есть матрица N x M, хранящаяся в виде одномерного массива (row-major).
Нужно реализовать класс Matrix, поддерживающий:
- Быстрый доступ get(i, j) и set(i, j, value)
- Локальность данных при сканировании по строкам и по столбцам
- При этом: сравнить производительность строкового и столбцового прохода


int main() {
Matrix mat(10000, 10000);
// Заполнить матрицу числами
for (int i = 0; i < 10000; ++i)
for (int j = 0; j < 10000; ++j)
mat.set(i, j, i + j);

// Сумма по строкам
long long row_sum = 0;
for (int i = 0; i < 10000; ++i)
for (int j = 0; j < 10000; ++j)
row_sum += mat.get(i, j);

// Сумма по столбцам
long long col_sum = 0;
for (int j = 0; j < 10000; ++j)
for (int i = 0; i < 10000; ++i)
col_sum += mat.get(i, j);
}


Вопрос:
Почему сканирование по строкам быстрее, чем по столбцам, даже если данные одинаковые?

---

Разбор:


class Matrix {
private:
int rows, cols;
std::vector<int> data;

public:
Matrix(int r, int c) : rows(r), cols(c), data(r * c) {}

int get(int i, int j) const {
return data[i * cols + j];
}

void set(int i, int j, int value) {
data[i * cols + j] = value;
}
};


Ответ:
Память в C++ выделяется линейно.
В std::vector<int> data, элементы строки хранятся подряд в памяти.
То есть mat[0][0], mat[0][1], ..., mat[0][9999] идут подряд.

Когда мы сканируем по строкам, процессор использует кеш строк памяти эффективно.
Когда же мы сканируем по столбцам, мы прыгаем по памяти через cols шагов → кеш не успевает подгружать нужные блоки → больше cache misses → медленнее.

---

🧠 Вывод:
- Даже при правильном коде, порядок доступа к памяти критически важен
- Понимание устройства кеша CPU помогает писать реально быстрый код
- Такие задачи полезны для подготовки к системному программированию, оптимизации и собеседованиям

#cpp #performance #cache #memory #optimize
13🔥4👍1🥰1