Tagged初始化是否允许重新排序结构成员?

时间:2015-05-26 20:35:05

标签: linux gcc linux-kernel linux-device-driver c99

我目前正在阅读“Linux设备驱动程序”第三版。

提取物:

  

scull设备驱动程序仅实现最重要的设备   方法。其file_operations结构初始化如下:

struct file_operations scull_fops = {
    .owner = THIS_MODULE,
    .llseek = scull_llseek,
    .read = scull_read,
    .write = scull_write,
    .ioctl = scull_ioctl,
    .open = scull_open,
    .release = scull_release,
 };
     

此   声明使用标准的C标记结构初始化   句法。这种语法是首选,因为它使驱动程序更多   便于跨越结构定义的变化,   可以说,使代码更紧凑和可读。的标记   初始化允许重新排序结构成员; 在一些   案例,实现了大幅性能改进   将指针放在同一硬件中的频繁访问的成员上   缓存行。

我可能会误读。它们是否意味着对象内存中的最终布局将与初始结构定义不同?因此不可移植?我没有看到建议的可行实施。有人可以解释一下上一段中的建议吗?他们是否会建议在内存中最终放置函数会受到影响并相互靠近?因此更有可能在同一个缓存行中。

1 个答案:

答案 0 :(得分:2)

对象内存中的最终布局完全依赖于struct file_operations头文件中的linux/fs.h定义

他们的意思是,出于性能原因,此定义可以更改顺序,并且该更改不会破坏任何使用标记初始化其成员的驱动程序(与未命名的相反) 按顺序初始化它们出现在结构的定义中。

此外,除了重新排序结构成员之外,还可以添加新成员并删除未使用的成员,而不会破坏现有的驱动程序。这实际上发生在内核中。