__attribute__((constructor))用法解析

__attribute__((constructor))是GCC和兼容的編譯器中的一個特性,用于指示編譯器將一個函數標記為在程序啟動時自動執行的初始化函數。

同樣的還有__attribute__((destructor))在main()函數后調用。

當你在一個函數聲明或定義前加上__attribute__((constructor))屬性時,就會告訴編譯器,在程序加載時(在main函數執行之前),需要自動調用這個函數。這個特性通常用于在程序啟動時執行一些全局的初始化工作,比如注冊回調函數、初始化全局變量等。

舉個例子,如果你有一個函數 void my_init_function(void),并且你想在程序啟動時自動執行它,你可以這樣聲明:

void my_init_function(void) __attribute__((constructor));

然后在程序加載時,my_init_function 將會被自動調用。

總的來說,__attribute__((constructor))特性為開發者提供了一種方便的方式來定義在程序啟動時自動執行的初始化函數,使得全局的初始化工作變得更加簡單和方便。

__attribute__((constructor))還可以指定優先級。

在GCC和Clang中,初始化函數的優先級是越小越先執行,而不是越大越先執行。這意味著具有較小優先級值的初始化函數會在具有較大優先級值的初始化函數之前執行。

默認情況下,沒有指定優先級的初始化函數被視為具有中等優先級(0),而通過顯式設置優先級,可以控制初始化函數的執行順序。

舉個例子,如果你有三個初始化函數a()b()c(),并且你希望按照a()-c()-b()的順序執行,你可以這樣定義:

void a() __attribute__((constructor(99)));
void b() __attribute__((constructor(101)));
void c() __attribute__((constructor(100)));

在這個例子中,a()函數的優先級為101,c()的優先級為100,b()的優先級為99。因此,在程序啟動時,它們將按照a()-c()-b()的順序執行。

需要注意的是,初始化函數的優先級僅用于確定它們的執行順序,并不表示初始化的速度。初始化函數的執行速度取決于函數本身的實現和所涉及的操作,與優先級無關。

請記住,全局變量的初始化順序是依賴于編譯器和鏈接器的具體實現的,可能在不同的編譯器和平臺上有所不同。因此,在編寫代碼時,應盡量避免過于依賴全局變量之間的初始化順序,以確保代碼的可移植性和穩定性。

#include <stdio.h>
#include <stdlib.h>static void before(void) __attribute__((constructor));static void before3(void) __attribute__((constructor(103)));
static void before2(void) __attribute__((constructor(102)));
static void before1(void) __attribute__((constructor(101)));static void before2() { printf("before  102\n"); }static void before1() { printf("before  101\n"); }static void before3() { printf("before  103\n"); }static void before() { printf("before main\n"); }int main() {printf("main\n");return 0;
}

運行結果:

$ ./a.out       
before  101
before  102
before  103
before main
main

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165373.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165373.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談 Guava 中的 ImmutableMap.of 方法的坑

作者&#xff1a;明明如月學長&#xff0c; CSDN 博客專家&#xff0c;大廠高級 Java 工程師&#xff0c;《性能優化方法論》作者、《解鎖大廠思維&#xff1a;剖析《阿里巴巴Java開發手冊》》、《再學經典&#xff1a;《EffectiveJava》獨家解析》專欄作者。 熱門文章推薦&…

vue項目下.env.development環境變量配置文件

.env.development 文件是一個用于開發環境配置的文件。在許多應用程序中&#xff0c;開發環境和生產環境具有不同的配置需求。.env.development 文件允許你在開發環境中定義特定的環境變量和配置選項。 一般來說&#xff0c;.env.development 文件用于存儲開發環境相關的配置信…

國自然項目基金撰寫的隱藏技巧、范例分析及提交前的自我審查

目錄 一、基金項目申請要求、重點及項目介紹 二、基金的撰寫技巧 三、基金撰寫的隱藏技巧 四、范例分析及提交前的自我審查 更多應用 基金項目申請需要進行跨學科的技術融合&#xff0c;申請人需要與不同領域結合&#xff0c;形成多學科交叉的研究。基金項目申請在新時期更…

由紅黑樹引出的HashMap擴容機制的思考

紅黑樹是什么&#xff1f; 三大特點&#xff1a; 根節點是黑色&#xff0c;葉節點是不存儲數據的黑色空節點 任何相鄰的兩個節點不能同時為紅色 任意節點到其可到達的節點間包含相同數量的黑色節點 聯想&#xff1a;Java HashMap底層紅黑樹原理 HashMap基于哈希表Map接口實…

快速掌握Pyqt5的三種主窗口

PyQt5是一個強大的跨平臺GUI框架&#xff0c;它提供了多種不同類型的主窗口類&#xff0c;以滿足不同的應用需求。下面是PyQt5中最常見的幾種主窗口類型及其創建方式的簡介&#xff1a; 1. QMainWindow QMainWindow是用于創建具有菜單欄、工具欄、狀態欄和中心窗口部件&#…

內存池 示例一

內存池是一種管理內存分配和釋放的技術&#xff0c;用于優化內存的使用效率。它通過預先分配一塊內存區域&#xff0c;并將其劃分為多個較小的塊&#xff08;內存塊池&#xff09;&#xff0c;然后按需分配這些內存塊來減少內存碎片化和頻繁的系統調用。這些內存塊可以是相同大…

Centos7.9配置nfs共享及rsync同步

客戶需求對oracle數據庫做一個跨機房的備份&#xff0c;原環境已做rman備份和每天expdp全庫導出&#xff0c;遠端只有虛擬化環境&#xff0c;可提供一個虛擬機&#xff0c;2個機房間網絡互通。 首先配置nfs服務端 查看操作系統版本 [rootnas199 ~]# more /etc/redhat-relea…

Python面經【1】

一、協程的相關概念 協程&#xff08;又稱微線程&#xff09;運行在線程之上&#xff0c;更加輕量級&#xff0c;協程并沒有增加線程總數&#xff0c;只是在線程的基礎上通過分時復用的方式運行多個協程&#xff0c;大大提高工程效率。 協程的特點&#xff1a; 輕量級&#…

WordPress站點屏蔽過濾垃圾評論教程(Akismet反垃圾評論插件)

前段時間我的WordPress站點經常收到垃圾評論的轟炸&#xff0c;嚴重時一天會收到幾十條垃圾評論。我這個小破站一沒啥流量&#xff0c;二又不盈利&#xff0c;實在是不太理解為啥有人要這么執著地浪費資源在上面。 Akismet反垃圾評論插件 其實用了 Akismet 反垃圾評論插件后&a…

快速掌握Pyqt5的6種按鈕

在PyQt5中&#xff0c;按鈕是構建用戶界面的基本元素之一&#xff0c;用于執行命令、啟動功能或觸發事件。PyQt5提供了多種類型的按鈕&#xff0c;每種都適用于不同的場景和需求。 1. QPushButton QPushButton 是最常用的按鈕類型&#xff0c;適用于大多數情況&#xff0c;如…

ARCore:在Android上構建令人驚嘆的增強現實體驗

ARCore&#xff1a;在Android上構建令人驚嘆的增強現實體驗 一、 AR 介紹1.1 AR技術簡介1.2 AR技術原理1.3 AR技術應用領域 二、Google的增強現實平臺ARCore2.1 ARCore簡介2.2 ARCore API介紹2.3 ARCore API使用示例 三、總結 一、 AR 介紹 增強現實 Augmented Reality&#x…

【算法-字符串2】替換空格 + 反轉單詞

今天&#xff0c;帶來字符串相關算法的講解。文中不足錯漏之處望請斧正&#xff01; 理論基礎點這里 1. 替換空格 題目描述&#xff1a;請實現一個函數&#xff0c;把字符串 s 中的每個空格替換成"%20"。 來源&#xff1a;力扣&#xff08;LeetCode&#xff09; 難…

Lettuce使用詳解

簡介特點連接池連接池特點連接池管理連接池優勢連接池配置參數 監控常用監控工具通過JMX監控通過Prometheus監控 代碼示例拓展springboot中通過jmx上報到Prometheus代碼示例更多Redis相關內容 簡介 Lettuce 是一個高級的、線程安全的 Redis 客戶端&#xff0c;用于與 Redis 數…

深度學習基礎概念

1. 神經網絡基礎 神經元&#xff08;Neuron&#xff09;&#xff1a; 了解神經網絡的基本組成單元。激活函數&#xff08;Activation Function&#xff09;&#xff1a; 學習常見的激活函數&#xff0c;如Sigmoid、ReLU等&#xff0c;以及它們在神經網絡中的作用。前饋神經網絡…

An issue was found when checking AAR metadata

一、報錯信息 An issue was found when checking AAR metadata:1. Dependency androidx.activity:activity:1.8.0 requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs.:app is currently compiled against …

Python 異步套接字編程

異步套接字編程是異步編程在網絡通信中的應用&#xff0c;它使用異步 IO 操作和事件循環來實現高并發的網絡應用。Python 中的 asyncio 模塊提供了對異步套接字編程的支持&#xff0c;以下是異步套接字編程的一些重要概念和使用方法&#xff1a; 1. 異步套接字服務器&#xff…

git與ssh多賬戶共存

git與ssh多賬戶共存 前言git多賬戶ssh多公鑰參考 前言 在使用git與ssh時&#xff0c;經常會遇到多個賬戶共存的情況 例如使用不同的公鑰登陸到不同的服務&#xff1b;使用不同的git信息進行commit git多賬戶 在默認情況下 git的信息存在 ~/.gitconfig 可以使用命令查看 git…

關于elementui和ant design vue無法禁止瀏覽器自動填充問題

以and design vue 為例&#xff1a; 圖標用來顯隱賬號密碼 html&#xff1a; <a-form-model-item label"賬號密碼:" prop"password"><a-input v-if"passwordTab" ref"passwordInput" v-model"form.password" typ…

詳解最長公共子序列問題(三種方法)

這里&#xff0c;為了更方便地解釋&#xff0c;我以洛谷上的一道典型題目為例&#xff0c;為大家講解處理最長公共子序列問題的幾種常見方法。這道題目中規定了兩個子序列的長度相等&#xff0c;如果遇到不等的情況&#xff0c;也只需要對長度稍作修改即可&#xff0c;算法思想…

qs-一個序列化和反序列化的JavaScript庫

起因 一個業務場景中&#xff0c;最終得到一串字符"status[0]value1&status[1]value2" 通過解析&#xff0c;理應得到一個數組&#xff0c;卻得到一個對象 于是展開問題排查 最終發現是qs.parse 這個地方出了問題 排查結果 qs解析這種帶下標的字符串時&#xff…