1. c++中的類和實例分別存儲在什麼地方
類不會儲存在什麼地方,只是告訴程序,如何去創建這個類型的變數、需要多少個位元組、以及如何銷毀等等等。
至於實例,也可以說對象,在什麼地方,就是我們通常說的堆棧。拋開全局常量區以及靜態存儲區這些不談。
如果你new了一個對象(還有其他的c的分配方式,比如malloc不推薦使用),這種就屬於動態分配內存,分配在堆上。堆相對於棧很大,所以很多時候我們分配在堆上,但也意味著,你需要知道什麼時候去銷毀他,所以與delete或delete []成對出現。
Student stu; 類似於這樣的我們沒有使用new的對象就分配在了棧上。他的對象是自己管理的。在 {}函數體中的最後會自動按照棧的後進先出,銷毀對象。所以不需要你去管理對象的內存,但也意味著對象所在的生命周期通常就是一個{}中。
補充,堆除了比棧空間大,它是在程序運行時來分配內存的,比如分配
int * i = new i[ m] ; //m 是在程序運行後,從輸入中得到的數值。
但棧不可以,int i[ m ];//這里必須是常量 const int m = 1000; 在程序編譯的時候,他就必須知道數組有多大。
2. JAVA中類中的方法存儲在什麼地方
類載入時 方法信息保存在一塊稱為方法區的內存中, 並不隨你創建對象而隨對象保存於堆中。可參考《深入java虛擬機》前幾章。
另參考(他人文章):
如果instance method也隨著instance增加而增加的話,那內存消耗也太大了,為了做到共用一小段內存,Java 是根據this關鍵字做到的,比如:instance1.instanceMethod(); instance2.instanceMethod(); 在傳遞給對象參數的時候,Java 編譯器自動先加上了一個this參數,它表示傳遞的是這個對象引用,雖然他們兩個對象共用一個方法,但是他們的方法中所產生的數據是私有的,這是因為參數被傳進來變成call stack內的entry,而各個對象都有不同call stack,所以不會混淆。其實調用每個非static方法時,Java 編譯器都會自動的先加上當前調用此方法對象的參數,有時候在一個方法調用另一個方法,這時可以不用在前面加上this的,因為要傳遞的對象參數就是當前執行這個方法的對象。
3. java一個類在內存中是如何存儲的
關於您提出的問題,網路也有過這樣的回答了.那麼java的類定義完了之後在哪裡呢.當然一般一個類,當你沒有new的時候,也就是說並沒有在內存中分配地址,所以就像你說的無處存
4. (以C#為例)方法在內存中是如何存儲的
個int屬性會內聯存在堆上,內聯的意思就是對象的值類型屬性直接存儲在堆上,就是在堆上直接開一個32bit的空間.說到這好像也沒太大區別,但是和對象的存儲比較一下就清楚了.
如果有個對象的屬性和一個值類型的屬性:
classA
{
int v1;
classB v2;
}
那麼實例化classA的對象時,v1那個位置直接存一個32位int數
v2那個地方存的是在堆上另一個對象的位置,相當於一個32位指針.
static類型是程序載入時就分配內存的.
普通類型是需要時才分配.
static類型是整個類公用的,所有該類的實例共享的都是同一個變數
另外不需要實例化一個類型,就可以以 類名.成員 的方式訪問靜態成員
5. java中,靜態方法被調用是,存儲在內存的哪個區域是棧還是放大區還是兩者都有
在JDK8之前,靜態成員(靜態變數和靜態方法)都是存儲在方法區(永久代)中的靜態區中(這里指類被載入後,靜態成員的存儲位置)。但在JDK8之後,永久代被移除了,取而代之的是元空間(metaspace)。但元空間中存儲的主要是.class文件的元數據信息,靜態成員的存儲位置由方法區轉到了堆內存(heap)中。
不過,不管是JDK8,還是更早的版本中,靜態方法的執行(不僅僅是靜態方法,還有普通的成員方法)都是在棧內存(stack)中進行的。每個線程都會在棧內存中開辟一個棧,在調用方法時,對應的方法都會在執行這個方法的線程的棧中創建一個「棧幀」,棧幀中保存了局部變數表(基本數據類型和對象引用)、操作數棧、動態連接和返回地址等信息。等到方法執行完畢,棧幀被銷毀,對應的內存也將被釋放。
6. java中使用類創建對象後,該對象的方法在堆內存中是怎樣存儲的
方法不存在在堆內存中,是放在代碼區,只有在調用的時候,才會構建該方法的運行時環境,包括參數,局部變數等,當然,這些也都是在棧內存中的。對內存只存放被new出來的東西。
你可以讀讀編譯原理相關的書,這種問題就清楚了。
7. 類創建的對象中的方法存儲在什麼地方
象,創建它的方法是ADODB.connection.
8. c++中,如何自己定義一個類,儲存在哪裡,什麼格式,如何調用,請說詳細一點,新手。
C++程序寫完成後,必定會有編繹器幫助你做以下事情,編繹源程序,鏈接其他可能調用的文件(一般都是用include ,如#include <iostream.h>,就是該文件會調用到iostream.h這個文件,裡面會有介面實現標准輸入輸出,如果你也有寫類,也可以通過此處來鏈接到你想要的文件,以調用裡面的定義好的內容)最終生成一個可執行文件,比如最簡單的程序,輸出helloworld吧
#include <stdio.h> //不管C和C++都是一樣,用C打比方吧。此處作用告訴程序,當前文件會用到stdio.h這個文件
int main(){ //程序開始執行地方,開始程序執行的地方
printf("Hello World"); //調用stdio.h裡面的 void printf()這個方法,來實現輸出指定內容到
//DOS頁面,
return 0;//程序返回
}
這就是你定義的類如何被其他文件"調用"(應該說是使用)的原理,說儲存吧,實際上應該是定義。標准說法。
再說類吧,其實可能參考 int x = 0;這個
有沒有想過int 是什麼? 其實int有點類似類的使用,就是定義一個 變數x ,其類型為短整型的。
如類,class Hello(){} Hello y;類其實也是差不多,也是定義一個變數y,其類型為自己定義的類別Hello.僅此而且,在使用你定義的類型與前人提供的最基本類型都具有相似,都有其類型的限制性等 ,如int 型不能賦給帶有小數點的數,否則會丟失精度(前人的代碼定義好的)。你定義的也是一樣。 當你學習了計算機編繹原理、匯編、計算機組成原理後,會有一個更清晰的理解。大學學基本原理,以上學科也是有作用的,慢慢學習吧
9. java中一個類的方法是怎麼存儲的
java內存分析:
都是將內存分為三塊
第一塊內存區域是:棧
第二塊內存區域是:堆
第三塊內存區域是:方法區
棧空間里裝的都是局部變數
堆空間里裝的都是new出來的東西,特殊的對象 (非static修飾的全局變數是特殊的對象,在堆內存區域內)
方法區里裝的都是基本類型常量和字元串常量、static修飾的全局變數、代碼
10. Java構造函數(方法)存儲在jvm哪個內存里
存放到方法區當中;
new出來的是實例對象,實例對象才是存放在堆當中;
構造函數對應的是<init>方法,方法信息隨著類載入器載入到方法區當中。
棧:
以棧幀為單位,存放的不是方法具體的結構,只是通常一個方法對應一個棧幀,對應的入棧出棧就是棧幀的入棧出棧。棧幀中有局部變數表,操作數棧,方法返回地址,動態鏈接。其中局部變數表存放局部變數,包括形參,非靜態方法默認在第一個索引存放一個this變數;操作數棧用於操作局部變數表和一些值的運算,比如讀取表中變數的值進行運算,或存放相應的值到局部變數表中;方法返回地址則是用於記錄對應方法的下一條指令的地址;動態鏈接是符號引用變成的直接引用。
堆:
存放實例對象,在jdk7開始,還存放靜態變數和字元串常量池
方法區:
存放類元信息,比如完整類名全稱,public,abstract等修飾符,實現的介面有序列表等;方法信息,比如修飾符,返回類型等;JIT代碼緩存,也就是被即時編譯器編譯後的熱點代碼,用於提高性能;域信息,也就是屬性信息,比如修飾符,類型等;運行時常量池,位元組碼文件中常量池的運行時表現,類似符號引用的記錄,不過蘊含的信息更為豐富,而且具有動態性。jdk6及以前,還存放靜態變數,運行時常量池中還存放字元串常量池,到了jdk7則移到了堆中。