intptr_t 其實(shí)不是指針類型最近在看nginx源碼,,看到有一個(gè)類型intptr_t,沒(méi)有見(jiàn)過(guò),,google了一下,,有人說(shuō)是指針類型,但是看nginx源碼中對(duì)該類型變量的使用,,好像不是指針類型,。 [cpp] view plaincopy
[cpp] view plaincopy
于是在linux的頭文件中查找這個(gè)類型的定義,在/usr/include/stdint.h這個(gè)頭文件中找到了這個(gè)類型的定義(不知道怎么在這里插入圖片,,所以使用文字):
[cpp] view plaincopy
很明顯intptr_t不是指針類型,,但是上邊的一句注釋(/* Types for `void *' pointers. */)讓人很疑惑。既然不是指針類型,,但是為什么說(shuō)類型是為了“void *”指針,? 又查了一下在《深入分析Linux內(nèi)核源碼》中找到了答案,原文描述如下: 盡管在混合不同數(shù)據(jù)類型時(shí)你必須小心, 有時(shí)有很好的理由這樣做. 一種情況是因?yàn)閮?nèi)存存取, 與內(nèi)核相關(guān)時(shí)是特殊的. 概念上, 盡管地址是指針, 內(nèi)存管理常常使用一個(gè)無(wú)符號(hào)的整數(shù)類型更好地完成; 內(nèi)核對(duì)待物理內(nèi)存如同一個(gè)大數(shù)組, 并且內(nèi)存地址只是一個(gè)數(shù)組索引. 進(jìn)一步地, 一個(gè)指針容易解引用; 當(dāng)直接處理內(nèi)存存取時(shí), 你幾乎從不想以這種方式解引用. 使用一個(gè)整數(shù)類型避免了這種解引用, 因此避免了 bug. 因此, 內(nèi)核中通常的內(nèi)存地址常常是 unsigned long, 利用了指針和長(zhǎng)整型一直是相同大小的這個(gè)事實(shí), 至少在 Linux 目前支持的所有平臺(tái)上. 因?yàn)槠渌档脑? C99 標(biāo)準(zhǔn)定義了 intptr_t 和 uintptr_t 類型給一個(gè)可以持有一個(gè)指針值的整型變量. 但是, 這些類型幾乎沒(méi)在 2.6 內(nèi)核中使用 |
|
來(lái)自: lifei_szdz > 《linux》