🌉 Забудьте про передачу указателей и размеров! (
Помните, мы обсуждали
До C++20 у нас была классическая проблема. Допустим, вы пишете функцию, которая должна обработать список чисел.
🐢 Как мы писали раньше:
Вариант 1: Принимать
Минус: Функция теперь намертво привязана к
Вариант 2: Си-стайл (Указатель + размер).
Минус: Легко ошибиться с размером, потерять контекст, код выглядит грязно.
🚀 Как мы пишем теперь (C++20):
👀 Что такое
Как и
Магия в том, что
✂️ Суперсила: Subspan (Подмассивы)
Вам нужно передать в функцию только часть вектора, например, со 2-го по 5-й элемент? Никаких итераторов и копирования:
⚠️ Важный нюанс:
💡 Итог: Если ваша функция принимает набор данных только для чтения или изменения элементов на месте, всегда используйте
#cpp #cpp20 #stdspan #optimization #memory #coding #tips
➡️ @cpp_geek
std::span)Помните, мы обсуждали
std::string_view - легковесное «окно» для строк? В C++20 у него появился старший брат для массивов и векторов - std::span.До C++20 у нас была классическая проблема. Допустим, вы пишете функцию, которая должна обработать список чисел.
🐢 Как мы писали раньше:
Вариант 1: Принимать
const std::vector<int>&.Минус: Функция теперь намертво привязана к
std::vector. Если у вас данные лежат в std::array или обычном си-массиве int arr[10], придется копировать их в вектор. Аллокации, тормоза.Вариант 2: Си-стайл (Указатель + размер).
Минус: Легко ошибиться с размером, потерять контекст, код выглядит грязно.
void ProcessOld(const int* data, size_t size) { /* ... */ }
🚀 Как мы пишем теперь (C++20):
#include <span>
// Принимаем любой непрерывный кусок памяти!
void ProcessNew(std::span<const int> data) {
for (int val : data) {
std::cout << val << " ";
}
}
👀 Что такое
std::span?Как и
string_view, это просто указатель на начало данных и их длина (обычно 16 байт). Он не владеет памятью, он только на нее смотрит.Магия в том, что
std::span умеет автоматически создаваться из чего угодно:
std::vector<int> vec = {1, 2, 3};
std::array<int, 3> arr = {4, 5, 6};
int raw[3] = {7, 8, 9};
// Одна функция работает со всеми типами контейнеров! Без копирования!
ProcessNew(vec);
ProcessNew(arr);
ProcessNew(raw);
✂️ Суперсила: Subspan (Подмассивы)
Вам нужно передать в функцию только часть вектора, например, со 2-го по 5-й элемент? Никаких итераторов и копирования:
// Передаем кусок вектора за O(1)
ProcessNew( std::span{vec}.subspan(1, 4) );
⚠️ Важный нюанс:
std::span не умеет изменять размер данных (никаких push_back). Но он может изменять сами элементы, если вы передадите std::span<int> (без const).💡 Итог: Если ваша функция принимает набор данных только для чтения или изменения элементов на месте, всегда используйте
std::span. Это золотой стандарт современного C++.#cpp #cpp20 #stdspan #optimization #memory #coding #tips
➡️ @cpp_geek
👍10🔥3❤2