gpt4 book ai didi

c - 为什么这样一个结构体包含两个只包含一个元素的数组字段?

转载 作者:IT王子 更新时间:2023-10-29 00:07:09 25 4
gpt4 key购买 nike

请注意:此问题与(One element array in struct)不重复

以下代码摘自Linux内核源码(版本:3.14)

struct files_struct
{
atomic_t count;
struct fdtable __rcu *fdt;
struct fdtable fdtab;

spinlock_t file_lock ____cacheline_aligned_in_smp;
int next_fd;
unsigned long close_on_exec_init[1];
unsigned long open_fds_init[1];
struct file __rcu * fd_array[NR_OPEN_DEFAULT];
};

我只是想知道为什么 close_on_exec_initopen_fds_init 被定义为包含一个元素的数组,而不是仅仅被定义为 unsigned long close_on_exec_init;unsigned long open_fds_init;.

最佳答案

这些字段是一种优化,因此 Linux 不必为具有不超过 BITS_PER_LONG 个打开文件描述符的典型进程执行尽可能多的分配。

close_on_exec_init 字段在分配 files_struct 时为 fdt->close_on_exec 提供初始存储。 (参见 fs/file.c 中的 dup_fd。)

fdt->close_on_exec 的每一位都被设置,如果相应的文件描述符设置了“close-on-exec”标志。因此,如果进程打开的文件描述符多于 unsigned long 中的位数,Linux 只需要为 fdt->close_on_exec 分配额外的空间。

open_fds_init 字段为 fdt->open_fds 字段提供相同的功能。 fd_array 字段为 fdt->fd 字段提供相同的功能。 (请注意,fd_array 的大小为 BITS_PER_LONG。)

close_on_exec_initopen_fds_init 字段以前的类型为 struct embedded_fd_set,但在 this commit 中更改为裸数组。 .提交消息没有解释为什么作者选择使用单元素数组而不是裸标量。也许作者 (David Howells) 只是想避免使用 & 运算符。

关于c - 为什么这样一个结构体包含两个只包含一个元素的数组字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24028874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com