編譯器如何將機器碼存儲在內存
⑴ c語言的基本類型在內存中怎麼儲存的
C語言的基本類型在內存中以二進制的形式儲存的。
1、整型數據:所有整數(正負零)在內存中都是以補碼的形式存在。對於一個正整數來說,它的補碼就是它的原碼本身。對於一個負整數來說,它的補碼為原碼取反再加1。
2、字元型數據:把字元的相對應的ASCII碼放到存儲碼單元中,而這些ASCII代碼值在計算機中同樣以二進制補碼的形式存放的。
3、實型數據:也叫浮點數,在計算機中也是以二進制的方式存儲,關鍵在於如何將十進制的小數轉化為二進制來表示。
擴展資料:
根據計算機的內部字長和編譯器的版本,C語言的基本類型表示的數的長度范圍是有限定的。十進制無符號整常數的范圍為0~65535,有符號數為-32768~+32767。八進制無符號數的表示範圍為0~0177777。十六進制無符號數的表示範圍為0X0~0XFFFF或0x0~0xFFFF。
如果使用的數超過了上述范圍,就必須用長整型數來表示。長整型數是用後綴「L」或「l」來表示的。長整數158L和基本整常數158在數值上並無區別。
⑵ 硬碟上有個程序,運行時要裝進內存,但程序代碼被裝入內存的什麼位置,是由什麼決定的
程序代碼被裝入內存的什麼位置,是由操作系統決定,沒有操作系統的電腦是不能運行軟體的。操作系統擁有管理內存的能力。
一個程序在系統內存中是這樣表示的:
/------------------\ 內存低地址
| |
| 文本 |
| |
|------------------|
| (已初始化) |
| 數據 |
| (未初始化) |
|------------------|
| |
| 棧 |
| |
\------------------/ 內存高地址
文本區域是由程序確定的, 包括代碼(指令)和只讀數據. 該區域相當於可執行文件的文本段. 這個區域通常被標記為只讀, 任何對其寫入的操作都會導致段錯誤。
數據區域包含了已初始化和未初始化的數據. 靜態變數儲存在這個區域中. 數據區域對應可執行文件中的data-bss段. 它的大小可以用系統調用來改變.如果bss數據的擴展或用戶棧把可用內存消耗光了, 進程就會被阻塞住, 等待有了一塊更大的內存空間之後再運行. 新內存加入到數據和棧段的中間.
棧是一個在計算機科學中經常使用的抽象數據類型. 棧中的物體具有一個特性:最後一個放入棧中的物體總是被最先拿出來, 這個特性通常稱為後進先出(LIFO)隊列.調用一個C函數就在這里發生一大堆的操作,如傳遞參數。。。。
這些和單片機有區別,很難簡單說清楚,可以寫一本書的了。
你學了<<操作系統原理>>,同時學習一下windows的編程就懂了。
注意了,程序在很多現代操作系統里都只能操作邏輯地址,不能操作物理地址,如A程序的0xFF地址和B程序的0xFF地址是不同的,大家都影射到不同的物理地址。這是為了防止程序錯誤地影響其他程序。
也就是將數據錯誤地寫入其他程序的重要區域,從而使其他程序結束在現在的多數操作系統是不會發生。
要資料就給我發郵件,我給你發一份。[email protected]
⑶ 程序代碼在內存中是怎樣放置的
一個程序至少有兩個段:數據段和代碼段。顧名思義數據段用來存放數據,也就是變數和數組之類,而代碼段則用來存放一個指令序列。這個指令序列就是編程語言匯編出來的最後結果,是一系列機器碼所表示的處理數據的步驟。CPU依次按照這個序列來處理數據,這就是程序的執行
⑷ 程序編譯後的機器碼是在內存,還是硬碟
程序編譯後,機器碼是存在硬碟。
在執行時,機器碼,被操作系統,讀入內存。
⑸ C語言哪些函數語句的機器碼會存儲在內存中
自然不會,每一個變數(包括函數)都有自己的生命周期,程序結束後釋放所有的內存,程序運行時只有被聲明為inline內聯函數,或者正在被調用的函數(也就是你上面收提及的第一種情況)存儲在內存中(棧區),調用完畢後立即釋放內存。
回答完畢,祝樓主學習進步。
⑹ V8編譯生成的機器碼究竟是什麼
實際上V8的JIT編譯器是直接在內存中生成機器碼的,並不會先生成文本形式的匯編然後再使用匯編器去轉換為機器碼。「動態生成機器碼」聽起來可能有點玄乎,其實根本沒啥,就是往內存里寫位元組,這些位元組正好是某些機器碼的意思,然後把這塊內存當作函數去調用就是了。由於代碼自身就是動態生成的,在生成的代碼里直接嵌入resolve好的各種值其實就相當於傳統編譯流程里的「動態鏈接」的效果。順手放倆我以前博客的傳送門:V8實際上自帶一個用C++實現的「匯編器庫」用來動態生成機器碼。它並不把文本形式的匯編轉換為機器碼,而是提供一組C++ API,調用這個API的函數就可以在內存里生成機器碼來。有興趣的同學可能會知道,V8的MacroAssembler庫源自Animorphic的Strongtalk VM,而Strongtalk VM也是HotSpot JVM的前輩。V8 Design Elements文檔里所描述的是最初期的V8的狀態。當時的V8隻有一個JIT編譯器,一個JavaScript函數通常只會被JIT編譯一次。這個JIT編譯器做的優化也不是很多。後來V8演化為擁有兩個JIT編譯器,一個初級編譯器(baseline compiler,名字叫做Full Code Generator,簡稱FullCodeGen),和一個優化編譯器(optimizing compiler,名字叫做Crankshaft),兩個編譯器結合在一次構成雙層編譯。JavaScript函數通常會先被FullCodeGen編譯,然後如果還繼續執行很多次的話則會再被Crankshaft重新編譯一遍,生成更優化的代碼。在這個架構中,FullCodeGen里生成的代碼還是跟V8 Design Elements的相似,會通過inline cache來實現property access;而這些inline cache不但用於實現fast property access,更重要的是它們會被用於收集profile,然後等到Crankshaft編譯的時候,它就可以看先前收集的profile來做profile-guided optimization。以這個 function foo(p) { return p.x } 為例,參數p沒有任何特別的地方,所以JavaScript引擎也無法知道p到底可能有怎樣的值。但通過FullCodeGen生成的代碼所收集到的profile信息,Crankshaft再去編譯 foo() 的時候就可以知道p之前通常指向一個Map(hidden class)為0x2c97ccb179d1的類型的對象。這個類型的constructor為Point、[[Prototype]] 為Point.prototype、對象里有足夠空間容納10個內嵌的欄位(in-object property),並且其中2個slot被用於存儲Smi類型,剩餘的8個slot未被使用。
⑺ 編譯器在編譯的時候做了什麼給申明的變數分配內存
編譯器在編譯的時候是不會聲明變數和分配內存的。 分配內存之類的是在運行時執行的。
一般編譯器在編譯的時候,只是做代碼的格式檢查, 然後將代碼轉換成機器碼或中間代碼。
⑻ c語言變數如何存儲在內存中
在系統為一個程序分配的空間中,分成許多段,比如有代碼段,存放程序可執行代碼,有數據段,可以分配變數,有常量段,專門存放常量,是只讀的。常量變數可以位於數據段中,仍然是變數,只是程序沒有改動許可權。在程序執行到main之前,系統負責將常量區存儲的常量賦值給常量。
⑼ C語言中結構體在內存中的存儲方式
結構體在內存中的存儲方式,和常規的C語言變數、常量存儲方式類似,唯的不同在於對齊。
只所以要進行數據對齊是因為編譯器對結構的存儲的特殊處理能提高CPU存儲變數的速度,一般來說,32位的CPU內存以4位元組對齊,64位的CPU的以8位元組的對齊。一般可以使用#pragma pack()來指出對齊的位元組數。比如下面的代碼,在debug會顯示結構體test的內存大小為28,如果生成release版則所佔內存大小為32 。
#include<stdio.h>
#ifdef_DEBUG
#pragmapack(4)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#else
#pragmapack(8)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#endif
intmain(void){
printf("%d ",sizeof(ss));
return0;
}
⑽ C語言是怎麼經過轉換將變數的值存儲在內存中的
C語言編譯器負責將源代碼中的十進制的10翻譯成4位元組數據:0A(16進制)(實際存儲為二進制,但描述起來太長不方便一般用16進制顯示和描述),而一個位元組的10實際上的二進制就是你說的00001010。
實際上在處理存儲之前需要先分配一個內存給變數 i,並在編譯環境中注冊登記這個變數名-地址關系(變數表),方便後續代碼訪問此變數時匹配到該地址,比如遇到 i=i+2時,編譯器就會生成一個指令對該地址的值進行+2操作。此外還需要生成一個MOV指令代碼指揮CPU執行:數據保存到該地址。
如果你對編譯後的細節感興趣,可以在調試時按CTRL+ALT+D(VS的快捷鍵,也可以通過菜單導航到「調試-窗口-反匯編」,其他編譯器在調試菜單中找)切換到反匯編窗口查看編譯結果,系統會逐條顯示每一條語句對應的匯編指令。
當你對匯編指令感到好奇之後,可以看看匯編、編譯原理、8086 CPU原理、以及數字電路的解碼器 等書籍,不需要完全看懂,了解下會對你學習任何編程語言有幫助,不僅僅局限於C語言。