最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C 語(yǔ)言restrict 關(guān)鍵字的使用淺談

 更新時(shí)間:2013年04月16日 10:44:35   作者:  
C 語(yǔ)言restrict 關(guān)鍵字的使用淺談,需要的朋友可以參考一下

C99中新增加了restrict修飾的指針:

由restrict修飾的指針是最初唯一對(duì)指針?biāo)赶虻膶?duì)象進(jìn)行存取的方法,
僅當(dāng)?shù)诙€(gè)指針基于第一個(gè)時(shí),才能對(duì)對(duì)象進(jìn)行存取。
對(duì)對(duì)象的存取都限定于基于由restrict修飾的指針表達(dá)式中。

由restrict修飾的指針主要用于函數(shù)形參,或指向由malloc()分配的內(nèi)存空間。
restrict數(shù)據(jù)類型不改變程序的語(yǔ)義。
編譯器能通過(guò)作出restrict修飾的指針是存取對(duì)象的唯一方法的假設(shè),更好地優(yōu)化某些類型的例程。


restrict是c99標(biāo)準(zhǔn)引入的,它只可以用于限定和約束指針,
并表明指針是訪問(wèn)一個(gè)數(shù)據(jù)對(duì)象的唯一且初始的方式.
即它告訴編譯器,所有修改該指針?biāo)赶騼?nèi)存中內(nèi)容的操作都必須通過(guò)該指針來(lái)修改,
而不能通過(guò)其它途徑(其它變量或指針)來(lái)修改;這樣做的好處是,
能幫助編譯器進(jìn)行更好的優(yōu)化代碼,生成更有效率的匯編代碼.如

int *restrict ptr,

ptr 指向的內(nèi)存單元只能被 ptr 訪問(wèn)到,任何同樣指向這個(gè)內(nèi)存單元的其他指針都是未定義的,
直白點(diǎn)就是無(wú)效指針。

restrict 的出現(xiàn)是因?yàn)?C 語(yǔ)言本身固有的缺陷,
C 程序員應(yīng)當(dāng)主動(dòng)地規(guī)避這個(gè)缺陷,而編譯器也會(huì)很配合地優(yōu)化你的代碼.

例子 :

復(fù)制代碼 代碼如下:

int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;
for(n=0;n<10;n++)
{
    par[n]+=5;
    restar[n]+=5;
    ar[n]*=2;
    par[n]+=3;
    restar[n]+=3;
}

因?yàn)閞estar是訪問(wèn)分配的內(nèi)存的唯一且初始的方式,那么編譯器可以將上述對(duì)restar的操作進(jìn)行優(yōu)化:
restar[n]+=8;


而par并不是訪問(wèn)數(shù)組ar的唯一方式,因此并不能進(jìn)行下面的優(yōu)化:
par[n]+=8;


因?yàn)樵趐ar[n]+=3前,ar[n]*=2進(jìn)行了改變。
使用了關(guān)鍵字restrict,編譯器就可以放心地進(jìn)行優(yōu)化了。

關(guān)鍵字restrict有兩個(gè)讀者。
一個(gè)是編譯器,它告訴編譯器可以自由地做一些有關(guān)優(yōu)化的假定。
另一個(gè)讀者是用戶,他告訴用戶僅使用滿足restrict要求的參數(shù)。

一般,編譯器無(wú)法檢查您是否遵循了這一限制,如果您蔑視它也就是在讓自己冒險(xiǎn)。
To help the compiler determine memory dependencies,
you can qualify a pointer, reference, or array
with the restrict keyword.
The restrict keyword is a type qualifier that may be
applied to pointers, references, and arrays.
Its use represents a guarantee by the programmer
that within the scope of the pointer declaration
the object pointed to can be accessed only by that pointer.

Any violation of this guarantee renders the program undefined.
This practice helps the compiler optimize certain sections of code
because aliasing information can be more easily determined.

 

Use of the restrict type qualifier with pointers

復(fù)制代碼 代碼如下:

void func1(int * restrict a, int * restrict b)
{
  /* func1's code here */
}

In the example that follows, the restrict keyword is
used to tell the compiler that the function func1 is
never called with the pointers a and b pointing
to objects that overlap in memory.
You are promising that accesses through a and b
will never conflict; this means that a write through one pointer
cannot affect a read from any other pointer.
The precise semantics of the restrict keyword are
described in the 1999 version of the ISO C standard.

Use of the restrict type qualifier with arrays

復(fù)制代碼 代碼如下:

void func2(int c[restrict], int d[restrict])
{
  int i;

  for(i = 0; i < 64; i++)
  {
    c[i] += d[i];
    d[i] += 1;
  }
}


This example illustrates using the restrict keyword when passing arrays to a function.
Here, the arrays c and d should not overlap, nor should c and d point to the same array.

相關(guān)文章

  • C++多態(tài)的示例詳解

    C++多態(tài)的示例詳解

    多態(tài)按字面的意思就是多種形態(tài)。當(dāng)類之間存在層次結(jié)構(gòu),并且類之間是通過(guò)繼承關(guān)聯(lián)時(shí),就會(huì)用到多態(tài)。本文將通過(guò)三個(gè)小案例讓大家更深入的了解一下C++的多態(tài),感興趣的可以了解一下
    2022-06-06
  • QT5中使用SQLite的實(shí)現(xiàn)方法

    QT5中使用SQLite的實(shí)現(xiàn)方法

    SQLite是一款開源輕量級(jí)的數(shù)據(jù)庫(kù)軟件,本文主要介紹了QT5中使用SQLite的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • epoll封裝reactor原理剖析示例詳解

    epoll封裝reactor原理剖析示例詳解

    這篇文章主要為大家介紹了epoll封裝reactor原理剖析示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • VS中PCL庫(kù)附加依賴項(xiàng)配置過(guò)程解析

    VS中PCL庫(kù)附加依賴項(xiàng)配置過(guò)程解析

    這篇文章主要介紹了VS中PCL庫(kù)附加依賴項(xiàng)配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 詳解C++如何高效利用CPU緩存

    詳解C++如何高效利用CPU緩存

    高效利用CPU緩存是編寫高性能C++代碼的關(guān)鍵之一,所以這篇文章小編主要來(lái)和大家介紹一下C++如何實(shí)現(xiàn)高效利用CPU緩存,需要的可以參考一下
    2024-02-02
  • C++11基于范圍的for循環(huán)代碼示例

    C++11基于范圍的for循環(huán)代碼示例

    這篇文章主要給大家介紹了關(guān)于C++11基于范圍的for循環(huán)的相關(guān)資料,范圍for循環(huán)(也稱為C++11的基于范圍的for循環(huán))是一種簡(jiǎn)化迭代容器(如數(shù)組、向量、列表等)元素的方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 盤點(diǎn)分析C語(yǔ)言中少見卻強(qiáng)大的字符串函數(shù)

    盤點(diǎn)分析C語(yǔ)言中少見卻強(qiáng)大的字符串函數(shù)

    這篇文章主要為大家盤點(diǎn)及分析C語(yǔ)言中少見卻強(qiáng)大的字符串函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解單鏈表

    C++?數(shù)據(jù)結(jié)構(gòu)超詳細(xì)講解單鏈表

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來(lái)存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來(lái)存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容
    2022-03-03
  • C,C++中常用的操作字符串的函數(shù)

    C,C++中常用的操作字符串的函數(shù)

    這篇文章主要介紹了C,C++中常用的操作字符串的函數(shù),需要的朋友可以參考下
    2017-09-09
  • Qt使用QCamera實(shí)現(xiàn)切換相機(jī),分辨率和圖像捕獲功能

    Qt使用QCamera實(shí)現(xiàn)切換相機(jī),分辨率和圖像捕獲功能

    這篇文章主要為大家介紹了如何利用Qt中的相機(jī)類QCamera,取景器類QCameraViewfinder,圖像捕獲類QCameraImageCapture實(shí)現(xiàn)切換相機(jī)、分辨率和圖像捕獲功能,需要的可以了解一下
    2023-04-04

最新評(píng)論

育儿| 万年县| 金川县| 凤翔县| 兴化市| 孝感市| 安阳市| 兴国县| 静乐县| 库车县| 永平县| 金川县| 胶南市| 绥芬河市| 信阳市| 龙川县| 祁东县| 东乡县| 商城县| 阿瓦提县| 乌拉特前旗| 扬州市| 伊宁市| 西林县| 额济纳旗| 灵台县| 泸水县| 吉林省| 三台县| 平乡县| 大悟县| 图木舒克市| 肃南| 平度市| 上思县| 阿勒泰市| 长沙县| 柏乡县| 安溪县| 洞头县| 临泽县|