【问题标题】:Is it true that Tagged initialization allows the reordering of structure members?标记初始化是否允许对结构成员进行重新排序?
【发布时间】:2015-08-08 17:00:12
【问题描述】:

我目前正在阅读《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 标记结构初始化 句法。这种语法是首选,因为它使驱动程序更 在结构定义的变化中可移植,并且, 可以说,使代码更加紧凑和可读。 标记 初始化允许结构成员的重新排序;在某些情况下 在案例中,显着的性能改进已经实现 将指向经常访问的成员的指针放在同一硬件中 缓存线。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的。所以,对你来说,这本书建议的是结构定义可能会在以后更改以优化性能。这本书强调的是它不会破坏使用标记初始化的驱动程序的代码。确实,您的解释显然是正确的。读这个我的问题现在看起来很愚蠢。反正。谢谢你。顺便说一句:删除字段可能会破坏驱动程序代码,当他们从标记的初始化中引用删除的字段时,对吧?
    • removing fields may break drivers code, when they reference the removed field from a tagged intialisation, right? - 是的,它可能会损坏。
    猜你喜欢
    • 2014-05-15
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多