2012-05-17 809 views
34

除了每種類型可容納的值的大小之外,的用法size_toff_t之間的主要區別是什麼?這是否只是size_t類型用於絕對尺寸並且off_t類型用於補償的慣例?還是比這更深入?size_t和off_t之間的用法差異是什麼?

我正在寫一個包裝類來啓用使用mmap編寫大型文件,我想知道最佳類型將用於他們的參數。鑑於我想寫入大於4GB的文件,我很想使用size_t來處理所有事情,但這是否是最佳做法? (?或者我應該使用一些off64_t類型某些功能)

例如,要我writeAt函數聲明爲:

MMapWriter::writeAt(off64_t offset, const void* src, size_t size) 

MMapWriter::writeAt(size_t offset, const void* src, size_t size) 

回答

44

size_t爲對象,off_t是爲文件。

mmap合併兩個概念,幾乎是按照定義。我個人認爲我會使用size_t,因爲不管它是什麼,映射文件也是(虛擬)內存中的一個數組。

size_t是標準C++,off_t是Posix的,並off64_t是GNU擴展與所述功能fopen64ftello64等進入我認爲它應該總是在64位GNU系統相同類型off_t,但不要在沒有檢查的情況下賭你的公司。

它應該是相關的,off_t是有符號的,而size_t是無符號的。但與size_t簽署對應的是ptrdiff_t,所以當你需要一個簽名類型它並不意味着你應該使用off_toff64_t

+0

謝謝史蒂夫,這是一個很大的幫助。我想我還沒有完成「mmap」橋接這兩個概念的鏈接。 –

+0

很好的答案,但爲什麼在地獄做fread()和fwrite()採取'size_t'呢? –

+4

注意,還有ssize_t作爲size_t的已簽名對象。 – fuz

12

size_t是C++(和C)標準的一部分,指的是sizeof表達式的類型。 off_t由Posix標準定義,並且指的是文件的大小。

+0

因此使用'off_t'是不可移植的?或者C/C++標準本身堅持posix標準。 –

+3

@Als:Posix庫是C(和C++)標準的一組擴展。他們添加的內容是'off_t'和使用它的文件函數,比如'lseek'。所以不,C/C++不遵守Posix。無論如何,Posix是一個操作系統的規範,而不僅僅是一種編程語言:以及它包含的庫​​,例如shell和shell實用程序,這些都超出了C標準的範圍(如果你喜歡,Posix會選擇標準'系統'的定義會消失)。 –

+3

如果您已經在使用'mmap',也是一個Posix函數,那麼使用'off_t'是便攜式的。這是可移植的Posix代碼,它不是可移植的C++代碼。 –

相關問題