精华内容
下载资源
问答
  • 梁、弯、节点构件的概念.doc
  • 主要介绍了C语言中的符号、符号、引用和引用的定义及相关内容,非常的简单易懂,有需要的朋友可以参考下
  • 符号与符号(引用与引用)

    千次阅读 2018-10-06 17:19:16
    符号与符号  我们经常在编程中碰到一种情况叫符号重复定义。多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误。这种符号的定义可以被称为 符号(Strong ...

    弱符号与强符号

        我们经常在编程中碰到一种情况叫符号重复定义。多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误。这种符号的定义可以被称为 强符号(Strong Symbol)。有些符号的定义可以被称为 弱符号(W eak Symbol)。对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。我们也可以通过GCC 的“__attribute__((weak))”来定义任何一个强符号为弱符号。注意,强符号与弱符号都是针对定义来说的,不是针对符号的引用。比如我们有下面这段程序:

    extern int ext;
    
    int weak;
    int strong = 1;
    __attribute__((weak)) int weak2 = 2;
    
    int main()
    {
        return 0;
    }

        上面这段程序中,weak 和 weak2 是弱符号,strong 和 main 是强符号,ext 即非强符号也非弱符号,因为它是一个外部变量的引用。针对强弱符号的概念,链接器就会按如下规格处理与选择被多次定义的全局符号:

    规则1:不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号);如果有多个强符号定义,则链接器报符号重复定义错误。

    规则2:如果一个符号在某个目标文件中是强符号,在其他文件中都是弱符号,那么选择强符号。

    规则3:如果一个符号在所有目标文件中都是弱符号,那么选择其中占用空间最大的一个。

    弱引用与强引用

        目前我们所看到的对外部目标文件的符号引用在目标文件被最终链接成可执行文件时,它们需要被正确的定义,如果没有找到该符号的定义,链接器就会报符号未定义错误,这种被称为 强引用(Strong Reference)。与之相对应还有一种 弱引用(Weak Reference),在处理弱引用时,如果该符号有定义,则链接器使用该符号的定义;如果该符号未被定义,链接器对于该符号的引用不报错。链接器处理强引用和弱引用的过程几乎一样,只是对于未定义的弱引用,链接器不认为它是一个错误。一般对于未定义的弱引用,链接器默认其为0,或者是一个特殊值,以便于程序代码能够识别。

        在GCC中,我们可以通过“__attribute__((weakref))”这个扩展关键字来声明对一个外部函数的引用为弱引用,比如下面这段代码:

    __attribute__((weakref)) void foo();
    
    int main()
    {
        foo();
    }

        我们可以将它编译成一个可执行文件,GCC并不会报链接错误。但是当我们运行这个可执行文件时,会发生运行错误,因为当main函数试图调用foo函数时,foo函数的地址为0,于是发生了非法地址访问错误。一个改进的例子是:

    __attribute__((weakref)) void foo();
    
    int main()
    {
        if (foo) foo();
    }

        这种弱符号与弱引用对于库来说十分有用,比如库中定义的弱符号可以被用户定义的强符号所覆盖,从而使得程序可以使用自定义版本的库函数;或者程序可以对某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起时,功能模块就可以正常使用;如果我们去掉了某些功能模块,那么程序也可以正常链接,只是缺少了相应的功能,这使得程序的功能更加容易裁剪和组合。

    展开全文
  • 符号与符号,引用与引用

    千次阅读 2015-09-18 22:07:08
    1.符号与符号 对C/C++而言,编译器默认函数和初始化了的全局变量为符号。未初始化的全局变量为符号。此处符号与符号均是针对定义来说的,不是针对符号的引用。也可以通过GCC的 “__attribute__((weak))...

    1.弱符号与强符号

    对C/C++而言,编译器默认函数和初始化了的全局变量为强符号。未初始化的全局变量为弱符号。此处弱符号与强符号均是针对定义来说的,不是针对符号的引用。也可以通过GCC的 “__attribute__((weak))”来定义任何一个强符号为弱符号

    extern in ext;
    int weak;
    int strong = 1;
    __attribute__((weak)) int weak2 = 1;
    
    int main()
    {
        return 0;
    }

    其中,强符号为:strong 与 main,弱符号为 :weak 与 weak2,而ext 即非强符号与非弱符号,因为它是一个外部变量的引用。针对强弱符号,链接器会根据下述规则来选择被多次定义的全局符号:

    1.不允许强符号被多次定义。否则链接器报错:符号重复定义

    2.如果符号在某个文件中是强符号,在其他文件中是弱符号,则选择强符号

    3.如果一个符号在所有文件中都是弱符号,则选择其中占用空间最大的。如弱符号 weak 在 A 文件中定义为double,在文件B中定义为 int, 则在链接A,B时,weak 的大小为 double的大小。


    2.弱引用与强引用

    强引用:目标文件引用了外部符号,在链接时若未找到定义则报错;则对该外部符号的引用为强引用

    弱引用:目标文件引用了外部符号,在链接时若未找到定义也不报错;则对该外部符号的引用为弱引用

    对弱引用,编译器一般默认其值为0,在GCC中,使用“__attribute__((weak))”来声明对一个外部符号的引用为弱引用。通常对弱引用的使用方式如下:

    __attribute__((weak)) void func();
    
    int main()
    {
          if(foo) foo();
    }


    3.弱符号与弱引用的作用:

    如:库中定义的弱符号可以被用户定义的强符号覆盖,从而使程序可以使用自己定义版本的库函数

    如:库中定义的某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序链接在一起时,正常运行;当我们去掉某些扩展模块时,程序也正常链接,只是缺少了相应功能




    展开全文
  •  为所有变量指定数据类型称为“类型”, /类型是指类型检查的严格程度的。语言有无类型,类型和强类型三种。无类型的不检查,甚至不区分指令和数据。类型的检查很,仅能严格的区分指令和数据。类型的...


    强类型:

           为所有变量指定数据类型称为“强类型”, 强/弱类型是指类型检查的严格程度的。语言有无类型,弱类型和强类型三种。无类型的不检查,甚至不区分指令和数据。弱类型的检查很弱,仅能严格的区分指令和数据。强类型的则严格的在编译进行检查。



    强引用:

        如何保证一个对象在释放后不会再被访问?最简单的是使用引用计数的智能指针,但是强引用会导致对象不会被释放,那么弱引用如何?弱引用允许对象被释放,弱引用必须先转成强引用才能对对象进行操作,如果转换失败,则表示对象已经被删除。


    弱引用:

        在计算机语言中,弱引用可以使垃圾回收器回收内存,而不像强引用,如果引用被判定为弱引用可达,那么被回收器回收,如果一个对象只具有弱引用,那就类似于可有可无的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。


    展开全文
  • 研究了"--"理论在深井巷道支护中的作用机理,其核心的"--"力学模型实现了用一种支护结构对深井巷道防治冲击矿压与软岩支护2个问题进行统一解决的目标。对于深井软岩巷道支护,"--"结构主要起到应力...
  • 引用引用支持区别
  • 太平洋钢铁周报:长,内,螺纹消费创新高.pdf
  • 结合`u-boot`和`kernel`来说明GCC中的符号和符号以及引用和引用

    1. 强符号和弱符号

    1.1 u-bootkernel中的__weak指令

    u-bootkernel比较普遍地使用了__weak来定义函数。

    include\linux\compiler-gcc.h__weak是这样定义的:

    #define __weak              __attribute__((weak))

    GCC通过__attribute__((weak))指令定义的函数或变量称为弱符号(Weak Symbol),实际上这个指令大部分时候都是用来定义函数,很少用于定义变量。

    编译器默认函数和初始化了的全局变量为强符号(Strong Symbol),未初始化的全局变量为弱符号(Weak Symbol)

    1.2 强符号和弱符号的链接规则

    <<程序员的自我修养>>第三章对这个强弱符号的链接规则做了很好的总结:

    针对强弱符号的概念,链接器就会按照如下规则处理与选择被多次定义的全局符号:

    • 规则1:不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号);如果有多个强符号定义,则链接器报符号重复定义错误。
    • 规则2:如果一个符号在某个目标文件中是强符号,在其他文件中都是弱符号,那么选择强符号。
    • 规则3:如果一个符号在所有目标文件中都是弱符号,那么选择其中占用空间最大的一个。比如目标文件A定义全局变量global为int型,占4个字节;目标文件B定义global为doulbe型,占8个字节,那么目标文件A和B链接后,符号global占8个字节(尽量不要使用多个不同类型的弱符号,否则容易导致很难发现的程序错误)。
    • 规则1很好理解,如果程序中多次定义了一个初始化过的全局变量(如int a=0),则编译器会报告multiple definition的错误,比较常见。

    多次定义的全局函数也属于此类,因为函数名也是一个符号变量,只不过它指向了随后定义的函数体,而且这个变量是只读的,不可改变。这也是为什么函数名可以赋值给一个变量,但是却无法给函数名赋值的原因。

    • 规则2就是u-bootkernel中最常用的技巧了。

    首先在平台无关的代码中定义一个__weak属性的函数,如u-bootboard_f.c的文件头部定义了很多led相关的空函数:

    __weak void coloured_LED_init(void) {}
    __weak void red_led_on(void) {}
    __weak void red_led_off(void) {}
    __weak void green_led_on(void) {}
    __weak void green_led_off(void) {}
    __weak void yellow_led_on(void) {}
    __weak void yellow_led_off(void) {}
    __weak void blue_led_on(void) {}
    __weak void blue_led_off(void) {} 

    如果需要这些led相关的功能,再在相关的文件中重新定义并实现这些函数即可,例如文件gpio_led.c中在宏CONFIG_GPIO_LED_STUBS打开时就调用__led_set重新实现了这些函数。

    • 规则3指明了同名弱符号的多个定义以占用空间最大的为准,主要是针对不用类型的变量而言;对于函数,其对应的符号相当于一个只读指针变量,而指针类型大小是固定的,不存在这个问题。

    2. 强引用和弱引用

    <<程序员的自我修养>>第三章对也对强引用和弱引用做了说明:

    弱引用和强引用 目前我们所看到的对外部目标文件的符号引用在目标文件被最终链接成可执行文件时,它们必须要被正确决议,如果没有找到该符号的定义,链接器就会报符号未定义错误,这种被称为强应用(Strong Reference)。与之相对应还有一种弱引用(Weak Reference),在处理弱引用时,如果该符号有定义,则链接器将该符号的引用决议;如果该符号未被定义,则链接器对于该引用不报错。链接器处理强引用和弱引用的过程几乎一样,只是对于未定义的弱引用,链接器不认为它是一个错误。一般对于未定义的弱引用,链接器默认其为0,或者是一个特殊的值,以便于程序代码能够识别。

    GCC中,我们可以通过使用__attribute__((weakref))扩展关键字来声明对一个外部函数的引用为弱引用。比如下面这段代码:

    __attribute__ ((weakref)) void foo();
    int main()
    {
        foo();
    }

    我们可以将它编译成一个可执行文件,GCC并不会报链接错误。但是当我们运行这个可执行文件时,会发生运行错误。因为当main函数试图条用foo函数是,foo函数的地址为0,于是发生了非法地址访问的错误。一个改进的例子是:

    __attribute__ ((weakref)) void foo();
    int main()
    {
      if (foo) foo();
    }

    这种弱符号弱引用对于库来说十分有用,比如库中定义的弱符号可以被用户定义的强符号所覆盖,从而使得程序可以使用自定义版本的库函数;或者程序可以对某些扩展功能模块的引用定义为弱引用,当我们将扩展模块与程序连接在一起时,功能模块就可以正常使用;如果我们去掉了某些功能模块,那么程序也可以正常链接,只是缺少了相应的功能,这使得程序的功能更加容易裁剪和组合。

    专门检查过u-boot v2016.09linux v3.3-3.8的代码,没有找到采用弱引用来定义函数的情况,可见也不是很常用的做法。

    4. 其它

    对于弱符号(Weak Symbol)弱引用,其都仅是GNU工具链GCCC语言语法的扩展,并不是C本身的语言特性。
    有提到微软的MSVC就不支持弱符号和弱引用特性。

    展开全文
  • 一个分类器的分类准确率在60%-80%,即:比随机... 反之,如果分类精度90%以上,则是分类器。 西瓜书上说: 学习器常指泛化性能略优于随即猜测的学习器(例如在二分类问题上精度略高于50%的分类器) ...
  • 主要介绍了C语言中的符号和符号介绍,本文用多个实例来讲解符号和符号,需要的朋友可以参考下
  • 初中语文文摘人生
  • 符号和符号

    2019-03-27 17:07:12
    只有全局函数或变量才有强弱之分 符号: 函数和已经初始化的全局变量 符号: ...2)如果一个符号和多个符号同名,那么选择符号 3)当有多个符号时,编译器会选择占用空间最大的那个 ...
  • 符号与符号

    千次阅读 2011-06-27 09:25:00
    3.5.5 符号与符号2009-04-22 12:52 俞甲子/石凡/潘爱民 人民邮电出版社 《程序员的自我修养:链接、装载与库》第3章目标文件里有什么。本章介绍COFF目标文件格式和源代码编译后如何在目标文件中存储。本节为大家...
  • 本文主要探讨优化问题中强、对偶性以及KKT条件的证明。
  • 单向函数 单向函数

    千次阅读 2018-07-07 17:52:12
    单向函数函数 f:{0,1}*--&gt; {0,1}* 若满足下列两个条件,则称之为单向函数:1 计算 f(x) 是容易的,即 f(x) 是多项式时间可计算的;2 计算 f(x) 函数的逆是困难的。 即对每一多项式时间概率算法 M ...
  • 类型语言与类型语言

    千次阅读 2018-02-01 22:57:19
    类型语言允许将一块内存看做多种类型。比如直接将整型变量与字符变量相加。C and C++ 是静态语言,也是类型语言;Perl and PHP 是动态语言,但也是类型语言。 类型语言在没有强制类型转化前,不允许两种...
  • 首先我表示很悲剧,在看《程序员的自我修养--链接、装载与库》之前我竟不知道C有符号、符号、引用和引用。在看到3.5.5节符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样感觉的朋友交流也希望...
  • 符号和符号  在编程中碰到一种情况叫符号重复定义。多个目标文件中含有相同名字的全局变量的定义,那么这些目标文件链接的时候就会出现符号重复定义的错误。比如在目标文件 A 和目标文件 B 都定义了一个...
  • 符号 符号

    千次阅读 2013-04-11 19:36:31
    为什么要存在符号,符号,什么是引用、引用,它们的作用是什么?最后介绍链接器的COMMON块机制(Common Block)。 一、符号----链接的接口: 在链接过程这种,目标文件之间相互拼合实际上是目标文件之间对...
  • 全局变量与符号和符号

    千次阅读 2016-10-18 15:29:06
    全局变量与符号和符号
  • 结构抗震概念梁.doc
  • 如何选择类型编程语言

    千次阅读 2018-03-25 11:16:43
    如果我做一个简单的程序,我不关心该使用类型语言还是类型语言。但是如果我的程序很复杂,并且需要由多人进行维护,那么我一定会选择类型语言。 何时用类型语言 现在,许多现代的编程语言都支持类型推导...
  • 引用,软引用,引用,虚引用

    千次阅读 2015-04-21 14:44:38
    引用,软引用,引用,虚引用 引用: 我们一般使用的就是引用。垃圾回收器绝不会回收它。 当内存空间不足时Java虚拟机宁愿抛出OutOfMemoryError错误使程序异常终止,也不会回收具有引用的对象来解决内存不足...
  • C#中的引用和引用

    千次阅读 2018-07-17 21:55:40
    我们平常用的都是对象的引用,如果有引用存在,GC是不会回收对象的。我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了WeakReference来实现。引用可以让您保持对对象的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 262,679
精华内容 105,071
关键字:

弱强