3 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
size_t
是一種可以保存任何數(shù)組索引的類型。這意味著,邏輯上,size_t應(yīng)該能夠保存任何指針類型
不必要!回到分段16位架構(gòu)的時(shí)代,例如:一個(gè)陣列可能僅限于一個(gè)段(所以16位size_t
會(huì)這樣做)但是你可能有多個(gè)段(所以需要一個(gè)32位的intptr_t
類型來(lái)挑選細(xì)分及其內(nèi)部的偏移)。我知道這些事情聽(tīng)起來(lái)很奇怪,在這些日子里,統(tǒng)一可尋址的未分段架構(gòu),但標(biāo)準(zhǔn)必須提供比“2009年正常情況”更廣泛的品種,你知道! - )

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
關(guān)于你的陳述:
“C標(biāo)準(zhǔn)保證這
size_t
是一種可以保存任何數(shù)組索引的類型。這意味著,邏輯上,它size_t
應(yīng)該能夠保存任何指針類型?!?/p>
這實(shí)際上是一種謬誤(由于錯(cuò)誤的推理造成的誤解)(a)。你可能認(rèn)為后者是從前者開(kāi)始的,但事實(shí)并非如此。
指針和數(shù)組索引不是一回事。設(shè)想一個(gè)將數(shù)組限制為65536個(gè)元素的符合實(shí)現(xiàn)但允許指針將任何值尋址到一個(gè)巨大的128位地址空間中是非常合理的。
C99表示size_t
變量的上限由下定義,SIZE_MAX
并且可以低至65535(參見(jiàn)C99 TR3,7.18.3,在C11中不變)。如果在現(xiàn)代系統(tǒng)中將指針限制在此范圍內(nèi),則指針將相當(dāng)有限。
在實(shí)踐中,您可能會(huì)發(fā)現(xiàn)您的假設(shè)成立,但這不是因?yàn)闃?biāo)準(zhǔn)保證了它。因?yàn)樗鼘?shí)際上并不能保證它。
(a)順便說(shuō)一下,這不是某種形式的人身攻擊,只是說(shuō)明為什么你的陳述在批判性思維的背景下是錯(cuò)誤的。例如,以下推理也無(wú)效:
所有的小狗都很可愛(ài)。這件事很可愛(ài)。因此,這件事必須是一只小狗。
puppiess的可愛(ài)或其他方面在這里沒(méi)有任何影響,我所說(shuō)的只是兩個(gè)事實(shí)并不能得出結(jié)論,因?yàn)榍皟蓚€(gè)句子允許存在不是小狗的可愛(ài)東西。
這類似于你的第一個(gè)陳述,不一定強(qiáng)制要求第二個(gè)陳述。

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
我會(huì)讓所有其他答案代表片段限制,異國(guó)情調(diào)架構(gòu)等的推理。
名稱的簡(jiǎn)單差異是不是足以使用正確的類型來(lái)做正確的事情?
如果您要存儲(chǔ)尺寸,請(qǐng)使用size_t
。如果您要存儲(chǔ)指針,請(qǐng)使用intptr_t
。閱讀代碼的人會(huì)立即知道“啊哈,這是一個(gè)大小的東西,可能以字節(jié)為單位”,“哦,這里的指針值由于某種原因存儲(chǔ)為整數(shù)”。
否則,您可以使用unsigned long
(或者,在這些現(xiàn)代時(shí)代unsigned long long
),用于所有事情。大小不是一切,類型名稱帶有有用的含義,因?yàn)樗兄诿枋龀绦颉?/p>
- 3 回答
- 0 關(guān)注
- 569 瀏覽
添加回答
舉報(bào)