溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么使用span解決數(shù)組退化和越界訪問(wèn)

發(fā)布時(shí)間:2021-11-10 10:55:49 來(lái)源:億速云 閱讀:237 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)怎么使用span解決數(shù)組退化和越界訪問(wèn),小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

數(shù)組是C++從C語(yǔ)言繼承過(guò)來(lái)的特性,使用方便同時(shí)又可以提供絕佳的性能,因此被廣泛使用。但是簡(jiǎn)便的另一面就是風(fēng)險(xiǎn),其中最大的兩個(gè)問(wèn)題就是退化(array decay)和越界訪問(wèn)(range errors)。本如何提前使用C++20新特性span解決數(shù)組退化和越界訪問(wèn)的問(wèn)題。

首先看使用數(shù)組的最常見代碼:

int data[10];for (size_t i = 0; i < sizeof(data)/sizeof(data[0]); ++i) {    data[i] = 0;}

數(shù)組被定義時(shí),同時(shí)有個(gè)元素個(gè)數(shù)信息。使用這個(gè)信息可以對(duì)數(shù)組進(jìn)行操作。但是在將數(shù)組作為一個(gè)參數(shù)傳遞給某個(gè)函數(shù)時(shí),只能以指針形式傳遞,這就是數(shù)組退化。為了正確把握數(shù)組的大小一般需要同時(shí)傳遞數(shù)組的大小信息。例如下面的初始化函數(shù)就是如此:

void init_data(int buffer[], size_t size){  cout << "size=" << size << endl;  for (gsl::index i = 0; i < size; ++i) {    buffer[i] = i;  }  buffer[4] = 40;  buffer[20] = 20;  //越界訪問(wèn)}

即使聲明函數(shù)參數(shù)時(shí)形式上是數(shù)組,但所有的行為都和指針完全相同。還有一個(gè)問(wèn)題就是,由于數(shù)組是一種完全暴露的數(shù)據(jù)結(jié)構(gòu),沒有任何保護(hù)。例如代碼中第8行,即使訪問(wèn)的第20個(gè)元素已經(jīng)超過(guò)最初定義的10個(gè)元素,這種操作一般也會(huì)正常通過(guò)。但是接下來(lái)不知道哪個(gè)時(shí)刻,這個(gè)操作帶來(lái)的影響就會(huì)以一種完全不相關(guān)的形式表現(xiàn)出來(lái)。數(shù)組大小信息獲取,傳遞錯(cuò)誤和越界操作具有引入容易、排查困難的特種,是許多程序員的噩夢(mèng)。

為了解決這個(gè)問(wèn)題,GSL引入了一個(gè)模板類span,它可以同時(shí)管理數(shù)組的地址和大小。這個(gè)類將從C++20開始成為C++的標(biāo)準(zhǔn)功能。

使用了span類的初始化函數(shù)如下:

void init_data(gsl::span<int> buffer){    cout << "size=" << buffer.size() << endl;    int value = 0;    for (auto it = buffer.begin(); it != buffer.end(); it++) {        *it = value++;    }    buffer[4] = 10;    buffer[20] = 20; //會(huì)觸發(fā)斷言}

只要函數(shù)參數(shù)聲明為:gsl::span<int> buffer,大小信息就會(huì)由span模板類管理,接下來(lái)就可以像vector一樣使用數(shù)組了。如果發(fā)生越界訪問(wèn),會(huì)觸發(fā)斷言。

使用數(shù)組和span傳遞參數(shù)的示例代碼如下:

int main(){    int data[10];    for (size_t i = 0; i < sizeof(data)/sizeof(data[0]); ++i) {        data[i] = 0;    }    //使用數(shù)組傳遞參數(shù)    init_data(data, 5);    //使用span傳遞參數(shù)    init_data(data);    return 0;}

和使用數(shù)組的調(diào)用相比,增強(qiáng)功能(范圍檢查等)的同時(shí)還簡(jiǎn)化了數(shù)組的用法!

以上就是怎么使用span解決數(shù)組退化和越界訪問(wèn),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI