Limiti e subspan
Suddividere gli span in sicurezza
Limiti e subspan è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Suddivisione con subspan
s.subspan(offset, count) restituisce uno span su una parte dell'originale, senza copie: crea solo un nuovo puntatore e una nuova lunghezza.
#include <iostream>
#include <span>
int main() {
int buf[] = {0, 1, 2, 3, 4};
std::span<int> s(buf, 5);
auto mid = s.subspan(1, 3);
for (int x : mid) std::cout << x << " ";
std::cout << "\n"; // 1 2 3
}first e last
first(n) e last(n) forniscono span sugli n elementi iniziali o finali.
#include <iostream>
#include <span>
int main() {
int buf[] = {10, 20, 30, 40};
std::span<int> s(buf, 4);
auto f = s.first(2);
auto l = s.last(2);
std::cout << f[0] << " " << l[1] << "\n"; // 10 40
}I subspan condividono la memoria
Modificare un subspan modifica i dati originali, perché entrambi puntano allo stesso buffer.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 1, 1, 1};
std::span<int> s(buf, 4);
auto tail = s.last(2);
tail[0] = 99;
std::cout << buf[2] << "\n"; // 99
}size_bytes
size_bytes() restituisce la dimensione totale in byte degli elementi dello span, una funzione utile per l'I/O a basso livello.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3};
std::span<int> s(buf, 3);
std::cout << s.size_bytes() << "\n"; // 3 * sizeof(int)
}I limiti sono una Sua responsabilità
operator[] su uno span non controlla i limiti. Leggere s[s.size()] costituisce un comportamento indefinito.
Controllare prima di suddividere
Chiamare subspan con un offset o un conteggio maggiore della dimensione dello span produce un comportamento indefinito: verifichi prima rispetto a size().
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3};
std::span<int> s(buf, 3);
size_t off = 1, cnt = 2;
if (off + cnt <= s.size()) {
auto sub = s.subspan(off, cnt);
std::cout << sub.size() << "\n";
}
}Vuoto dopo la suddivisione
La suddivisione può produrre uno span vuoto, ad esempio first(0); lo gestisca come qualsiasi intervallo vuoto.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2};
std::span<int> s(buf, 2);
auto e = s.first(0);
std::cout << e.empty() << "\n"; // 1
}Concatenare le suddivisioni
È possibile suddividere ulteriormente i subspan, poiché ciascuno è semplicemente un'altra vista sul buffer originale.
#include <iostream>
#include <span>
int main() {
int buf[] = {0, 1, 2, 3, 4, 5};
std::span<int> s(buf, 6);
auto inner = s.subspan(1, 4).first(2);
std::cout << inner[0] << " " << inner[1] << "\n"; // 1 2
}Elaborazione a blocchi
Un uso comune di subspan consiste nell'iterare su un buffer di grandi dimensioni mediante finestre di dimensione fissa, per lo streaming o l'elaborazione in batch.
#include <iostream>
#include <span>
int main() {
int buf[] = {1, 2, 3, 4, 5, 6};
std::span<int> s(buf, 6);
for (size_t i = 0; i < s.size(); i += 2) {
auto chunk = s.subspan(i, 2);
std::cout << "[" << chunk[0] << "," << chunk[1] << "] ";
}
std::cout << "\n";
}Controlli sull'estensione statica
Con uno span a estensione statica, il compilatore può verificare in fase di compilazione alcune dimensioni delle suddivisioni, rilevando prima gli errori.
La durata di vita resta importante
Ogni subspan condivide la durata di vita del buffer originale. Se la sorgente viene distrutta o riallocata, tutti gli span derivati diventano non validi.
Verifica rapida
Verifichi la comprensione dei subspan e dei limiti.
Riepilogo
Ha appreso i limiti e i subspan:
subspan,firstelastcreano suddivisioni senza allocazioni;- i subspan condividono la memoria, quindi le modifiche si riflettono sull'originale;
operator[]e le suddivisioni non controllano i limiti: verifichi prima;- tutti i subspan condividono la durata di vita della sorgente.
Domande Frequenti
La lezione «Limiti e subspan» è gratuita?
Sì — il testo completo di «Limiti e subspan» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Limiti e subspan»?
Suddividere gli span in sicurezza Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Limiti e subspan»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- std::array a dimensione fissa
- Nozioni di base su std::span
- Passare gli span alle funzioni
- Limiti e subspan