軟件運行原理 - 內存模型 - 棧內存

說明

  • C/C++軟件運行時,內存根據使用方式的不同分為堆內存和棧內存,棧內存使用有以下特征:
  1. 棧內存使用(申請、釋放)由系統自動分配和釋放,程序員不用做任何操作。
  2. 棧內存重復使用,進入函數時數據入棧,函數執行完數據出棧。
  • 函數中的局部變量以及實參保存在棧內存中。

內存模型

image

  • 棧內存處于進程虛擬內存的高地址,從高往低擴展。
  • 堆內存處于進程虛擬內存的低地址,從低往高擴展。

原理

  • 在數據結構領域,棧是一種僅在尾部進行插入或刪除操作的線性表,以后進先出的規則管理數據,先進入的數據被壓入棧底,最后的數據在棧頂,壓入數據叫做入棧,彈出數據叫做出棧。
  • 函數調用關系也是一種棧的形式,先進后出,第一個函數(main)最后執行完,末端函數最先執行完。
  • 因此使用棧的形式來管理函數調用中的臨時內存使用(局部變量等)是非常合適的,而非臨時的內存使用則需要通過另外一種方式(堆內存)來管理,所以系統將進程的虛擬內存劃分為棧內存和堆內存。
  • 棧內存和堆內存本質上就是一塊內存空間,只是不同的使用方式而已,對于編譯器就是不同的使用規范。

操作單元

  • 入棧,出棧的操作單元并不是單個變量,而是整個函數,整個函數所需棧內存大小在編譯時就能確認,入棧和出棧都是以整個函數需要的棧內存大小為單位一次性擴大/縮小棧內存空間。
  • 以及其它使用考量,例如:函數調用棧回溯等,操作單元不僅僅是函數臨時變量(局部變量,實參等)所需的棧內存空間,編譯器還會保存一些其它信息,例如:為了解決函數調用棧中間函數跳轉問題,需要將LR保存在棧中。
  • 整個操作單元就叫做棧幀。

棧幀(Stack Frame)

  • 每一次函數調用,都會在棧內存上維護一個獨立的棧幀(stack frame),棧幀大小是編譯時確認的,就是該函數需要占多少棧空間.每個獨立的棧幀一般包括:
  1. 函數參數
  2. 臨時變量: 包括函數的非靜態局部變量以及編譯器自動生成的其他臨時變量
  3. 函數調用的上下文,例如:幀指針(Frame Pointer)和返回地址(LR)等

入棧、出棧操作

  • 不同平臺,函數調用的入棧和函數結束的出棧操作有細微差別,ARMV8平臺操作。

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

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

相關文章

什么是特征圖?

在卷積神經網絡(CNN)中,特征圖是在傳遞給卷積層的圖像上發生卷積操作后卷積層的輸出。 特征圖是如何形成的? 在上面的插圖中,我們可以看到特征圖是如何從提供的輸入圖像中形成的。 要發送到卷積層的圖像是一個包含像…

AutoSAR(基礎入門篇)1.2-AutoSAR的發展史

目錄 一、AutoSAR成員 二、AutoSAR歷史發展 三、未使用AutoSAR前的缺點 1、原始狀態

JavaScript 和 HTML DOM 參考手冊

JavaScript 和 HTML DOM 參考手冊 js的變量類型有字符串,布爾等 在操作這些變量類型的時候,可以將他們看成是對象來操作 因為js 把一切都封裝成對象來看 獲取字符串的長度 var str hello world; console.log(str.length); //11 console.log(str.substr(0,5)); // hello c…

微服務網關組件Gateway實戰

1. 需求背景 在微服務架構中,通常一個系統會被拆分為多個微服務,面對這么多微服務客戶端應該如何去調用呢?如果根據每個微服務的地址發起調用,存在如下問題: 客戶端多次請求不同的微服務,會增加客戶端代碼…

聚首引領行業風潮!聚首品牌聯動資源價值平臺發布會正式啟航

2023年12月10日,由杭州建筑裝飾學會、浙江聚首聯優材料科技有限公司主辦,天尚設計集團、公和設計集團、銘揚工程設計集團、地標設計集團、上宸工程設計集團、華坤建筑設計院、廣廈建筑設計研究院、上海傳承博華建筑規劃設計院、航冠工程設計院、浙江鴻能…

Github項目-CNNResnet9-殘差神經網絡水果多分類項目

ResNet-論文全文完整翻譯注解 - 知乎 你必須要知道CNN模型:ResNet - 知乎 #!/usr/bin/env python # coding: utf-8 #https://github.com/SehajS/cnn-resnet-fruit-classification # # Classifying Fruits from their Images # # This project aims at creating a…

設計模式——建造者模式(創建型)

引言 生成器模式是一種創建型設計模式, 使你能夠分步驟創建復雜對象。 該模式允許你使用相同的創建代碼生成不同類型和形式的對象。 問題 假設有這樣一個復雜對象, 在對其進行構造時需要對諸多成員變量和嵌套對象進行繁復的初始化工作。 這些初始化代碼…

Python3開發環境的搭建

1,電腦操作系統的確認 我的是win10、64位的,你們的操作系統可自尋得。 2,Python安裝包的下載 (1)瀏覽器種輸入網址:https://www.python.org 選擇對應的系統(我的是win10/64位) &#xf…

設計模式(二)-創建者模式(5)-建造者模式

一、為何需要建造者模式(Builder)? 在軟件系統中,會存在一個復雜的對象,復雜在于該對象包含了很多不同的功能模塊。該對象里的各個部分都是按照一定的算法組合起來的。 為了要使得復雜對象里的各個部分的獨立性,以及…

騰訊物聯網平臺之規則引擎

1.騰訊物聯網平臺簡介 騰訊云物聯網開發平臺(IoT Explorer)為客戶提供便捷的物聯網開發工具與服務,助力客戶更高效的完成設備接入,并為客戶提供物聯網應用開發及場景服務能力,幫助客戶高效、低成本構建物聯網應用。 ?…

SpringBoot集成系列--RabbitMQ

文章目錄 一、代碼1、添加依賴2、配置RabbitMQ連接3、RabbitMQ配置4、創建生產者5、創建消費者6、測試 二、遇到的問題1、Channel shutdown2、收不到信息3、安裝RabbitMQ&#xff0c;無法訪問控制臺訪問 一、代碼 1、添加依賴 在pom.xml文件中添加RabbitMQ的相關依賴 <de…

uniapp flex:1不生效

包裹view頂層 不能添加 display: flex;<template><view class"container"><tHeader :title"采購管理" :showScrollTar"true" :scroll"scroll" :tabList"tabList" :isFixed"true"change"chang…

<軟考高項備考>《論文專題 - 2 項目選材》

1 AI輔助寫作 AI技術輔助論文寫作包括&#xff1a; 1、百度-文心一言 2、阿里-千義通問 3、科大訊飛-星火認知大模型 4、騰訊-混元大模型 5、ChatGPT 可以輔助論文的選題&#xff0c;架構理論部分的思路&#xff0c;熟悉了解項目中的難點和痛點&#xff0c;拓寬論文的寫作思路…

跟我學c++高級篇——靜態反射實現之二函數接口實現

一、函數反射 在實際的編程中&#xff0c;類和結構體應用最多&#xff0c;但也最難。這里先分析函數反射&#xff0c;類和結構體放到后面在分析。函數是什么&#xff1f;其實在PC看來就是一個地址&#xff0c;在編譯順看來就是一個符號&#xff08;廢話啊&#xff09;。函數反…

Leetcode—228.匯總區間【簡單】

2023每日刷題&#xff08;五十六&#xff09; Leetcode—228.匯總區間 解題思路 我們可以用雙指針left 和 right找出每個區間的左右端點。 遍歷數組&#xff0c;當right 1< n 且 nums[right1]nums[right]1 時&#xff0c;指針right向右移動&#xff0c;否則區間 [left, …

Mysql8和Oracle實際項目中遞歸查詢樹形結構

背景&#xff1a; 項目升級&#xff0c;引入MySQL數據庫&#xff0c;之前一直用的是Oracle數據&#xff0c;在做用戶登錄單位維護的時候&#xff0c;需要返回該用戶所屬單位下的所有子單位。下邊是模擬項目數據實踐的過程。 數據準備&#xff1a; 準備一張單位表&#xff0c…

Flask存儲在內存中的密鑰被讀取

局限性&#xff1a;查找的密鑰具有特征碼 一、Flask環境源碼 1.Flask主文件main.py import os import uuid from flask import Flask, request, session, render_template from cat import catflag "" app Flask(__name__,static_url_path/,static_folderstatic …

51.Go操作kafka示例(kafka-go庫)

文章目錄 一、簡介二、生產者三、消費者 代碼地址&#xff1a;https://gitee.com/lymgoforIT/golang-trick/tree/master/31-kafka-go 一、簡介 之前已經介紹過一個操作kafka的go庫了&#xff0c;28.windows安裝kafka&#xff0c;Go操作kafka示例&#xff08;sarama庫&#xf…

二叉搜索樹的最近公共祖先【數據結構】

二叉搜索樹的最近公共祖先 題目描述 給定一棵二叉搜索樹的先序遍歷序列&#xff0c;要求你找出任意兩結點的最近公共祖先結點&#xff08;簡稱 LCA&#xff09;。 輸入 輸入的第一行給出兩個正整數&#xff1a;待查詢的結點對數 M&#xff08;≤ 1 000&#xff09;和二叉搜索…

基于JavaWeb+SpringBoot+Vue在線拍賣系統的設計和實現

基于JavaWebSpringBootVue在線拍賣系統系統的設計和實現 源碼獲取入口Lun文目錄前言主要技術系統設計功能截圖訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 Lun文目錄 摘 要 1 Abstract 1 1 系統概述 4 1.1 概述 4 1.2課題意義 4 1.3 主要內容 4 2 …