精华内容
下载资源
问答
  • Could not get unknown property 'release' for SigningConfig container of type org.gradle.api.internal.FactoryNamedDomainObjectContainer. 原因: 在主module下的buildTypes{}中使用使用了signingCon...

    问题描述

    编译的时候出现如下异常提示:

    Could not get unknown property 'release' for SigningConfig container of type
     org.gradle.api.internal.FactoryNamedDomainObjectContainer.
    

    原因:

    在主module下的buildTypes{}中使用使用了signingConfig signingConfigs.release,但是由于粗心,将signingConfigs{}放到了buildType{}的后面,导致编译的时候无法找到,当然还有一种可能,那就是signingConfigs{}中真的没有声明release这个属性.

    解决如下,编译通过

    1、检查是否有signingConfigs {}。

    2、将signingConfigs{} 放在 buildTypes{}的前面即可

    signingConfigs {<
    展开全文
  • pytorch文档翻译---保存和载入模型

    千次阅读 2019-10-29 19:32:23
    /usr/local/lib/python3.6/dist-packages/torch/serialization.py:292: UserWarning: Couldn't retrieve source code for container of type TheModelClass. It won't be checked for correctness upon loading. ...
    %matplotlib inline
    #将所有的变量直接显示,而不用显式的调用print
    from IPython.core.interactiveshell import InteractiveShell
    InteractiveShell.ast_node_interactivity = "all" 
    

    英语渣,pytorch不熟悉,翻了个人记录用,侵了请联系我删。。。。
    CSDN看得麻烦的,可以移步

    https://colab.research.google.com/drive/17WjYQAK8ynPIhIw3E5iHd7Z3BibLJMjf


    Pytorch version:1.3

    作者: 马修Inkawhich
    译者: 团长sama
    本文档提供解决方案,以各种关于PyTorch模型的保存和加载使用情况。随时阅读整个文档,或者只是跳到你需要一个期望的使用情况下的代码。

    保存和加载模型需要了解以下三个核心功能:

    1. torch.save:将序列化对象保存到磁盘。此功能使用Python的pickle程序进行序列化。模型,张量,以及各类对象的字典可以使用该功能进行保存。

    2. [torch.load](https://pytorch.org/docs/stable/torch.html?highlight=torch load#torch.load):使用pickle将pickle文件对象反序列化到内存。该方法也方便设备加载数据(见 Saving & Loading Model Across Devices )。

    3. torch.nn.Module.load_state_dict :使用反序列化的 state_dict 加载模型的参数字典。有关state_dict 参见 What is a state_dict?.

    内容:

    • [什么是state_dict?](# 什么是state_dict?).
    • [保存和加载推理模型](# 保存和加载推理模型)
    • [保存和加载通用检查点](# 为推理或者恢复训练保存和加载通用检查点)
    • [保存多个模型到一个文件](# 将多个模型保存到一个文件 )
    • [使用不同模型的参数进行热启动](# 使用不同模型的参数进行热启动)
    • [跨设备保存和加载模型](# 保存torch.nn.DataParallel模型)

    什么是state_dict

    在PyTorch中,torch.nn.Module模型中可学习的参数(即重量和偏置)都包含在模型参数中(使用model.parameters()访问)。state_dict 是个将每层参数映射到对应的参数张量的python字典对象(OrderedDict)。**注意:state_dict的条目仅包括带有可学习参数的层(卷积层,线性层等)和registered buffers(BN层的mean等)。优化器对象(torch.optim)也有state_dict ,它包含有关该优化器状态信息,以及所使用的超参数。

    由于state_dict对象是OrderedDict,它们可以方便地保存,更新,修改和恢复,方便PyTorch模型和优化器添加了大量的模块化。

    例子:

    让我们来看看分类器训练教程中模型的state_dict

    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    import torch.optim as optim
    
    # Define model
    class TheModelClass(nn.Module):
        def __init__(self):
            super(TheModelClass, self).__init__()
            self.conv1 = nn.Conv2d(3, 6, 5)
            self.pool = nn.MaxPool2d(2, 2)
            self.conv2 = nn.Conv2d(6, 16, 5)
            self.fc1 = nn.Linear(16 * 5 * 5, 120)
            self.fc2 = nn.Linear(120, 84)
            self.fc3 = nn.Linear(84, 10)
    
        def forward(self, x):
            x = self.pool(F.relu(self.conv1(x)))
            x = self.pool(F.relu(self.conv2(x)))
            x = x.view(-1, 16 * 5 * 5)
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x
    
    # Initialize model
    model = TheModelClass()
    
    # Initialize optimizer
    optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
    
    # Print model's state_dict
    print("Model's state_dict:")
    for param_tensor in model.state_dict():
        print(param_tensor, "\t", model.state_dict()[param_tensor].size())
    
    # Print optimizer's state_dict
    print("Optimizer's state_dict:")
    for var_name in optimizer.state_dict():
        print(var_name, "\t", optimizer.state_dict()[var_name])
    
    Model's state_dict:
    conv1.weight 	 torch.Size([6, 3, 5, 5])
    conv1.bias 	 torch.Size([6])
    conv2.weight 	 torch.Size([16, 6, 5, 5])
    conv2.bias 	 torch.Size([16])
    fc1.weight 	 torch.Size([120, 400])
    fc1.bias 	 torch.Size([120])
    fc2.weight 	 torch.Size([84, 120])
    fc2.bias 	 torch.Size([84])
    fc3.weight 	 torch.Size([10, 84])
    fc3.bias 	 torch.Size([10])
    Optimizer's state_dict:
    state 	 {}
    param_groups 	 [{'lr': 0.001, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [140064166433992, 140064166434136, 140064166434208, 140064166434280, 140064166434352, 140064166434424, 140064166434496, 140064166434568, 140064166434640, 140064166434712]}]
    

    保存和加载推理模型

    保存/加载state_dict(推荐)

    !pwd
    
    /content
    
    PATH="/content/test.pth"
    

    保存:

    torch.save(model.state_dict(), PATH)
    

    载入:

    model = TheModelClass()
    print(torch.load(PATH).keys())
    model.load_state_dict(torch.load(PATH))
    model.eval()
    
    odict_keys(['conv1.weight', 'conv1.bias', 'conv2.weight', 'conv2.bias', 'fc1.weight', 'fc1.bias', 'fc2.weight', 'fc2.bias', 'fc3.weight', 'fc3.bias'])
    
    <All keys matched successfully>
    
    TheModelClass(
      (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
      (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
      (fc1): Linear(in_features=400, out_features=120, bias=True)
      (fc2): Linear(in_features=120, out_features=84, bias=True)
      (fc3): Linear(in_features=84, out_features=10, bias=True)
    )
    

    当保存模型用于推理时,仅需要保存经过训练的模型参数就可以了.使用torch.save()方法保存模型的state_dict具有最高的灵活性,方便以后恢复模型,所以这里推荐使用torch.save()方法保存模型参数.

    通常我们约定使用.pt或者.pth作为模型参数文件的后缀名.

    记住,在进行推理之前,务必使用model.eval()方法将dropout和BN层设置为推理模式,否则将得到和训练不一致的推理结果.

    NOTE
    注意load_state_dict()函数的形参是一个字典对象,而不是权重文件的地址.这意味你必须在使用load_state_dict()将保存的state_dict反序列化传进去,而不能直接传权重文件的路径

    保存/加载整个模型

    保存:

    torch.save(model, PATH)
    
    /usr/local/lib/python3.6/dist-packages/torch/serialization.py:292: UserWarning: Couldn't retrieve source code for container of type TheModelClass. It won't be checked for correctness upon loading.
      "type " + obj.__name__ + ". It won't be checked "
    /usr/local/lib/python3.6/dist-packages/torch/serialization.py:292: UserWarning: Couldn't retrieve source code for container of type Conv2d. It won't be checked for correctness upon loading.
      "type " + obj.__name__ + ". It won't be checked "
    /usr/local/lib/python3.6/dist-packages/torch/serialization.py:292: UserWarning: Couldn't retrieve source code for container of type MaxPool2d. It won't be checked for correctness upon loading.
      "type " + obj.__name__ + ". It won't be checked "
    /usr/local/lib/python3.6/dist-packages/torch/serialization.py:292: UserWarning: Couldn't retrieve source code for container of type Linear. It won't be checked for correctness upon loading.
      "type " + obj.__name__ + ". It won't be checked "
    

    载入:

    # Model class must be defined somewhere
    model = torch.load(PATH)
    model.eval()
    
    TheModelClass(
      (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
      (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
      (fc1): Linear(in_features=400, out_features=120, bias=True)
      (fc2): Linear(in_features=120, out_features=84, bias=True)
      (fc3): Linear(in_features=84, out_features=10, bias=True)
    )
    

    这种保存/加载模型的方式使用最直观的语法和最少的代码.保存模型使用的是python的pickle模块.该方法的缺点就是在使用确切的目录结构保存模型,且序列化数据是绑定到特定的类上.这样做的原因时pickle不会保存模型类本身.相反,它保存了包含类文件的路径,以方便在加载时使用.因此,当其他项目使用和重构时,代码可能以各种方式中断.

    通常我们约定使用.pt或者.pth作为模型参数文件的后缀名.

    记住,在进行推理之前,务必使用model.eval()方法将dropout和BN层设置为推理模式,否则将得到和训练不一致的推理结果.

    为推理或者恢复训练保存和加载通用检查点

    保存:

    torch.save({
        'epoch': epoch,
        'model_state_dict': model.state_dict(),
        'optimizer_state_dict': optimizer.state_dict(),
        'loss': loss,
        ...
        }, PATH)
    

    加载:

    model = TheModelClass()
    optimizer = TheOptimizerClass()
    
    checkpoint = torch.load(PATH)
    model.load_state_dict(checkpoint['model_state_dict'])
    optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
    epoch = checkpoint['epoch']
    loss = checkpoint['loss']
    
    model.eval()
    # - or -
    model.train()
    

    当保存通用检查点时,无论是用于推理还是恢复训练,需要保存更多的信息而不仅仅是模型的state_dict.保存优化器的state_dict也很重要,因为里面保存着随着模型训练而更新的缓冲区和参数.其他的项目,例如中断训练时的epoch,最近的训练loss,外部的torch.nn.Embedding层等也需要保存.

    一般我们将这些信息组织成字典,使用torch.save()将字典序列化之后进行保存.

    通常我们约定使用.tar作为文件扩展名来保存这些检查点.

    加载这些项目时,首先要实例化模型和优化器,然后使用torch.load()方法来载入字典.

    记住,在进行推理之前,务必使用model.eval()方法将dropout和BN层设置为推理模式,否则将得到和训练不一致的推理结果.若想接着训练,调用model.train()来确保这些层处于训练模式.

    将多个模型保存到一个文件

    保存:

    torch.save({
        'modelA_state_dict': modelA.state_dict(),
        'modelB_state_dict': modelB.state_dict(),
        'optimizerA_state_dict': optimizerA.state_dict(),
        'optimizerB_state_dict': optimizerB.state_dict(),
        ...
        }, PATH)
    

    载入:

    modelA = TheModelAClass(*args, **kwargs)
    modelB = TheModelBClass(*args, **kwargs)
    optimizerA = TheOptimizerAClass(*args, **kwargs)
    optimizerB = TheOptimizerBClass(*args, **kwargs)
    
    checkpoint = torch.load(PATH)
    modelA.load_state_dict(checkpoint['modelA_state_dict'])
    modelB.load_state_dict(checkpoint['modelB_state_dict'])
    optimizerA.load_state_dict(checkpoint['optimizerA_state_dict'])
    optimizerB.load_state_dict(checkpoint['optimizerB_state_dict'])
    
    modelA.eval()
    modelB.eval()
    # - or -
    modelA.train()
    modelB.train()
    

    当保存诸如GAN,Seq2Seq,集成模型等由多个torch.nn.Modules组成的模型时,可以使用和上一章节相同的方法.

    使用不同模型的参数进行热启动

    保存:

    torch.save(modelA.state_dict(), PATH)
    

    载入:

    modelB = TheModelBClass(*args, **kwargs)
    modelB.load_state_dict(torch.load(PATH), strict=False)
    

    部分加载模型或者加载部分模型时迁移学习和训练新的复杂模型时的常见手段.利用已训练过的参数,即便只有一些可用,也有助于热启动模型的训练过程,并帮助模型比从头开始训练收敛得更快.

    无论你是从缺少一些键的字典还是多出一些键的字典加载模型state_dict,你可以通过设置load_state_dict()方法中的strict参数为False来忽略不匹配的键.

    若是你想将某层的参数加载到另一层,但是一些键不匹配,只需更改要加载的state_dict中参数键的名称,以匹配到你要加载到的模型键中就行了.

    跨设备保存/加载模型

    在GPU上保存,在CPU上加载

    保存:

    torch.save(model.state_dict(), PATH)
    

    加载:

    device = torch.device('cpu')
    model = TheModelClass(*args, **kwargs)
    model.load_state_dict(torch.load(PATH, map_location=device))
    

    当加载在GPU上训练和保存的模型权重到GPU上时,实例化模型之后调用model.to(torch.device('cuda'))就行,注意同时要保证.to(torch.device('cuda'))方法应用于所有的模型输入上.my_tensor.to(device)将返回一个新的my_tensor拷贝到GPU,而不是覆写my_tensor.因此,需要手动覆写张量my_tensor = my_tensor.to(torch.device('cuda'))

    保存在CPU,加载在GPU

    保存:

    torch.save(model.state_dict(), PATH)
    

    载入:

    device = torch.device("cuda")
    model = TheModelClass(*args, **kwargs)
    model.load_state_dict(torch.load(PATH, map_location="cuda:0"))  # Choose whatever GPU device number you want
    model.to(device)
    # Make sure to call input = input.to(device) on any input tensors that you feed to the model
    

    当加载一个训练和保存都在CPU上的模型权重到GPU上时,将torch.load()函数中map_location参数设置成cuda:device_id,可以将模型加载到一个指定的GPU上.注意同时要保证.to(torch.device('cuda'))方法应用于所有的模型输入上.my_tensor.to(device)将返回一个新的my_tensor拷贝到GPU,而不是覆写my_tensor.因此,需要手动覆写张量my_tensor = my_tensor.to(torch.device('cuda'))

    保存torch.nn.DataParallel模型

    保存:

    torch.save(model.module.state_dict(), PATH)
    

    载入:

    # 跟上一章一样
    

    torch.nn.DataParallel 是个支持GPU并行的模型包装器.使用model.module.state_dict()函数可以以常规方式保存DataParallel模型. 这样你可以灵活的以任何方式将模型加载到任何设备上.

    展开全文
  • container of()函数简介

    万次阅读 多人点赞 2018-02-25 21:15:45
    在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义??? 怎么还有0呢??? 哎,算了,...

          在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般人就会绝望了(这一堆都是什么呀? 函数还可以这样定义??? 怎么还有0呢???  哎,算了,还是放弃吧。。。)。 这就是内核大佬们厉害的地方,随便两行代码就让我们怀疑人生,凡是都需要一个过程,慢慢来吧。


            其实,原理很简单:  已知结构体type的成员member的地址ptr,求解结构体type的起始地址。

                      type的起始地址 = ptr - size      (这里需要都转换为char *,因为它为单位字节)。

           到此,该函数已经讲完,是不是很简单??? 其实也不是,这里并没有提到size如何计算,而令我们头晕的正是这里。

        好吧,先上container of函数原型:

    #define container_of(ptr, type, member) ({              \         
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \         
    (type *)( (char *)__mptr - offsetof(type,member) );})
    

        其次为 offserof 函数原型:

    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

      怎么样,是不是很炫?  好吧,下面开始揭开面纱:

      (一)0 指针的使用    (自己给的名字,不知有木问题)

                让事实说话:

    #include<stdio.h>
    
    struct test
    {
    	char i ;
    	int j;
    	char k;
    };
    
    int main()
    {
    	struct test temp;
    	printf("&temp = %p\n",&temp);   
    	printf("&temp.k = %p\n",&temp.k);
    	printf("&((struct test *)0)->k = %d\n",((int)&((struct test *)0)->k));
    
    }

     编译运行,可以得到如下结果:

    &temp = 0xbf9815b4
    &temp.k = 0xbf9815bc
    &((struct test *)0)->k = 8
    

     什么意思看到了吧,自定义的结构体有三个变量:i,j,k。 因为有字节对齐要求,所以该结构体大小为4bytes * 3 =12 bytes.   而&((struct test *)0)->k 的作用就是求 k到结构体temp起始地址的字节数大小(就是我们的size)。在这里0被强制转化为struct test *型, 它的作用就是作为指向该结构体起始地址的指针就是作为指向该结构体起始地址的指针就是作为指向该结构体起始地址的指针, 而&((struct test *)0)->k  的作用便是求k到该起始指针的字节数。。。其实是求相对地址,起始地址为0,则&k的值便是size大小(注:打印时因为需要整型,所以有个int强转)所以我们便可以求我们需要的 size 了  。 好吧,一不小心把 offsetof() 函数的功能给讲完了:::

    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

    这次再看就顺眼了吧大笑(底层为什么是这样我还是不懂。。。只知道这样确实可以) ,  所以offsetof()的作用就是求我们梦寐以求的size, 并以size_t形式返回(size_t: 无符号整型)。

    (二) 内核编程的严谨性   

    #define container_of(ptr, type, member) ({              \         
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \         
    (type *)( (char *)__mptr - offsetof(type,member) );})
        这里我们只看第二行:
    const typeof( ((type *)0)->member ) *__mptr = (ptr);  

      它的作用是什么呢? 其实没什么作用(尴尬尴尬尴尬勿喷勿喷,让我把话说完),但就形式而言 _mptr = ptr,  那为什么要要定义一个一样的变量呢??? 其实这正是内核人员的牛逼之处:如果开发者使用时输入的参数有问题:ptr与member类型不匹配,编译时便会有warnning, 但是如果去掉改行,那个就没有了,而这个警告恰恰是必须的(防止出错有不知道错误在哪里)。。。这严谨性可以吧抓狂抓狂抓狂

    typeof( ((type *)0)->member )

       它的作用是获取member的类型仅此而已。至此基本结束

    (三) 总结

           container_of(ptr, type,member)函数的实现包括两部分:

               1.  判断ptr 与 member 是否为同意类型

               2.  计算size大小,结构体的起始地址 = (type *)((char *)ptr - size)   (注:强转为该结构体指针)

        现在我们知道container_of()的作用就是通过一个结构变量中一个成员的地址找到这个结构体变量的首地址。

        container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。



    展开全文
  • C语言高级用法---container_of()

    万次阅读 2019-06-03 13:58:15
    在Linux内核源码中,实现和链表相关的接口list_entry()时,会调用container_of()宏定义,它的作用是:给定结构体中某个成员的地址、该结构体类型和该成员的名字获取这个成员所在的结构体变量的首地址。 container_...

    在Linux内核源码中,实现和链表相关的接口list_entry()时,会调用container_of()宏定义,它的作用是:给定结构体中某个成员的地址、该结构体类型和该成员的名字获取这个成员所在的结构体变量的首地址。有点绕,没关系,接着往下看就能明白了。
    container_of()宏定义实现如下所示

    /**
     * container_of - cast a member of a structure out to the containing structure
     *
     * @ptr:        the pointer to the member.
     * @type:       the type of the container struct this is embedded in.
     * @member:     the name of the member within the struct.
     *
     */
    #define container_of(ptr, type, member) ({                      \
            const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
            (type *)( (char *)__mptr - offsetof(type,member) );})
    

    要看懂上述代码,需要知道三个关键点:

    1. typeof(),取变量或表达式类型,可参考之前typeof的文章
    2. typeof( ((type *)0)->member ),用typeof( ((struct apple *)0)->color ) 解释更易理解,它的作用是获取结构体apple中变量color的类型,可参考之前的文章
    3. offsetof(),获取结构体中某个成员相对于该结构体首元素地址的偏移量

    好了,再开始解释container_of(),其三个入参含义:

    1. ptr:结构体变量中某个成员的地址
    2. type:结构体类型
    3. member:该结构体变量的具体名字

    比如如下结构体struct ipstore,假设已经有一个变量struct ipstore *ist1;,并给ist1分配好了内存且进行了初始化,在已知结构体成员list的地址的情况下,获取list所在的结构体变量ist1的首地址。此时有人就会问了,这里ist1明明是已知的,这么做不是自己给自己找麻烦吗?这是个好问题,但是不要忘记,本文到目前为止只是讲解container_of()的含义,并没有说它适合用在什么样的场景下,因为有一种使用场景,当链表是通过list串起来的时候,此时并不知道ist1的首地址,反而是知道list的地址,这时container_of()就非常合适了,内核中的链表就是这么做的。

    struct list_head {
        struct list_head *next;
        struct list_head  *prev;
    };
    
    struct ipstore{
        unsigned long time;
        __u32 addr[4];
        struct list_head list;
    };
    
    

    所以,调用container_of()时具体的传参如下所示,其返回的结果是ist1的地址。

    container_of(ist1->list, struct ipstore, list)
    

    如下测试代码,通过container_of()取得了ip1的地址。

    void container_of_test()
    {
        struct ipstore ip1;
        struct ipstore *p1;
    
        p1 = container_of(&ip1.list, struct ipstore, list);
    
        printf("ip1's addr:0x%0x\n", &ip1);
        printf("p1's  addr:0x%0x\n", p1);
    }
    
    [root@xxx c_base]# ./a.out
    ip1's addr:0xa5fe1fe0
    p1's  addr:0xa5fe1fe0
    
    展开全文
  • PyTorch笔记5-save和load神经网络

    千次阅读 2017-11-04 22:32:57
    本系列笔记为 莫烦PyTorch视频教程笔记 .../Users/yangjiahua/pytorch-test/lib/python3.6/site-packages/torch/serialization.py:147: UserWarning: Couldn't retrieve source code for container of type ...
  • 介绍了container_of的原理以及用法;
  • java.lang.NoSuchFieldError: No static field web_title of type I in class Lcom/cnlive/webview/R$id; or its superclasses (declaration of 'com.cnlive.webview.R$id' appears in /data/app/...
  • android studio 新建Activity 的时候,莫名其妙的报了一个错误。 关键词'compile' , 那就去项目下的,gradle文件下看一下。 WTF? 怎么变成这个鬼样子... 那就很简单啦,原因是新建Activity的时候 gradle中的...
  • C语言基础--container_of

    千次阅读 2018-05-19 15:19:12
    一个朋友说在keil里想使用container_of函数,然后我百度了一下,发现了这篇帖子,点击打开链接,将其复制放在keil5中编译不通过,在了解了container_of的作用之后,自己写了一个,并且已经测试通过。 首先,...
  • Could not get unknown property 'jniLibs' for source set 'main' of type org.gradle.api.internal.tasks.DefaultSourceSet. 错误,原因是因为你吧 这个配置放的位置不对,正确的方法如下: 看到这相信你已经知道...
  • 调试input 设备某sensor时候遇到一个有关container_of 报出 warning: initialization from incompatible pointer type 的警告。 这一切都是struct delayed_work work;惹的祸! 解决办法: 将 struct ...
  • container_of注意事项

    千次阅读 2018-08-29 23:29:23
    已知一个变量的地址时,使用container_of获取此变量所在的结构体的首指针。...#define container_of(ptr, type, member) ({ \  void *__mptr = (void *)(ptr); \  BUILD_BUG_ON_MSG(!__same_type(*(ptr...
  • Linux内核中container_of宏的详细解释

    千次阅读 多人点赞 2020-09-24 00:27:54
    如何移植并使用Linux内核的通用链表(附完整代码实现)](https://blog.csdn.net/qq_16933601/article/details/108542631)我们在分析Linux内核链表的时候注意到内核在求解结构体偏移的时候巧妙的使用了container_of宏...
  • Could not get unknown property ‘release’ for SigningConfig Container. 导致这种错误的原因有两种 1、在app 的module下build.gradle文件中的buildTypes{}中使用使用了signingConfig signingConfigs.release,...
  • Linux内核container_of详解

    千次阅读 2016-04-13 00:19:46
    那么container_of的工作原理就相当简单了,就是用MEMBER的地址减去上一步中得到的偏移,即为TYPE类型的结构体对象的地址。 为什么__mptr要强制转换为char*呢?这是c语言的基础知识,指针的加减对应到地址是根据...
  • #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) int main(int argc, const char *argv[]) {...
  • Linux内核中的container_of函数简要介绍

    千次阅读 2018-06-03 21:08:11
    container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构...container_of的定义如下: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)-&gt;member ) *__...
  • Linux字符驱动中container_of宏的作用

    千次阅读 2016-07-08 14:10:42
     container_of(ptr,type,member)  功能:根据一个结构体变量中的一个成员变量的指针来获取指向整个结构体变量的指针。  参数:  ptr:已知的结构体成员的首地址(指针);  type:要获取的结构体变量的类型  ...
  • 在内核代码中,经常见到container_of函数,它是一个宏定义,定义在include\linux\kernel.h文件中 /** * Container_of - cast a member of a structure out to the ...* @type: the type of the container struc
  • container_of 函数

    2017-04-15 11:53:04
    container_of  2010-05-23 22:34:32| 分类: 默认分类 | 标签: |字号大中小 订阅 在学习Linux驱动的过程中,遇到一个宏叫做container_of。 该宏定义在include/linux/kernel.h中,首先来贴出...
  • offset ofcontainer of 解析

    千次阅读 2018-05-31 22:37:00
       在Linux源码中,经常看到大名鼎鼎offset ofcontainer of 的宏定义,这里就此进行解析,并做了实验验证用途,仅用于自己参考记录。
  • 内核container_of(ptr,type,member) 解析

    千次阅读 2013-09-04 16:35:16
    container_of(ptr,type,member) 用于在已知结构体里面成员member和该成员指针ptr(就是地址)和结构体类型type, 返回该成员所在的结构体的指针(就是地址), 例如已知 struct student a { char *name; int age; }...
  • 在python上使用 if a=b: elif a=c: 等判断语句的时候,如果没有加入else:的话,就会返回None else: 解决办法就是判断语句一定要全面。
  • container_of 详解

    千次阅读 2012-12-02 14:37:03
    // container_of宏的功能:从结构体类型(type)的一个成员(member)指针(ptr),反推得到该结构体的指针 // 其实现由两个分号隔开的语句组成,首先用typeof关键字,得到member成员的类型typeof(member),为了访问 // ...
  • container_of的含义及使用方法

    千次阅读 2014-03-15 19:51:29
    container_of宏的定义如下: /** * container_of - cast a member of a structure out to the containing structure * * @ptr: the pointer to the ... * @type: the type of the container struct this is embedd
  • container_of()详解

    千次阅读 2015-08-12 15:47:58
    ​原地址:http://radek.io/2012/11/10/magical-container_of-macro/ 当你开始内核编程的时候,你会随便看看代码,那么你可能很快就会碰到这个神奇的预处理代码结构。 它是用来干嘛的?正如它的名称那样,它获取的...
  • container_of用来根据成员变量查找所在基结构体的地址,其宏定义如下:#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)-&gt;member ) *__mptr = (ptr); \ (type *)( (char *)__...
  • container_of宏深度解析

    千次阅读 2020-02-03 15:21:35
    #define container_of(ptr,type,member) {const typeof(((type*)0)->member)* _myptr=(ptr); (type*)((char*)_myptr-offsetof(type,member));}) 变量分析: ptr指向结构体元素member元素的指针...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 124,511
精华内容 49,804
关键字:

containeroftype