淺談堆和棧內存以及編程語言

淺談堆和棧內存以及編程語言

    • 棧和堆
    • C++ 和 C# 的區別:
    • C#
      • 總結
    • 編程語言
      • C++
      • 匯編語言(Assembly Language):
      • 機器語言(Machine Language):
    • 拓展
      • C#依賴注入(Dependency Injection)模式

棧和堆

棧和堆是計算機內存中用于存儲數據的兩種不同方式。它們在內存管理和分配方面有著不同的特點和用途。

  1. 棧(Stack):

    • 棧是一種用于存儲函數調用和局部變量的內存區域。它的管理方式是先進后出(Last-In-First-Out,LIFO)。
    • 棧的大小是固定的,并且在程序編譯時就已經確定。它通常擁有較小的容量。
    • 棧上存儲的數據是按照順序存放的,每個數據項占用固定的內存空間。
    • 棧的分配和釋放由編譯器自動處理,無需手動操作。
    • 局部變量、函數參數、函數調用和返回值等都存儲在棧上。
  2. 堆(Heap):

    • 堆是一種用于動態分配內存的內存區域。它的管理方式是根據需要進行分配和釋放。
    • 堆的大小可以根據需求進行動態調整,通常比棧更大。
    • 堆上存儲的數據項可以根據需要進行動態分配和釋放,沒有固定的存儲順序。
    • 堆的分配和釋放需要手動進行操作,開發人員需要負責管理內存的分配和釋放,以避免內存泄漏和懸掛指針等問題。
    • 動態分配的對象、大型數據結構和使用 newmalloc 創建的內存塊都存儲在堆上。

在C++和C#中,棧和堆的概念是相似的,但在語言特性和內存管理方面有一些不同之處。

C++ 和 C# 的區別:

  • C++ 是一種編譯型語言,而 C# 是一種托管語言(managed language)。
  • C++ 支持手動內存管理,包括對棧和堆的直接控制。開發人員需要手動分配和釋放內存,使用 newdelete 運算符。
  • C# 是一種自動內存管理的語言,使用垃圾回收機制(Garbage Collection)來自動處理內存分配和釋放。開發人員無需手動釋放內存,不需要關心內存泄漏和懸掛指針等問題。
  • C# 中的對象通常分配在堆上,通過引用(reference)進行訪問。而在 C++ 中,對象可以分配在棧上或堆上,可以直接通過指針或引用進行訪問。
  • C# 提供了更高級的語言特性和框架,如事件處理、屬性、委托、LINQ 等,使開發過程更加簡化和高效。C++ 則更接近底層,提供更多對內存和硬件的直接控制。

C#

然而C# 本身并非一個虛擬機,而是一種編程語言。C# 通常與 .NET Framework 或 .NET Core 運行時關聯,而這些運行時環境是基于虛擬機技術的。

當使用 C# 編寫的代碼被編譯為中間語言(Intermediate Language,IL)后,它可以在 .NET Framework 或 .NET Core 運行時中執行。這些運行時環境提供了一個稱為公共語言運行時(Common Language Runtime,CLR)的虛擬機,用于執行 IL 代碼。

公共語言運行時(CLR)是 .NET Framework 和 .NET Core 中的關鍵組件,它提供了許多功能,包括內存管理、垃圾回收、類型安全性、異常處理、線程管理等。CLR 的主要任務是將 IL 代碼轉換為機器代碼并執行它。

在運行時,CLR 負責加載和執行程序集(包含 IL 代碼的文件),并提供必要的資源和服務來支持應用程序的執行。CLR 還負責內存管理,包括對象的分配和回收,使用垃圾回收器來自動處理不再使用的對象的內存釋放。

因此,雖然 C# 本身不是虛擬機,但與 .NET Framework 或 .NET Core 運行時環境結合使用時,可以通過公共語言運行時(CLR)作為虛擬機來執行 C# 代碼。CLR 提供了跨平臺的運行時環境,使得 C# 代碼可以在不同的操作系統上運行,并提供了許多功能和服務來簡化開發過程。


總結

總的來說,棧和堆是用于存儲數據的不同內存區域,其主要區別在于管理方式、大小和分配方式。C++ 和 C# 在內存管理和語言特性方面有所不同,C# 提供了自動內存管理和更高級的語言特性,而 C++ 具有更多的底層控制和手動內存管理的能力。


編程語言

C# 是一種高級編程語言,它運行在公共語言運行時(Common Language Runtime,CLR)之上。在 CLR 之下,有一些更底層的編程語言和技術,用于實現 CLR 和底層系統交互。

C++

本地托管代碼(Native Managed Code):

  • 本地托管代碼是指直接與底層系統交互的代碼,通常使用 C++ 編寫,并且通過平臺調用(Platform Invocation)等技術與底層 API 進行交互。
  • C++ 可以直接訪問硬件和操作系統的特性,提供了更底層的控制和性能優化的機會。
  • 本地托管代碼通常用于處理復雜的系統級任務、性能敏感的操作和底層資源管理等。

以下是 C++ “Hello, World!” 示例:

#include <iostream>int main()
{std::cout << "Hello, World!" << std::endl;return 0;
}

匯編語言(Assembly Language):

  • 匯編語言是一種更接近底層的語言,與特定的處理器架構直接交互。
  • 匯編語言使用助記符(mnemonics)表示機器指令,可以直接操作寄存器、內存和其他底層硬件資源。
  • 匯編語言通常與特定的處理器架構密切相關,具有高度的可移植性和性能優化的潛力。

以下是 x86 匯編語言的 “Hello, World!” 示例:

section .datahello db 'Hello, World!', 0section .textglobal _start_start:mov edx, 13mov ecx, hellomov ebx, 1mov eax, 4int 0x80mov eax, 1int 0x80

機器語言(Machine Language):

  • 機器語言是計算機硬件直接理解和執行的語言,由二進制代碼表示。
  • 機器語言指令是特定處理器的原始指令集,用于執行底層操作和控制硬件。
  • 編寫和理解機器語言需要對底層硬件結構和指令集有深入的了解。

由于機器語言是二進制代碼,沒有直接可讀的示例。

這些是 C# 向下的一些底層語言和技術層次。它們提供了不同的抽象級別和底層控制能力,用于處理更底層的任務和與底層系統交互。

拓展

C#依賴注入(Dependency Injection)模式

在靜態方法本身不會占用過大量內存,因為它們存儲在共享內存區域中,并且在應用程序的整個生命周期內只創建一次。靜態方法的內存消耗是固定的,與靜態方法的數量和調用頻率無關。

然而,靜態方法的設計可能導致一些問題,如難以進行單元測試、代碼的可測試性差、緊密耦合等。這些問題可能與靜態方法直接創建和持有其依賴項有關。

通過依賴注入(Dependency Injection)模式,我們可以解決這些問題,并減少對靜態方法的依賴。依賴注入通過將依賴項從類的內部創建轉移到外部,以解耦和提高代碼的可測試性。

在使用依賴注入時,我們可以使用容器(如.NET Core 中的 DI 容器)來管理依賴項的創建和生命周期。容器負責創建所需的對象,并將其傳遞給需要它們的類。

通過使用依賴注入容器,我們可以避免在代碼中顯式使用 new 關鍵字來創建對象,從而減少對靜態方法的依賴。相反,我們只需要在類的構造函數或方法參數中聲明依賴項,容器將負責創建并注入所需的對象。

下面是一個簡單的示例,演示如何使用依賴注入容器來管理依賴項:

public interface IService
{void DoSomething();
}public class Service : IService
{public void DoSomething(){Console.WriteLine("Doing something...");}
}public class MyClass
{private readonly IService _service;public MyClass(IService service){_service = service;}public void UseService(){_service.DoSomething();}
}public class Program
{public static void Main(){// 創建依賴注入容器var container = new Container();// 注冊依賴項container.Register<IService, Service>();// 從容器中解析 MyClass 實例var myClass = container.Resolve<MyClass>();// 使用 MyClassmyClass.UseService();}
}

在上面的示例中,我們使用了一個簡化的 Container 類代表依賴注入容器。通過注冊接口 IService 和實現類 Service,我們告訴容器如何創建 IService 的實例。

然后,通過調用容器的 Resolve 方法,我們從容器中解析出 MyClass 的實例。容器會自動創建 IService 的實例并注入到 MyClass 的構造函數中,我們不再需要顯式調用 new 來創建對象。

通過使用依賴注入容器,我們可以將對象的創建和生命周期的管理交給容器處理。這樣,我們可以避免在代碼中直接使用 new 來創建對象,從而減少對靜態方法的依賴,并且更方便地進行單元測試、解耦和擴展。

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

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

相關文章

2018年全國碩士研究生入學統一考試管理類專業學位聯考數學試題——解析版

文章目錄 2018 年考研管理類聯考數學真題一、問題求解&#xff08;本大題共 5 小題&#xff0c;每小題 3 分&#xff0c;共 45 分&#xff09;下列每題給出 5 個選項中&#xff0c;只有一個是符合要求的&#xff0c;請在答題卡上將所選擇的字母涂黑。真題&#xff08;2018-01&a…

DRF-項目-(1):構建純凈版的drf項目,不再使用django的后臺管理,django的認證,django的session等功能,作為一個純接口項目

項目的目錄結構&#xff1a; -HeartFailure |-- apps |--user |--HeartFailure |-- static |--manage.py 一、django項目相關的 1、命令行中創建django項目 #1、切換到指定的虛擬環境中 workon my_drf#2、該虛擬環境已經安裝好django和rest_framework了 django-admin startp…

補充:linux rsyslog配置多端口監聽(基于UDP)

rsyslog默認udp監聽端口為514,我們可以配置rsyslog基于udp的多端口監聽,實現監控的豐富性 1.環境信息 環境信息 HostnameIpAddressOS versionModuleNotersyslog1192.168.10.246Red Hat Enterprise Linux Server release 7.7 (Maipo)rsyslogd 8.24.0-38.el7linux基礎配置 Li…

④【Set】Redis常用數據類型: Set [使用手冊]

個人簡介&#xff1a;Java領域新星創作者&#xff1b;阿里云技術博主、星級博主、專家博主&#xff1b;正在Java學習的路上摸爬滾打&#xff0c;記錄學習的過程~ 個人主頁&#xff1a;.29.的博客 學習社區&#xff1a;進去逛一逛~ Redis Set ④Redis Set 操作命令匯總1. sadd …

mysql的聯合索引最左匹配原則問題

MySQL的聯合索引 聯合索引的最左匹配原則會一直向右匹配直到遇到范圍查詢(>、<、between、like) 就會停止匹配。 這個結論并不全對&#xff01;去掉 「between 和 like 」這個結論就沒問題了 經過實驗的證明&#xff0c;我得出的結論是這樣的&#xff1a; 聯合索引的最…

【計算機網絡學習之路】TCP socket編程

文章目錄 前言一. 服務器1. 初始化服務器2. 啟動服務器 二. 客戶端三. 多進程服務器結束語 前言 本系列文章是計算機網絡學習的筆記&#xff0c;歡迎大佬們閱讀&#xff0c;糾錯&#xff0c;分享相關知識。希望可以與你共同進步。 本篇博客基于UDP socket基礎&#xff0c;介紹…

Oracle的控制文件多路復用,控制文件備份,控制文件手工恢復

一.配置控制文件多路復用 1.查詢Oracle的控制文件所在位置 SQL> select name from v$controlfile;NAME -------------------------------------------------------------------------------- /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/fast_recovery_a…

【docker】docker總結

一、Docker簡介 Docker是開源應用容器引擎&#xff0c;輕量級容器技術。基于Go語言&#xff0c;并遵循Apache2.0協議開源Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中&#xff0c;然后發布到任何流行的Linux系統上&#xff0c;也可以實現虛擬化容…

No matching variant of com.android.tools.build:gradle:7.4.2 was found.

一、報錯信息 創建個新項目&#xff0c;運行直接報錯&#xff0c;信息如下&#xff1a; No matching variant of com.android.tools.build:gradle:7.4.2 was found. The consumer was configured to find a runtime of a library compatible with Java 8, packaged as a jar,…

shell 條件語句

目錄 測試 test測試文件的表達式 是否成立 格式 選項 比較整數數值 格式 選項 字符串比較 常用的測試操作符 格式 邏輯測試 格式 且 &#xff08;全真才為真&#xff09; 或 &#xff08;一真即為真&#xff09; 常見條件 雙中括號 [[ expression ]] 用法 &…

springboot啟動過程

1、SpringApplication new一個對象會優先調用initialize方法 public SpringApplication(Object... sources) {initialize(sources); } private void initialize(Object[] sources) {//添加配置類SpringBootApplicationif (sources ! null && sources.length > 0) …

關于一些bug的解決1、el-input的輸入無效2、搜索之后發現數據不對3、el多選框、單選框點擊無用4、

el-input輸入無效 原來的代碼是 var test null 但是我發現不能輸入任何值 反倒修改test的初始值為123是可以的 于是我確定綁定沒問題 就是修改的問題 于是改成 var test ref&#xff08;&#xff09; v-model綁定的值改成test.value就可以了 因為ref是相應式的 可以通過輸入…

【算法】奇偶游戲(帶權并查集)

題目 小 A 和小 B 在玩一個游戲。 首先&#xff0c;小 A 寫了一個由 0 和 1 組成的序列 S&#xff0c;長度為 N。 然后&#xff0c;小 B 向小 A 提出了 M 個問題。 在每個問題中&#xff0c;小 B 指定兩個數 l 和 r&#xff0c;小 A 回答 S[l~r] 中有奇數個 1 還是偶數個 …

cocos2dx ??Animate3D(三)

一些總結 動作&#xff08;Actions&#xff09; move移動&#xff1a;moveto/moveby 從一個位置移動到另外一個位置 從一個位置移動多少數量級rotate旋轉&#xff1a;rotateto/rotateby 從一個角度旋轉到另外一個角度 旋轉多少個數量級scale縮放&#xff1a;scaleto/scaleby …

vue實現瀏覽器禁止鼠標選中文字禁止右鍵禁止F12鍵

1. 禁止鼠標選中文字 document.onselectstart new Function("event.returnValuefalse");2.禁止右鍵 document.oncontextmenu new Function("event.returnValuefalse");3. 禁止F12鍵 document.addEventListener("keydown", function (e) {if…

Go語言多線程爬蟲萬能模板它來了!

對于長期從事爬蟲行業的技術員來說&#xff0c;通過技術手段實現抓取海量數據并且做到可視化處理&#xff0c;我在想如果能寫一個萬能的爬蟲模板&#xff0c;后期遇到類似的工作只要套用模板就能解決大部分的問題&#xff0c;如此提高工作效率何樂而不為&#xff1f; 以下是一個…

有關Vue、微信小程序、UniApp中的CSS中的寬度width單位、自適應

在Vue中&#xff0c;可以使用以下單位來設置寬度&#xff08;width&#xff09; 像素&#xff08;px&#xff09;&#xff1a;最常用的單位&#xff0c;表示一個絕對長度單位。例如&#xff0c;width: 200px; 表示寬度為200像素。百分比&#xff08;%&#xff09;&#xff1a;…

Mac自帶的看圖如何連續查看多張圖片

一、問題 mac看訪達里的圖片時&#xff0c;雙擊打開一張圖片&#xff0c;然后按上下左右鍵都沒法切換到另外的圖片。而且也沒找到像window一樣單擊縮略圖可以看到預覽圖。其實是自己不懂得怎么使用&#xff0c;哈哈哈&#x1f602; 二、方法 2.1、圖標方式 可以看到縮略圖&a…

新的centos7.9安裝jenkins(二)

更多ruoyi-nbcio功能請看演示系統 gitee源代碼地址 前后端代碼&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后臺管理系統 接上一節文章。 這個版本默認git也安裝好了&#xff0c;所以全局配置這個不需要了。 maven安裝3.9.3版本…

前綴和——DP35 【模板】二維前綴和

文章目錄 &#x1f34e;1. 題目&#x1f352;2. 算法原理&#x1f345;3. 代碼實現 &#x1f34e;1. 題目 題目鏈接&#xff1a;【模板】二維前綴和_牛客題霸_牛客網 (nowcoder.com) 描述 給你一個 n 行 m 列的矩陣 A &#xff0c;下標從1開始。 接下來有 q 次查詢&#xff0…