C Struct的記憶體佈局問題解答

2023-03-19 00:40:31 字數 2951 閱讀 7356

複製** **如下:

struct struct1

struct struct2

struct struct3

struct struct4

一會再看答案,看看和你的理解是不是有很大的出入?其實struct和class的記憶體佈局都是由structlayoutattribute的構造引數:layoutkind列舉決定的,struct由編譯器新增layoutkind.sequential,class由編譯器新增的是layoutkind.auto。而sequential通過實驗資料可以總結如下:

1. 對於不帶引用型別的struct:按照定義的順序排列,記憶體佈局和c,c++規則相同。比如:

byte a;

byte b;

long c;

的大小是 a,b填充4位元組,c填充8位元組

byte a

long c

byte b

的大小是 a填充8位元組,c填充8位元組,b填充8位元組

2. 對於帶有引用型別的struct:大於4位元組的欄位 -> 引用欄位 ->  小於4位元組的欄位

對於小於4位元組的欄位按照大小排列,如果大小相同按照定義順序,記憶體佈局和規則1相同。不過這裡有個需要注意的地方就是如果欄位還是一個struct型別的,那麼這個欄位始終www.cppcns.com排在最後。

所以上面的答案是:

struct1:c(4) -> d(4) -> b(2) ->a(2)

struct2:b(8) -> d(4) -> a(1)c(1)填充2位元組

struct3: a(1)b(1)填充2位元組 -> c(8)

struct4:a(1)填充7位元組->b(8)->c(1)填充7位元組

如果你想親自動手實驗一下的話需要使用sos.dll進行除錯(關於sos配置和使用入門的文章部落格園上有很多)以struct1為例:

struct1s1 = new struct1();

s1.a = 1;          

s1.b = 15;

s1.c = "c";

s1.d = 32;

.load sos

已載入擴充套件c:\windows\microsoft.net\framework\v2.0.50727\sos.dll

!clrstack -a

pdb symbol for mscorwks.dll not loaded

os thread id: 0x15fc (5628)

esp       eip   

0041ee3c 03ba01aa test_console.class12.main()

locals:

0x0041ee84 = 0x01b02b0c

0x0041ee74 = 0x00000020

0x0041ee68 = 0x00000000

0x0041ee50 = 0x00000000

0041f104 6ebd1b4c [gcframe: 0041f104]

.load sos

已載入擴充套件c:\windows\microsoft.net\framework\v2.0.50727\sos.dll

!name2ee *!test_console.struct1 //得到struct1的方法表地址

pdb symbol for mscorwks.dll not loaded

module: 6d5d1000 (mscorlib.dll)

module: 00192c5c (test_console.exe)

token: 0x02000012

methodtable: 00193828

eeclass: 007a45b4

name: test_console.struct1

!clrstack -a //得到struct1例項的棧上地址

os thread id: 0x1438 (5176)

esp       eip   

00www.cppcns.com3eef0c 008f00c9 test_console.class12.main()

locals:

0x003eef1c = 0x01c12b0c

003ef17c 6ebd1b4c [gcframe: 003ef17c]

!dumpvc 00193828 0x003eef1c //檢視值型別的layout

name: test_console.struct1

methodtable 00193828

eeclass: 007a45b4

size: 20(0x14) bytes

fields:

mt    field   offset                 type vt     attr    value name

6d84340c  400001c        a          system.byte  1 instance        1 a

6d83e910  400001d        8         system.int16  1 instance       15 b

6d8408ec  400001e        0        system.string  0 instance 01c12b0c c

6d842b38  400001f        4         system.int32  1 instance       32 d

在記憶體視窗中可以看到記憶體佈局為:

0x003eef1c  01c12b0c 00000020 0001000f

這裡我要說明下使用dumpvc後會給出一個size,這裡是20位元組,比我們計算的結果多出8個位元組,我的理解是因為引用型別有附加的8位元組(syncblkindex + methodtableaddress)所以這裡的size也加上了8.

本文標題: c# struct的記憶體佈局問題解答

本文地址: /ruanjian/csharp/101176.html

C Struct的記憶體佈局

問題 請說出以下struct的例項大小以及記憶體佈局 struct struct1 struct struct2 struct struct3 struct struct4 一會再看答案,看看和你的理解是不是有很大的出入?其實struct和class的記憶體佈局都是由structlayoutattr...

C 記憶體佈局 記憶體佈局基礎

1 在 c 中,記憶體分成 5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於處理器的指令集中,效率很高,但是分配的記憶體容量有限。堆 就是那些由 new分配...

c c 的記憶體佈局

說明一點 這僅是從抽象的語言層次上的談論,只是一種建議標準,所以在具體程式設計實踐時,具體佈局還要看編譯器本身。先認識一下原始檔到可執行檔案的標準過程 原始檔經過以下幾步生成可執行檔案 編譯器和彙編器建立的目標檔案包含 二進位制 指令 原始碼中的資料 連結器將多個目標檔案連結成一個 裝載器吧目標檔案...

float的記憶體佈局

我們在 中常常用到float與double,相比於int等型別,很多人並不知道float與double的儲存方式。浮點型的二進位制表示 我們先來看看十進位制轉二進位制 對於一個浮點型 101.0625f 整數部分 101 2 1 50 2 0 25 2 1 12 2 0 6 2 0 3 2 1 1 ...

物件的記憶體佈局

物件在堆記憶體中佈局可以劃分為三部分 物件頭 例項資料和對齊填充。物件頭部包括兩類資訊 第一類 用於儲存物件執行時資料 如 雜湊碼 gc分代年齡 鎖狀態標準 執行緒持有的鎖 變向執行緒id 變向時間戳等 第二類 型別指標,即物件指向它的型別後設資料的指標。儲存我們在程式 裡面所定義的各型別的欄位內容...

Linux記憶體佈局

變數名稱 說明 num physpages 最高可用頁框的頁框號 totalram pages 可用頁框的總數量 min low pfn ram中在核心映像後第一個可用頁框的頁框號 max pfn 最後一個可用頁框的頁框號 max low pfn 被核心直接對映的最後一個頁框的頁框號 低地址記憶體 ...

物件記憶體佈局 8

前篇 http blog.csdn.net pathuang68 archive 2009 04 23 4102003.aspx 在 記憶體物件佈局 5 的 中,在derived類中將三個基類中的虛擬函式分別覆蓋一個,即分別覆蓋base1中宣告的vfbase1 1 base2中宣告的vfbase2 ...

物件記憶體佈局 9

前篇 http blog.csdn.net pathuang68 archive 2009 04 23 4102006.aspx 假定多層繼承的各類之間的關係如下圖。假定派生類不override基類的虛擬函式,即base2不override base1中宣告的虛擬函式vfbase1 base3不ov...

物件記憶體佈局 10

前篇 http blog.csdn.net pathuang68 archive 2009 04 23 4103581.aspx 在物件記憶體佈局 9 基礎上做些修改 派生類override基類的虛擬函式,即base2 override base1中宣告的虛擬函式vfbase1 base3 over...

物件記憶體佈局 13

前篇 http blog.csdn.net pathuang68 archive 2009 04 24 4105626.aspx 下面來看看虛基類對物件記憶體佈局的影響。虛基類的主要作用就是在所有的派生類中,保留且僅保留一份虛基類的suboject。a.一個虛基類的情況 include using ...