__attribute __((构造函数))究竟是如何工作的?

__attribute __((构造函数))究竟是如何工作的?

似乎很清楚它应该设置。

  1. 什么时候它运行?

  2. 为什么有两个括号?

  3. __attribute__功能吗?一个宏?句法?

  4. 这在C中有用吗?C ++?

  5. 它的工作功能是否需要是静态的?

  6. 什么时候__attribute__((destructor))跑?

Objective-C中的示例:

__attribute__((constructor))static void initialize_navigationBarImages() {
  navigationBarImages = [[NSMutableDictionary alloc] init];}__attribute__((destructor))static void destroy_navigationBarImages() {
  [navigationBarImages release];}


LEATH
浏览 1004回答 3
3回答

慕斯709654

本页提供有关重大认识constructor和destructor属性的实施和内ELF内,让他们工作的章节。在消化了这里提供的信息之后,我编译了一些额外的信息,并(借用上面Michael Ambrus的部分示例)创建了一个示例来说明概念并帮助我学习。下面提供这些结果以及示例源。如此线程中所述,constructor和destructor属性在目标文件的.ctors和.dtors部分中创建条目。您可以使用以下三种方式之一在任一部分中放置对函数的引用。(1)使用任何一个section属性;&nbsp;(2)constructor和destructor属性或(3)内联汇编调用(在Ambrus的答案中引用了链接)。使用constructor和destructor属性允许您另外为构造函数/析构函数分配优先级,以在main()调用之前或返回之后控制其执行顺序。给定的优先级值越低,执行优先级越高(在main()之前的较高优先级之前执行的优先级较低 - 以及在main()之后的较高优先级之后执行)。您提供的优先级值必须大于100编译器保留0-100之间的优先级值才能实现。A&nbsp;constructor或destructor具有优先级的指定在没有优先级的情况下执行constructor或destructor指定。随着“部分的”属性或者与内联汇编,你也可以将在函数引用.init和.finiELF代码段,将任何构造的任何析构函数之前和之后,分别执行。放置在该.init部分中的函数引用调用的任何函数将在函数引用之前执行(像往常一样)。我试图在下面的例子中说明每一个:#include&nbsp;<stdio.h>#include&nbsp;<stdlib.h>/*&nbsp;&nbsp;test&nbsp;function&nbsp;utilizing&nbsp;attribute&nbsp;'section'&nbsp;".ctors"/".dtors" &nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;create&nbsp;constuctors/destructors&nbsp;without&nbsp;assigned&nbsp;priority. &nbsp;&nbsp;&nbsp;&nbsp;(provided&nbsp;by&nbsp;Michael&nbsp;Ambrus&nbsp;in&nbsp;earlier&nbsp;answer) */#define&nbsp;SECTION(&nbsp;S&nbsp;)&nbsp;__attribute__&nbsp;((section&nbsp;(&nbsp;S&nbsp;)))void&nbsp;test&nbsp;(void)&nbsp;{printf("\n\ttest()&nbsp;utilizing&nbsp;--&nbsp;(.section&nbsp;.ctors/.dtors)&nbsp;w/o&nbsp;priority\n");}void&nbsp;(*funcptr1)(void)&nbsp;SECTION(".ctors")&nbsp;=test;void&nbsp;(*funcptr2)(void)&nbsp;SECTION(".ctors")&nbsp;=test;void&nbsp;(*funcptr3)(void)&nbsp;SECTION(".dtors")&nbsp;=test;/*&nbsp;&nbsp;functions&nbsp;constructX,&nbsp;destructX&nbsp;use&nbsp;attributes&nbsp;'constructor'&nbsp;and &nbsp;&nbsp;&nbsp;&nbsp;'destructor'&nbsp;to&nbsp;create&nbsp;prioritized&nbsp;entries&nbsp;in&nbsp;the&nbsp;.ctors,&nbsp;.dtors &nbsp;&nbsp;&nbsp;&nbsp;ELF&nbsp;sections,&nbsp;respectively. &nbsp;&nbsp;&nbsp;&nbsp;NOTE:&nbsp;priorities&nbsp;0-100&nbsp;are&nbsp;reserved */void&nbsp;construct1&nbsp;()&nbsp;__attribute__&nbsp;((constructor&nbsp;(101)));void&nbsp;construct2&nbsp;()&nbsp;__attribute__&nbsp;((constructor&nbsp;(102)));void&nbsp;destruct1&nbsp;()&nbsp;__attribute__&nbsp;((destructor&nbsp;(101)));void&nbsp;destruct2&nbsp;()&nbsp;__attribute__&nbsp;((destructor&nbsp;(102)));/*&nbsp;&nbsp;init_some_function()&nbsp;-&nbsp;called&nbsp;by&nbsp;elf_init() */int&nbsp;init_some_function&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("\n&nbsp;&nbsp;init_some_function()&nbsp;called&nbsp;by&nbsp;elf_init()\n"); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;}/*&nbsp;&nbsp;elf_init&nbsp;uses&nbsp;inline-assembly&nbsp;to&nbsp;place&nbsp;itself&nbsp;in&nbsp;the&nbsp;ELF&nbsp;.init&nbsp;section. */int&nbsp;elf_init&nbsp;(void){ &nbsp;&nbsp;&nbsp;&nbsp;__asm__&nbsp;(".section&nbsp;.init&nbsp;\n&nbsp;call&nbsp;elf_init&nbsp;\n&nbsp;.section&nbsp;.text\n"); &nbsp;&nbsp;&nbsp;&nbsp;if(!init_some_function&nbsp;()) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;(1); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("\n&nbsp;&nbsp;&nbsp;&nbsp;elf_init()&nbsp;--&nbsp;(.section&nbsp;.init)\n"); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;}/* &nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;definitions&nbsp;for&nbsp;constructX&nbsp;and&nbsp;destructX */void&nbsp;construct1&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;construct1()&nbsp;constructor&nbsp;--&nbsp;(.section&nbsp;.ctors)&nbsp;priority&nbsp;101\n");}void&nbsp;construct2&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;construct2()&nbsp;constructor&nbsp;--&nbsp;(.section&nbsp;.ctors)&nbsp;priority&nbsp;102\n");}void&nbsp;destruct1&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destruct1()&nbsp;destructor&nbsp;--&nbsp;(.section&nbsp;.dtors)&nbsp;priority&nbsp;101\n\n");}void&nbsp;destruct2&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destruct2()&nbsp;destructor&nbsp;--&nbsp;(.section&nbsp;.dtors)&nbsp;priority&nbsp;102\n");}/*&nbsp;main&nbsp;makes&nbsp;no&nbsp;function&nbsp;call&nbsp;to&nbsp;any&nbsp;of&nbsp;the&nbsp;functions&nbsp;declared&nbsp;above */intmain&nbsp;(int&nbsp;argc,&nbsp;char&nbsp;*argv[])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;("\n\t&nbsp;&nbsp;[&nbsp;main&nbsp;body&nbsp;of&nbsp;program&nbsp;]\n"); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}输出:init_some_function()&nbsp;called&nbsp;by&nbsp;elf_init() &nbsp;&nbsp;&nbsp;&nbsp;elf_init()&nbsp;--&nbsp;(.section&nbsp;.init) &nbsp;&nbsp;&nbsp;&nbsp;construct1()&nbsp;constructor&nbsp;--&nbsp;(.section&nbsp;.ctors)&nbsp;priority&nbsp;101 &nbsp;&nbsp;&nbsp;&nbsp;construct2()&nbsp;constructor&nbsp;--&nbsp;(.section&nbsp;.ctors)&nbsp;priority&nbsp;102 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test()&nbsp;utilizing&nbsp;--&nbsp;(.section&nbsp;.ctors/.dtors)&nbsp;w/o&nbsp;priority &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test()&nbsp;utilizing&nbsp;--&nbsp;(.section&nbsp;.ctors/.dtors)&nbsp;w/o&nbsp;priority&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;main&nbsp;body&nbsp;of&nbsp;program&nbsp;] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test()&nbsp;utilizing&nbsp;--&nbsp;(.section&nbsp;.ctors/.dtors)&nbsp;w/o&nbsp;priority &nbsp;&nbsp;&nbsp;&nbsp;destruct2()&nbsp;destructor&nbsp;--&nbsp;(.section&nbsp;.dtors)&nbsp;priority&nbsp;102 &nbsp;&nbsp;&nbsp;&nbsp;destruct1()&nbsp;destructor&nbsp;--&nbsp;(.section&nbsp;.dtors)&nbsp;priority&nbsp;101该示例有助于巩固构造函数/析构函数的行为,希望它对其他人也有用。
打开App,查看更多内容
随时随地看视频慕课网APP