C++編程法則365天一天一條(323)main函數執行之前和之后的動作

在C和C++程序中,main 函數之前和之后執行的函數是由編譯器、鏈接器和運行時環境共同決定的。以下是一些通常會在這些階段執行的關鍵函數:

main 函數之前執行的函數

  1. 啟動代碼(Start-up Code):
    • 這是由編譯器提供的一段代碼,通常在程序的入口點(比如C中的 _start 或C++中的 __libc_start_main)調用 main 之前執行。
    • 該代碼負責初始化程序執行環境,包括堆、棧和全局變量等。
  2. 全局和靜態變量的構造函數(僅C++):
    • 在C++中,全局和靜態對象的構造函數在 main 函數執行之前被調用。
  3. 靜態初始化(Static Initialization):
    • 對全局變量和靜態變量進行靜態初始化,也就是在程序開始執行時,按照它們聲明的順序對它們進行初始化。
  4. 動態鏈接庫的初始化(如果使用動態鏈接):
    • 如果程序依賴于動態鏈接庫,那么在 main 函數執行前,相關的動態鏈接庫會被加載和初始化。

main 函數之后執行的函數

  1. 全局和靜態變量的析構函數(僅C++):
    • 在C++中,程序執行結束后(即 main 返回后),全局和靜態對象的析構函數會被調用。
  2. 終止代碼(Termination Code):
    • 類似于啟動代碼,終止代碼負責清理運行時環境,確保資源得到正確釋放,比如關閉文件和網絡連接,回收內存等。
  3. exit 函數:
    • 在C和C++中,exit() 函數可以被用來終止程序,它會導致標準庫的清理(例如調用注冊給 atexit() 的函數)。
  4. 動態鏈接庫的卸載:
    • 如果程序使用動態鏈接庫,那么在程序結束時,這些庫可能會被操作系統卸載。

這些函數和代碼塊的具體實現細節可能因編譯器和操作系統的不同而有所差異,但它們構成了C/C++程序正常運行的基礎架構。

下面是一個簡單的 C++ 示例,演示了程序執行前后的動作:

#include <iostream>
#include <cstdlib>// 全局對象類
class GlobalObject {
public:GlobalObject() {std::cout << "GlobalObject constructor\n";}~GlobalObject() {std::cout << "GlobalObject destructor\n";}
};// 定義一個全局對象
GlobalObject globalObject;// atexit 注冊函數
void exitFunction() {std::cout << "atexit registered function\n";
}int main() {std::cout << "Main function\n";// 注冊 atexit 函數std::atexit(exitFunction);return 0;
}

在這個示例中,程序執行前的動作包括:

  1. 全局對象 globalObject 的構造,輸出 “GlobalObject constructor”。
  2. atexit 函數注冊 exitFunction,用于在程序退出時執行,但在 main 函數執行之前。

程序執行后的動作包括:

  1. main 函數執行,輸出 “Main function”。
  2. atexit 注冊函數 exitFunctionmain 函數執行完畢后被調用,輸出 “atexit registered function”。
  3. 全局對象 globalObject 的析構,在程序退出時被析構,輸出 “GlobalObject destructor”。

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

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

相關文章

DIYP對接駱駝后臺IPTV管理,退出菜單中顯示用戶名已經網絡信息,MAC,剩余天數,套餐名稱等

演示&#xff1a;https://url03.ctfile.com/f/1779803-1042599473-4dc000?p8976 (訪問密碼: 8976) 后臺加上EPG&#xff0c;增加一些播放源的動態端口替換。 前臺app上&#xff0c;退出菜單中顯示用戶名已經網絡信息&#xff0c;MAC&#xff0c;剩余天數&#xff0c;套餐名稱…

Python知識點17---包

提前說一點&#xff1a;如果你是專注于Python開發&#xff0c;那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了&#xff0c;而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python的包&#xff0c;你可以把它看成是一個大的模塊&#xff0c;它…

JAVA基礎|多線程

什么是線程&#xff1f; 線程&#xff08;Thread&#xff09;是一個程序內部的一條執行流程。 多線程是什么&#xff1f; 多線程是指從軟硬件上實現的多條執行流程的技術&#xff08;多條線程由CPU負責調度執行&#xff09; 一. 如何在程序中創建出多條線程&#xff1f; Ja…

新接手業務的線上Bug特別多怎么辦?

文章目錄 接手&#xff1a;保證質量順利過渡緊急質量審計臨時增加測試頻次灰度發布加強監控與預警建立快速反饋機制 打補丁&#xff1a;針對性解決質量問題Bug 分析與分類測試策略優化環境一致性 搞基建&#xff1a;全流程質量控制需求分析與評審設計階段的評審與驗證代碼質量控…

Windows10系統中安裝與配置PyTorch(無GPU版本)

文章目錄 1. 什么是PyTorch2. PyTorch的安裝與配置&#xff08;無GPU&#xff09;2.1 創建環境2.2 安裝pytorch庫&#xff08;無GPU&#xff09;2.3 驗證安裝結果 1. 什么是PyTorch PyTorch 是一種用于構建深度學習模型且功能完備的開源框架&#xff0c;通常用于處理圖像識別和…

JVM學習-自定義類加載器

為什么要自定義類加載器 隔離加載類 在某些框架內進行中間件與應用的模塊隔離&#xff0c;把類加載到不同的環境&#xff0c;如Tomcat這類Web應用服務器&#xff0c;內部自定義了好幾種類加載器&#xff0c;用于隔離同一個Web應用服務器上的不同應用程序 修改類加載的方式 …

OpenCV 的幾種查找圖像中輪廓邊緣的方法

原始圖片&#xff1a; 1、Sobel() Sobel 算子結合了高斯平滑和微分&#xff0c;用于計算圖像的梯度&#xff0c;從而突出顯示邊緣。 import cv2# 讀取圖像 image cv2.imread(image.png, cv2.IMREAD_GRAYSCALE)# 使用 Sobel 算子查找水平和垂直邊緣 sobel_x cv2.Sobel(image…

建筑企業有閑置資質怎么辦?

如果建筑企業擁有閑置資質&#xff0c;可以考慮以下幾種方式來充分利用這些資質&#xff1a; 1. 租賃或轉讓資質&#xff1a; 將閑置的建筑資質租賃給其他企業或個人使用&#xff0c;或者通過轉讓的方式將資質出售給有需要的企業或個人。 2. 提供咨詢服務&#xff1a; 利用建…

git分布式版本控制系統(四)

目前世界上最先進的分布式版本控制系統 官方網址&#xff1a;https://git-scm.com 學習目標&#xff1a; 1 了解 git 前世今生 2 掌握 git 基礎概念、基礎操作 3 各種 git 問題處理 4 互聯網常用 gitflow(工作流程規范) 5 git 代碼提交規范 6 git 分支管理及命名規范 常見問…

OneForall工具的下載安裝和使用(Windows和Linux)

目錄 OneForall的介紹 OneForall的下載 OneForall的安裝 安裝要求 安裝步驟&#xff08;git 版&#xff09; 安裝&#xff08;kali&#xff09; OneForall的使用命令 在Windows 在Linux&#xff08;kali&#xff09; OneForall的結果說明 免責聲明 本文所提供的文字和…

車輛前向碰撞預警系統性能要求和測試規程

前言 本文整理《GB/T 33577-2017 智能運輸系統-車輛前向碰撞預警系統性能要求和測試規程》國標文件關鍵信息,FCW系統性能和測試右給深層次的認識。 術語和定義 車輛前向碰撞預警系統 forward vehicle collision warning system自車 subject vehicle(SV)目標車輛 target ve…

【Linux】查找和壓縮

一、文件查找 1、命令查找 which 2、文件查找、依賴數據庫 locate 3、文件查找 find 語法&#xff1a;find [path] [options] [expression] [action] ①按文件名 -name按名 -iname可不區分大小寫 ②按文件大小 5M&#xff1a;5M以上文件 5M&#xff1a;5M文件 -…

高中數學:解三角形相關公式總結及用法總結

一、正弦定理 二、余弦定理 三、三角形面積公式 由正弦定理&#xff0c;可以推出三角形的面積公式&#xff1a; S*ab*sinC S*ac*sinB S*bc*sinA 四、使用方法總結 五、練習 例題1 解析 對條件等式進行變形&#xff0c;結合余弦定理&#xff0c;求出∠A的度數&#xff0c;從而…

【面經分享-CPP篇】[建議收藏!!] C++基礎20問-01

&#x1f36d; 大家好這里是清隆學長 &#xff0c;一枚熱愛算法的程序員 ? 本系列打算持續跟新c面試基礎 &#x1f44f; 感謝大家的訂閱? 和 喜歡&#x1f497; 文章目錄 1.題目&#xff1a;解釋C中的RAII機制。2.題目&#xff1a;解釋C中的智能指針及其類型。3.題目&#xf…

從內存到sql的upsert

業務的upsert ? 在寫業務時&#xff0c;大家一開始都會以順序流程的方式開始著手寫代碼&#xff0c;CR時再看代碼&#xff0c;會有不一樣的感覺。 1. 需求描述 ? 現有一張數據庫表&#xff0c;表字段結構如下&#xff1a; 字段名稱類型描述uuidstring數據的唯一鍵datastrin…

代碼隨想錄算法訓練營第四十六天|KM52. 攜帶研究材料、518. 零錢兌換 II、377. 組合總和 Ⅳ

代碼隨想錄算法訓練營第四十六天 KM52. 攜帶研究材料 題目鏈接&#xff1a;KM52. 攜帶研究材料 確定dp數組以及下標的含義&#xff1a;j的含義是當前背包的最大容量&#xff0c;dp[j]背包內物品的總價值確定遞推公式&#xff1a;背包最大容量固定為j&#xff0c;每個循環嘗試…

Nginx01-HTTP簡介與Nginx簡介(安裝、命令介紹、目錄介紹、配置文件介紹)

目錄 HTTP簡介HTTP原理查看訪問網站的詳細流程curl -vwget --debug 查看網站訪問量HTTP協議版本HTTP協議交互HTTP 請求請求報文起始行請求頭 HTTP響應響應報文起始行響應頭 Nginx常見的Web服務常見網站服務 安裝NginxNginx目錄結構Nginx啟動管理Nginx常用命令 Nginx配置文件主配…

國內外主流大模型語言技術大比拼

國內外主流大模型語言技術對比 2024 自2017年起&#xff0c;美國深度布局人工智能&#xff0c;全面融入經濟、文化與社會。至2023年&#xff0c;中國憑借自研技術平臺嶄露頭角&#xff0c;ChatGPT及其技術成國家戰略焦點&#xff0c;引領未來科技浪潮。中美競逐&#xff0c;人工…

Milvus向量數據庫:開啟向量搜索新紀元

Milvus向量數據庫&#xff1a;開啟向量搜索新紀元 隨著人工智能和機器學習技術的飛速發展&#xff0c;向量數據在各個領域的應用越來越廣泛&#xff0c;如推薦系統、自然語言處理、計算機視覺等。在這樣的背景下&#xff0c;如何高效地存儲、查詢和管理向量數據成為了一個重要的…

香橙派 AI pro:AI 加速初體驗

香橙派 AI pro&#xff1a;AI 加速初體驗 在AI領域&#xff0c;不斷涌現的硬件產品為開發者提供了前所未有的便利和可能性。今天&#xff0c;我要介紹的這款產品——香橙派 AIpro&#xff0c;就是其中的佼佼者。在昇騰 AI 芯片的加持下&#xff0c;這款開發板有著出色的算力。…