c++ size_t和off_t有什么区别?

1dkrff03  于 2023-05-02  发布在  其他
关注(0)|答案(4)|浏览(351)

除了每种类型可以容纳的值的大小之外,size_toff_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)
kq0g1dla

kq0g1dla1#

size_t用于对象,off_t用于文件。
mmap基本上按照定义合并了这两个概念。我个人认为我会使用size_t,因为不管它是什么,Map文件也是(虚拟)内存中的数组。
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

ogsagwnx

ogsagwnx2#

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

xe55xuns

xe55xuns3#

这是一个很好的经验法则。使用任何函数签名,使您使用最少的显式转换,无论是c风格还是c风格。如果你必须强制转换,c风格更安全,因为它在可以执行的强制转换类型方面更受限制。
这样做的好处是,如果您移植到一个类型不匹配的平台(无论是签名、大小还是字节序问题等)。),您应该在编译时捕获大多数bug,而不是在运行时。铸造是一种大锤式的方法,可以将一个三角形的对象挤压到一个圆孔中(或多或少你会告诉编译器保持安静,我知道我在做什么)。
试图在运行时找到强制转换问题可能是一件痛苦的事情,因为它很难重现。最好在编译时而不是运行时发现问题。编译器是你的朋友。

mwngjboj

mwngjboj4#

说明size_t、time_t、pid_t和off_t在C编程中的用法这些是C标准库中定义的数据类型,用于表示与大小、时间、进程ID和文件偏移量相关的特定值。让我们用C语言的例子来详细介绍每一个。

  • size_t:

size_t是在头文件中定义的无符号整数类型<stddef.h>。它用于表示内存中对象的大小,通常用作strlen,sizeof等函数和其他内存相关操作的返回类型。它还可以用于循环计数器和索引,因为它保证足够大,可以表示内存中任何对象的大小。

#include <stdio.h>
#include <stddef.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    size_t length = sizeof(arr) / sizeof(arr[0]);

    for (size_t i = 0; i < length; i++) {
        printf("arr[%zu] = %d\n", i, arr[i]);
    }

    return 0;
}
  • 时间t:

time_t是在头文件中定义的算术类型<time.h>。它表示从历元(00:00:00 UTC,1970年1月1日)开始经过的时间。它通常用于与时间相关的函数,如time、ctime和difftime。

#include <stdio.h>
#include <time.h>

int main() {
    time_t current_time;
    time(&current_time);

    printf("Current time is: %s", ctime(&current_time));

    return 0;
}
  • pid_t:

pid_t是〈sys/types中定义的有符号整数类型。h〉header。它表示进程ID(PID),用于与进程相关的函数,如fork、wait和getpid。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    pid_t pid = fork();

    if (pid == 0) {
        printf("Child process with PID: %d\n", getpid());
    } else {
        printf("Parent process with PID: %d\n", getpid());
    }

    return 0;
}
  • off_t:

off_t是〈sys/types中定义的有符号整数类型。h〉header。它表示文件偏移量,当使用lseek和ftruncate等函数处理文件位置或大小时会用到。

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    int fd = open("test.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    off_t offset = lseek(fd, 5, SEEK_SET);
    if (offset == (off_t) -1) {
        perror("lseek");
        close(fd);
        return 1;
    }

    printf("File offset set to %lld bytes.\n", (long long) offset);

    close(fd);
    return 0;
}

相关问题