今天突然想起來幾個問題,在程式執行起來時,存在一些限制:
1,陣列的長度(成員的個數)存在限制!(陣列定義的空間大小)
2,乙個程序裡開啟的檔案數。
3,乙個檔案的名字的長度。
4,乙個程序裡建立執行緒的個數。
陣列的長度(成員的個數)存在限制!
巨集觀上的限制因素:
首先,如果要確定乙個陣列的最大長度,我們需要知道它的資料型別,因此,陣列的資料型別是其中乙個限制因素。因為不同資料型別的元素大小不同。很顯然(我們假設int
為4位元組,char
為1位元組),資料型別為char
的陣列的最大長度是型別為int
的陣列的4倍。
另外,我們不難想到,大小(size)的資料型別,也就是陣列下標的資料型別,其實也是乙個限制因素。在c/c++中,陣列下標的型別是std::size_t
,因此陣列的大小首先不能超過size_t
所能表示的大小。這個資料型別是在庫檔案stdio.h
中通過typedef
宣告的,對於32位程式它被定義為unsighed int
,對於64位程式定義為unsigned long
。前者能表示的最大大小為2^32-1,後者為2^64-1。
微觀上的限制因素:
函式內申請的變數,陣列,是在棧(stack)中申請的一段連續的空間。棧的預設大小為2m或1m,開的比較小。
全域性變數,全域性陣列,靜態陣列(static)則是開在全域性區(靜態區)(static)。大小為2g,所以能夠開的很大。
而malloc、new出的空間,則是開在堆(heap)的一段不連續的空間。理論上則是硬碟大小。
乙個程序裡開啟的檔案數
這個一般都是1024。linux上使用命令ulimit -n可以檢視。
乙個檔案的名字的長度
在x86_64 linux下,檔名的最大長度是255個字元(characters),檔案路徑的最大長度是4096字元(characters)。
乙個程序裡建立執行緒的個數
可以用ulimit -s命令來檢視大小(一般常見的有10m或者是8m)。我們還知道,乙個程序的虛擬記憶體是4g,在linux32位平台下,核心分走了1g,留給使用者用的只有3g,於是我們可以想到,建立乙個執行緒占有了10m記憶體,總共有3g記憶體可以使用。於是可想而知,最多可以建立差不多300個左右的執行緒。
注:ulimit -a 檢視程式中的所有限制
Mysql的一些限制
最近工作中需要用到mysql,碰到一些問題,ps 我用的5.1 1 mysql建立view的時候不支援裡面有巢狀查詢。會報這個錯誤 mysql 1349 view s select contains a subquery in the from clause 錯誤,所以建立查詢的時候請盡量避免 se...
GAE 的一些限制
但是,也不可避免的新增了不少的限制。除了一些檔案大小,資料庫 blob大小的限制之外,還有些非常理的限制。今天碰到的就是乙個 原來沒想到的限制。最開始使用乙個 static 變數來儲存一些快取資料,例如資料的count之類的。後來發現這個快取根本沒有起作用。於是懷疑static 變數無效,搜尋了一下...
Linux下管道使用的一些限制
在書上和網上翻了翻,管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。linux管道分為無名管道和命名管道。一 無名管道pipe 無名管道具有以下特點 1 只能用於具有血緣關係的程序之間,可用於...