函式棧結構與記憶體對齊
函式棧
下圖是x86-64的函式棧的結構, 函式P呼叫函式Q的過程,Q正在執行。
這裡僅對兩個地方解釋,其他的很容易理解,就不細說了
- 其中返回地址用來實現函式的返回。當Q要返回到P時,就要呼叫此地址獲取返回位置。
- 引數構造區是對呼叫函式P傳遞的引數的拷貝,因為當P傳遞引數過多時,無法通過暫存器傳遞,只好在P的棧幀中儲存;呼叫Q時,將其拷貝到引數構造區
x86-64過程只分配自己所需要的棧幀部分,許多函式甚至根本不需要棧幀。
控制轉移
指令 | 描述 |
---|---|
call Label | 過程呼叫 |
call *Operand | 過程呼叫 |
ret | 從過程呼叫中返回 |
資料對齊
許多計算機系統對基本的資料型別的合法地址做出了一些限制,要求某種型別物件的地址必須是某個值K(通常是2、4或8)的倍數。一是為了讀取效率,二是某些硬體裝置要求。
K | 型別 |
---|---|
1 | char |
2 | short |
4 | int, float |
8 | long, double, char* |
對齊取系統要求值和當前資料型別的最小值,即min(data ,Sys);例如:int型別的資料,假定系統要求是8,那麼int在記憶體中的對齊要求是 4 = min(4, 8)。
資料結構struct也需要對齊,它的對齊大小取結構體中對齊要求最大的那個值。這樣一來,只要結構體滿足對齊,裡面的資料也能滿足對齊;否則,結構體不滿足對齊,裡面的資料如何調整也總會存在不滿足的情況。
相關推薦
函式棧結構與記憶體對齊
函式棧 下圖是x86-64的函式棧的結構, 函式P呼叫函式Q的過程,Q正在執行。 這裡僅對兩個地方解釋,其他的很容易理解,就不細說了 其中返回地址用來實現函式的返回。當Q要返回到P時,就要呼叫此地址獲取返回位置。 引數構造區是對呼叫函式P傳遞的引數的
C語言之struct大小、首地址與記憶體對齊—由結構體成員地址得到結構體首地址
被問到如下問題:給定一個結構體中某個變數地址,可否得到結構體變數的地址? 答案是可以,但是對不同的場合有不同的結果;這與微處理器平臺、編譯器的處理不可分割。 首先,對於處理器,大尾端、小尾端的因素必須考慮; 其次: 一、 ANSIC標準中並沒有規定,相鄰宣告的變數在記憶體中一定要相鄰。 為了程式的高效性,
初學者對於結構體記憶體對齊與補齊的理解
1、問題提出: 剛開始學習結構體的時候,我們通常認為結構體 struct number_1 { int a; int b; int c; }st1; 佔用空間為sizeof(st1.a)+sizeof(st1.b)+sizeof(s
結構體記憶體對齊模式
結構體的位元組大小,一個簡單的結構體定義如下,這個結構的大小應是8位元組(32位下) typedef struct MODEL4 { char c; int x; }MODEL4; char的大小是1,而int是4,但總的大小是8,這就是結構體記憶體對齊的原因。在32位的機器上,資料是以
結構體記憶體對齊總結
首先我們都知道結構體是多個變數的集合,在其中可以存放整型,浮點型等等各種,然後結構體記憶體是如何對齊的呢,他並不是按連續順序去排下去的,首先我們先上一段程式碼 #include<iostream> #include<cstdlib> using namesp
初夏小談:結構體記憶體對齊詳解
記憶體對齊?什麼是記憶體對齊? 對於這個問題我們先來看看這樣的一個結構體(在32位系統下) typedef struct Stu1 { char C1; int num1; short S1; }Stu1; 如果我們不知道記憶體對齊或者不清楚記憶體對齊時,我們可能這樣分析
C語言查缺補漏(七)結構體記憶體對齊原則
忽略點七:結構體記憶體對齊原則 直到前幾個星期做了一道選擇題才知道,結構體元素的宣告順序可能影響結構體使用時所需的記憶體大小!!! 一查才知道,在C語言中結構體有記憶體對齊原則,這個原則可以總結為兩點: ——資料成員對齊規則: 結構體或聯合體的資料
結構體、結構體記憶體對齊
1、結構體 1.1、概述 在C語言中,除了常見的基本資料型別(整數型別short、int、long和浮點型別float、double)外,還有派生型別,如指標型別、陣列型別、結構型別、共用體型別等。 結構體是基本資料型別不能滿足需求時,使用者自己指定的一種資料結
結構體記憶體對齊,位段,列舉+聯合
1.結構體記憶體對齊 結構體記憶體對齊規則 1.第一個成員在與結構體變數偏移量為0的地址處 2.其他成員變數要對齊到對齊數的整數倍的地址處。對齊數=編譯器預設的一個對齊數與該成員大小的 較小值 vs中預設的值為8,linux中的預設值為4 3.結構體總大小為最
結構體記憶體對齊問題
問題描述: 結構體記憶體對齊問題值直接的體現就是計算結構體的sizeof佔用的位元組數。 結構體記憶體對齊的幾個原則,有了這幾個原則,不管結構體裡面是什麼元素,我們都能夠正確算出sizeof值(以VS2013為例) 原則1: 結構體中每一個元素放置到記憶體中時,它都會認為記憶體
【易錯】C語言結構體記憶體對齊問題
對於一個結構體的位元組數大家有沒有遇到什麼疑問呢? 先看一個結構體: typedef struct Test { char a1; int a2; char a3; short a4; }Test_T; 在32位編譯系統下這一個結構體的位元組數是多少呢?是1+4
1.結構體型別建立 2.結構體初始化 3.結構體記憶體對齊 4.位段,位段計算機大小。 5.列舉 6.聯合
結構體型別的建立 1.結構體的宣告 結構是一些值的集合,這些值稱為成員變數。每個結構體的成員可以是不同型別的變數。 struct Student { char name[20];//名字 short age;//年齡 char sex[5
LLVM的呼叫協議與記憶體對齊
在設計一門語言與其他語言互動的API與ABI(Application Binary Interface,二進位制介面)時,呼叫協議和記憶體對齊是兩個無從迴避的問題。 本文將討論如何在LLVM上生成正確的記憶體對齊和呼叫協議的程式碼。 在這裡為了方便和標準起見,假定應用LLVM的語言的Extending
關於面試題中結構體記憶體對齊計算總結
記憶體對齊計算可謂是筆試題的必考題,但是如何按照計算原則算出正確答案一開始也不是很容易的事,所以專門通過例子來複習下關於結構體記憶體對齊的計算問題。(編譯環境為vs2015) 對齊原則: 原則1:資料成員對齊規則:結構(struct)(或聯合(un
結構體記憶體對齊計算問題總結大全
前言本文給大家介紹的是關於C++結構體記憶體對齊計算的相關內容,記憶體對齊計算可謂是筆試題的必考題,但是如何按照計算原則算出正確答案一開始也不是很容易的事,所以專門通過例子來複習下關於結構體記憶體對齊的計算問題。話不多說,來一起看看詳細介紹吧。編譯環境:vs2015對齊原則:
C++學習:結構體記憶體對齊規則
記憶體對齊舉例: 以下兩個結構體: #include<iostream> using namespace std; struct A{ char a; int b; short c; }; struct B{
結構體記憶體對齊和強制型別轉換問題分析
最近兩天覆習c++的連結串列的時候發現了一個問題值得深思. 首先從一個現象上引出問題: 在我寫線性表的鏈式儲存的時候定義了幾個結構體:(全部程式碼在這裡) linklist.h typedef void LinkList; typedef struct
跟我一起學C++之從C到C++(結構體記憶體對齊)
1.什麼是記憶體對齊 (1) 編譯器為每個“資料單元”按排在某個合適的位置上。 (2) C、C++語言非常靈活,它允許你干涉“記憶體對齊”。也就是可以人為的設定編譯器的對齊方式。 2.為什麼要對齊 效能原因:在對齊的地址上訪問資料快。如果是位元組對齊方式
為什麼要進行結構體記憶體對齊
結構體記憶體對齊 什麼是結構體記憶體對齊 結構體不像陣列,結構體中可以存放不同型別的資料,它的大小也不是簡單的各個資料成員大小之和,限於讀取記憶體的要求,而是每個成員在記憶體中的儲存都要按照一定偏移量來儲存,根據型別的不同,每個成員都要按照一定的對齊數進
C語言-----結構體記憶體對齊
結構體記憶體對齊規則: 第一個成員在結構體變數偏移量為0 的地址處。 其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處。對齊數 = 編譯器預設的一個對齊數與該成員大小中的較小值。vs中預設值是8 Linux預設值為4. 結構體總大小為最大對齊數的整數