42

除了每种类型可以容纳的值的大小之外,和之间的主要使用区别是什么?类型用于绝对大小而类型用于偏移量只是一种约定吗?还是比这更深?size_toff_tsize_toff_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)
4

3 回答 3

59

size_t用于对象,off_t用于文件。

mmap几乎按照定义合并了这两个概念。我个人认为我会使用size_t,因为无论它是什么,映射文件也是(虚拟)内存中的一个数组。

size_t是标准的 C++,off_t是 Posix,并且off64_t是一个 GNU 扩展,与函数fopen64,ftello64等一起使用。我认为它应该始终与 64 位 GNU 系统上的类型相同off_t,但不要在没有检查的情况下押注你的公司。

如果相关,off_t则已签名,size_t而未签名。但是签名对应的size_tptrdiff_t,所以当你需要一个签名类型时,它并不意味着你应该使用off_tor off64_t

于 2012-05-17T11:21:05.863 回答
13

size_t是 C++(和 C)标准的一部分,指的是sizeof表达式的类型。 off_t由 Posix 标准定义,指的是文件的大小。

于 2012-05-17T11:21:53.130 回答
0

这种情况的良好经验法则。使用任何导致您使用最少显式转换的函数签名,无论是 c 样式还是 c++ 样式。如果必须强制转换,c++ 风格更安全,因为它可以执行的强制转换类型受到更多限制。

这样做的好处是,如果您移植到类型不匹配的平台(无论是有符号、大小或字节序问题等),您应该在编译时而不是在运行时捕获大部分错误。铸造是将三角形物体挤压成圆孔的大锤方法(或多或少你告诉编译器保持安静,我知道我在做什么)。

试图在运行时找到铸造问题可能会很痛苦,因为它很难重现。最好在编译时而不是运行时发现问题。编译器是你的朋友。

于 2018-04-17T12:10:25.077 回答