除了每种类型可以容纳的值的大小之外,size_t
和off_t
在用法上的主要区别是什么?size_t
类型用于绝对大小,off_t
类型用于偏移量,这只是一种约定吗?还是比这更深?
我正在编写一个 Package 器类,以便使用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条答案
按热度按时间kq0g1dla1#
size_t
用于对象,off_t
用于文件。mmap
基本上按照定义合并了这两个概念。我个人认为我会使用size_t
,因为不管它是什么,Map文件也是(虚拟)内存中的数组。size_t
是标准的C++,off_t
是Posix,off64_t
是一个GNU扩展,与函数fopen64
,ftello64
等一起使用。我 * 认为 * 它应该总是与64位GNU系统上的off_t
相同的类型,但是不要在没有检查的情况下就把你的公司押在上面。如果相关,
off_t
是有符号的,而size_t
是无符号的。但是,与size_t
对应的有符号类型是ptrdiff_t
,所以当你需要一个有符号类型时,并不意味着你应该使用off_t
或off64_t
。ogsagwnx2#
size_t
是C++(和C)标准的一部分,引用sizeof
表达式的类型。off_t
由Posix标准定义,指的是文件的大小。xe55xuns3#
这是一个很好的经验法则。使用任何函数签名,使您使用最少的显式转换,无论是c风格还是c风格。如果你必须强制转换,c风格更安全,因为它在可以执行的强制转换类型方面更受限制。
这样做的好处是,如果您移植到一个类型不匹配的平台(无论是签名、大小还是字节序问题等)。),您应该在编译时捕获大多数bug,而不是在运行时。铸造是一种大锤式的方法,可以将一个三角形的对象挤压到一个圆孔中(或多或少你会告诉编译器保持安静,我知道我在做什么)。
试图在运行时找到强制转换问题可能是一件痛苦的事情,因为它很难重现。最好在编译时而不是运行时发现问题。编译器是你的朋友。
mwngjboj4#
说明size_t、time_t、pid_t和off_t在C编程中的用法这些是C标准库中定义的数据类型,用于表示与大小、时间、进程ID和文件偏移量相关的特定值。让我们用C语言的例子来详细介绍每一个。
size_t是在头文件中定义的无符号整数类型<stddef.h>。它用于表示内存中对象的大小,通常用作strlen,sizeof等函数和其他内存相关操作的返回类型。它还可以用于循环计数器和索引,因为它保证足够大,可以表示内存中任何对象的大小。
time_t是在头文件中定义的算术类型<time.h>。它表示从历元(00:00:00 UTC,1970年1月1日)开始经过的时间。它通常用于与时间相关的函数,如time、ctime和difftime。
pid_t是〈sys/types中定义的有符号整数类型。h〉header。它表示进程ID(PID),用于与进程相关的函数,如fork、wait和getpid。
off_t是〈sys/types中定义的有符号整数类型。h〉header。它表示文件偏移量,当使用lseek和ftruncate等函数处理文件位置或大小时会用到。