C++ geek
3.61K subscribers
277 photos
5 videos
28 links
Учим C/C++ на примерах
Download Telegram
🌉 Забудьте про передачу указателей и размеров! (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🔥32