亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  size_t 這個類型的意義是什么?

size_t 這個類型的意義是什么?

時間:2024-02-12


大家好,我是程序喵。



在知乎上看到一個好問題,精選了三個優質回答,分享給大家!


類型名稱不直觀,從size_t這個名字很難理解它的用處,使用時候還要特別留意是unsigned類型,而且在數數的時候可以用int或者unsigned 代替。這種類型的優勢在哪里?


1


學過計算機組成原理應該不會對此有疑問。int小于等于數據線寬度,size_t大于等于地址線寬度。


size_t存在的最大原因可能是因為:地址線寬度歷史中經常都是大于數據線寬度的。


在數據只有8位的年代,地址率先進入10位,12位,在數據16位的年代,地址也已經進入了20位,24位。


目前的int普遍是32位,而size_t在主流平臺中都是64位。


size_t為什么存在?因為無論int還是unsigned都很可能小于size_t需要的大小,所以必須有個size_t。

補充:據說題主對_t有疑惑。


這個問題很簡單,僅僅是因為作者選擇這樣的命名作為編碼規范而已。類型名與變量名共享相同的命名空間,所以通常需要在命名方面刻意區分出來。


在遙遠的 C 時代,發明者很可能是想建議所有的類型名后面加_t,只不過這并沒有成為更普遍的編碼規范罷了。而現今Java的規范倒比較容易讓人接受:大寫開頭的是類型名,小寫開頭的是變量名跟函數名,雖然具體細則有不同,但原意都是一樣的:變量與類型共享同一個命名空間,因而需要在命名規則上刻意區分開來。


作者:pansz
https://www.zhihu.com/question/24773728/answer/210659978


2


之前在《內存拷貝的注意事項》一文中提到過size_t,可能許多人對這個類型不太熟悉沒有用過或者根本不敢去用,最近看到一篇文章對這個類型講的比較詳細,便翻譯過來讓不熟悉的同學可以知道它產生的原因以及如何使用。


原文地址:Why size_t matters(https://link.zhihu.com/?target=http%3A//web.archive.org/web/20101209143037/http%3A//www.eetimes.com/discussion/programming-pointers/4026076/Why-size-t-matters%3F)
  

前言:使用size_t可能會提高代碼的可移植性、有效性或者可讀性,或許同時提高這三者。
  

在標準C庫中的許多函數使用的參數或者返回值都是表示的用字節表示的對象大小,比如說malloc(n)
函數的參數n指明了需要申請的空間大小,還有memcpy(s1, s2,n)的最后一個參數,表明需要復制的內存大小,strlen(s)函數的返回值表明了以’\0’結尾的字符串的長度(不包括’\0’),其返回值并不是該字符串的實際長度,因為要去掉’\0’。

或許你會認為這些參數或者返回值應該被申明為int類型(或者long或者unsigned),但是事實上并不是。C標準中將他們定義為size_t。標準中記載malloc的申明應該出現在,定義為:

void *malloc(size_t n);
memcpy和strlen的申明應該出現在中:
void *memcpy(void *s1, void const *s2, size_t n);size_t strlen(char const *s)

size_t還經常出現在C++標準庫中,此外,C++庫中經常會使用一個相似的類型size_type,用的可能比size_t還要多。

據我所知,大部分的C和C++程序員害怕這些庫使用size_t,因為他們不知道size_t代表什么或者為什么這些庫需要使用它,歸根結底,原因在于他們什么時候什么地方需要用到它。


可移植性問題


早期的C語言(由Brian Kernighan 和 Dennis Ritchie 在The C Programming Language書中所寫,Prentice-Hall, 1978)并沒有提供size_t類型,C標準委員會為了解決移植性問題將size_t引入,舉例如下:

讓我們來寫一個可移植的標準memcpy函數,我們將會看到一些不同的申明和它們在不同平臺不同大小的地址空間上編譯下的情況。

回憶memcpy(s1,s2,n)函數,它將s2指向地址開始的n個字節拷貝到s2指向的地址,返回s1,這個函數可以拷貝任何數據類型,所以參數和返回值的類型應該為可以指向任何類型的void*,同時,源地址不應該被改變,所以第二個參數s2類型應該為const void*,這些都不是問題。

真正的問題在于我們如何申明第三個參數,它代表了源對象的大小,我相信大部分程序員都會選擇int:

void *memcpy(void *s1, void const *s2, int n);

使用int類型在大部分情況下都是可以的,但是并不是所有情況下都可以。int是有符號的,它可以表示負數,但是,大小不可能是復數。所以我們可以使用unsigned int代替它讓第三個參數表示的范圍更大。

在大部分機器上,unsigned int的最大值要比int的最大值大兩倍,比如說再也給16位的機器上,unsigned int的最大值為65535,int的最大值為32767。

盡管int類型的大小依賴于C編譯器的實現,但是在給定的平臺上int對象的大小和unsigned int對象的大小是一樣的。因此,使用unsigned int修飾第三個參數的代價與int是相同的:

void *memcpy(void *s1, void const *s2, unsigned int n);

這樣似乎沒有問題了,unsigned int可以表示最大類型的對象大小了,這種情況只有在整形和指針類型具有相同大小的情況下,比如說在IP16中,整形和指針都占2個字節(16位),而在IP32上面,整形和指針都占4個字節(32位)。(參見下面C數據模型表示法)


C數據模型表示法


最近,我偶然發現幾篇文章,他們使用簡明的標記來表述不同目標平臺下c語言數據的實現。我還沒有找到這個標記的來源,正式的語法,甚至連名字都沒有,但他似乎很簡單,即使沒有正規的定義也可以很容易使用起來。這些標記的一邊形式形如:


I nI L nL LL nLL P nP。 


其中每個大寫字母(或成對出現)代表一個C的數據類型,每一個對應的n是這個類型包含的位數。I代表int,L代表long,LL代表long long,以及P代表指針(指向數據,而不是函數)。每個字母和數字都是可選的。 

 
例如,I16P32架構支持16位int和32位指針類型,沒有指明是否支持long或者long long。如果兩個連續的類型具有相同的大小,通常省略第一個數字。例如,你可以將I16L32P32寫為I16LP32,這是一個支持16位int,32位long,和32位指針的架構。 


標記通常把字母分類在一起,所以可以按照其對應的數字升序排列。例如,IL32LL64P32表示支持32位int,32位long,64位long long和32位指針的架構;然而,通常寫作ILP32LL64。 

不幸的是,這種memcpy的申明在I16LP32架構上(整形是16-bit

 
長整形和指針類型時32-bits)顯得不夠用了,比如說摩托羅拉第一代處理器68000,在這種情況下,處理器可能拷貝的數據大于65535個字節,但是這個函數第三個參數n不能處理這么大的數據。

什么?你說很容易就可以改正?只需要把memcpy的第三個參數的類型修改一下:

void *memcpy(void *s1, void const *s2, unsigned long  n);

你可以在I16LP32目標架構上使用這個函數了,它可以處理更大的數據。而且在IP16和IP32平臺上效果也還行,說明它確實給出了memcpy的一種移植性較好的申明。但是,在IP16平臺上相比于使用unsigned int,你使用unsigned long可能會使你的代碼運行效率大打折扣(代碼量變大而且運行變慢)。

在標準C中規定,長整形(無論無符號或者有符號)至少占用32位,因此在IP16平臺上支持標準C的話,那么它一定是IP16L32平臺。這些平臺通常使用一對16位的字來實現32位的長整形。在這種情況下,移動一個長整形需要兩條機器指令,每條移動一個16位的塊。事實上,這個平臺上的大部分的32位操作都需要至上兩條指令。

因此,以可移植性為名將memcpy的第三個參數申明為unsigned long而降低某些平臺的性能是我們所不希望看到的。使用size_t可以有效避免這種情況。

size_t類型是一個類型定義,通常將一些無符號的整形定義為size_t,比如說unsigned int或者unsigned long,甚至unsigned long long。每一個標準C實現應該選擇足夠大的無符號整形來代表該平臺上最大可能出現的對象大小。


使用size_t

size_t的定義在<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>和<wchar.h>這些標準C頭文件中,也出現在相應的C++頭文件, 等等中,你應該在你的頭文件中至少包含一個這樣的頭文件在使用size_t之前。   


包含以上任何C頭文件(由C或C++編譯的程序)表明將size_t作為全局關鍵字。包含以上任何C++頭文件(當你只能在C++中做某種操作時)表明將size_t作為std命名空間的成員。


根據定義,size_t是sizeof關鍵字(注:sizeof是關鍵字,并非運算符)運算結果的類型。所以,應當通過適當的方式聲明n來完成賦值:


n = sizeof(thing);


考慮到可移植性和程序效率,n應該被申明為size_t類型。類似的,下面的foo函數的參數也應當被申明為sizeof:


foo(sizeof(thing));


參數中帶有size_t的函數通常會含有局部變量用來對數組的大小或者索引進行計算,在這種情況下,size_t是個不錯的選擇。

適當地使用size_t還會使你的代碼變得如同自帶文檔。當你看到一個對象聲明為size_t類型,你馬上就知道它代表字節大小或數組索引,而不是錯誤代碼或者是一個普通的算術值。  


作者:盛夏光年https://www.zhihu.com/question/24773728/answer/66535663



3


ize_t和unsigned int有所不同,size_t的取值range是目標平臺下最大可能的數組尺寸,一些平臺下size_t的范圍小于int的正數范圍,又或者大于unsigned int.


最典型的,在x64下,int還是4,但size_t是8.這意味著你在x64下最大可能開辟的數組尺寸是2^64.如果你使用int或者unsigned int,那么在x64下如果你的代碼中全部使用uint作為數組的尺寸標記,那么你就會失去控制2^32尺寸以上的數組的機會.雖然現在在x64上開辟一個大于2^32大小的連續數組依然是個不大可能的事情,但是..........


“640K內存對于任何人來說都足夠了”----比爾蓋茨



作者:KE meng
https://www.zhihu.com/question/24773728/answer/28920149


C++學習資料免費獲取方法:關注程序喵大人,后臺回復“程序喵”即可免費獲取40萬字C++進階獨家學習資料。





往期推薦


1、少寫點
if-else吧,它的效率有多低你知道嗎?
2、年度原創好文匯總
3、全網首發!!C++20新特性全在這一張圖里了
4
他來了,他來了,C+
+17新特性精華都在這了
5、一文讓你搞懂設計模式
6、C++11新特性,所有知識點都在這了!


亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲老板91色精品久久| 香蕉久久一区二区不卡无毒影院 | 久久免费99精品久久久久久| 国产精品国产三级国产专播精品人 | 欧美性做爰毛片| 亚洲在线视频免费观看| 国产精品久久久久久久久搜平片 | 国产一区二区三区在线观看免费视频 | 国产毛片精品国产一区二区三区| 日韩午夜中文字幕| 欧美深夜福利| 欧美一区二区成人| 亚洲第一色在线| 欧美日韩亚洲一区二区三区| 亚洲一区二区三区影院| 在线国产亚洲欧美| 欧美四级电影网站| 美女精品国产| 亚洲视频你懂的| 亚洲第一网站| 国产麻豆91精品| 欧美日韩国产成人| 久久婷婷蜜乳一本欲蜜臀| 好吊视频一区二区三区四区 | 99精品热视频只有精品10| 国产精品v亚洲精品v日韩精品 | 国产精品久久久久久福利一牛影视| 国产一区二区三区在线免费观看| 亚洲精品乱码久久久久久按摩观| 国产精品久久国产精品99gif | 久久国产精品一区二区| 亚洲一级在线观看| 亚洲午夜高清视频| 一区二区三区精品视频在线观看| 亚洲区第一页| 在线视频亚洲| 午夜精品一区二区三区四区| 亚洲一区免费观看| 欧美在线视频a| 欧美va亚洲va国产综合| 久久亚洲午夜电影| 欧美黑人一区二区三区| 欧美三级电影大全| 国产视频观看一区| 亚洲美女在线看| 小黄鸭精品aⅴ导航网站入口| 久久尤物电影视频在线观看| 女同性一区二区三区人了人一| 欧美精品日韩精品| 国产精品日本欧美一区二区三区| 国产精品久久久久久久久久三级| 国产日韩精品久久久| 亚洲国产婷婷香蕉久久久久久| 99精品国产在热久久| 久久久国产精品一区| 欧美日韩免费观看一区二区三区| 欧美激情一区二区三区全黄| 国产精品v日韩精品| 亚洲国产日韩欧美在线99| 亚洲女同在线| 欧美偷拍另类| 亚洲一区欧美激情| 欧美三区免费完整视频在线观看| 精品999久久久| 亚洲综合精品自拍| 国产精品国产三级国产aⅴ9色| 樱花yy私人影院亚洲| 久久精彩免费视频| 国产精品亚洲一区二区三区在线| 欧美黄色免费网站| 亚洲乱码国产乱码精品精| 亚洲欧美日韩综合aⅴ视频| 亚洲无人区一区| 亚洲欧美国产77777| 欧美极品在线播放| 在线精品视频免费观看| 一区二区三区偷拍| 国产精品高潮呻吟久久av黑人| 国产精品亚洲成人| 亚洲一区二区三区精品在线| 亚洲主播在线| 能在线观看的日韩av| 在线电影院国产精品| 国产精品v欧美精品v日韩精品| 亚洲精品久久久久| 欧美精品啪啪| 亚洲一区二区视频在线| 国产精品日韩欧美一区二区| 欧美日韩网站| 亚洲国产精品久久久久婷婷老年| 一本到高清视频免费精品| 欧美在线视频一区二区| 伊人成综合网伊人222| 欧美自拍偷拍午夜视频| 欧美日韩一区三区四区| 国产精品国产成人国产三级| 欧美日韩国产影片| 欧美有码在线视频| 国内精品久久久久影院色| 牛夜精品久久久久久久99黑人| 狠狠色综合一区二区| 欧美性色综合| 日韩一区二区精品在线观看| 在线综合视频| 午夜精品久久久久久久久| 夜夜夜久久久| 国产精品性做久久久久久| 激情亚洲一区二区三区四区| 欧美精品一区二区三区一线天视频| 欧美午夜激情在线| 在线看日韩av| 欧美精品一区二区三区四区| 日韩午夜电影| 欧美高清视频www夜色资源网| 国产视频观看一区| 久久久综合网| 欧美在线视频在线播放完整版免费观看| 国产亚洲欧美色| 国产精品二区三区四区| 欧美国产免费| 欧美日韩在线视频一区二区| 欧美久久久久久蜜桃| 六十路精品视频| 欧美激情女人20p| 欧美午夜精品久久久久久人妖| 欧美福利视频在线| 免费在线欧美黄色| 欧美精品1区2区3区| 欧美+亚洲+精品+三区| 麻豆精品传媒视频| 欧美国产精品专区| 欧美午夜精品电影| 激情久久影院| 99热免费精品在线观看| 久久都是精品| 精品1区2区| 亚洲啪啪91| 久久av二区| 欧美深夜福利| 亚洲精品一区久久久久久| 欧美在线不卡| 国产精品久久久久久超碰| 亚洲国产成人av| 国产精品99久久久久久人| 国产精品嫩草久久久久| 亚洲精品一区二区三区99| 在线不卡欧美| 欧美淫片网站| 国产精品一区视频网站| 最新国产精品拍自在线播放| 中文精品99久久国产香蕉| 老司机久久99久久精品播放免费| 国产精品国产三级国产普通话99| 韩国av一区| 久久精品国产成人| 狠狠色狠狠色综合人人| 欧美中文字幕在线视频| 国产亚洲一区二区三区在线播放| 香蕉成人伊视频在线观看| 国产精品美女久久久| 夜夜嗨av一区二区三区 | 老鸭窝毛片一区二区三区| 国产精品免费一区豆花| 久久久久一区二区三区| 黑人巨大精品欧美黑白配亚洲| 欧美在线视频免费播放| 一区二区三区亚洲| 韩国一区二区三区在线观看| 这里只有精品视频在线| 欧美国产一区二区| 99视频有精品| 国产真实精品久久二三区| 免费观看在线综合色| 夜夜嗨av一区二区三区四区| 国产精品久久久久久久久借妻 | 亚洲免费观看| 国产精品每日更新在线播放网址| 亚洲五月六月| 亚洲黄色精品| 国产一区二区你懂的| 欧美91精品| 久久成人免费视频| 一区二区日韩| 亚洲精品一区二区网址| 国产亚洲一区二区三区| 国产精品丝袜久久久久久app| 蜜臀av性久久久久蜜臀aⅴ| 欧美一区二区三区在线观看| 一本大道av伊人久久综合| 亚洲韩日在线| 亚洲人成亚洲人成在线观看| 有坂深雪在线一区| 一区二区在线视频播放| 国产一区二区丝袜高跟鞋图片| 国产伦精品一区二区三| 国产精品久久久久9999| 国产精品超碰97尤物18| 欧美日韩国产综合视频在线观看中文| 久久久亚洲综合| 欧美大片在线观看|