日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# Struct 内存对齐

發布時間:2024/8/22 C# 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# Struct 内存对齐 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C# Struct 內存對齊

結構體:
?struct MyStruct0
??? {
??????? public byte id;
??????? public int val;

??? }

輸出機構體的信息:
static void ShowStructInfo0()
??????? {
??????????? unsafe
??????????? {
??????????????? int size = sizeof(byte);
??????????????? Console.WriteLine(" sizeof({0})={1} ", typeof(byte).FullName, size);
??????????????? size = sizeof(int);
??????????????? Console.WriteLine(" sizeof({0})={1} ", typeof(float).FullName, size);
??????????????? size = sizeof(MyStruct0);
??????????????? Console.WriteLine(" sizeof({0})={1} ", typeof(MyStruct0).FullName, size);

??????????????? MyStruct0 myStruct = new MyStruct0() { id = 251, val = 12000 };

??????????????? int i = 0;

??????????????? byte* p = (byte*)&myStruct;
??????????????? Console.WriteLine("myStruct0 start:Address:{0:X2} Value:{1:d}", (int)p, (byte)(*(p + i)));
??????????????? Console.WriteLine();
??????????????? for (i = 0; i < size; i++)
??????????????? {
??????????????????? Console.WriteLine("Address:{0}={1:X} Value:{2:d}", i, (int)(p + i), (byte)(*(p + i)));
??????????????? }

??????????? }
??????? }
輸出:
?
?sizeof(System.Byte)=1
?sizeof(System.Single)=4
?sizeof(structApp.MyStruct0)=8
myStruct0 start:Address:12F440 Value:FB

Address:0=12F440 Value:FB
Address:1=12F441 Value:00
Address:2=12F442 Value:00
Address:3=12F443 Value:00
Address:4=12F444 Value:E0
Address:5=12F445 Value:2E
Address:6=12F446 Value:00
Address:7=12F447 Value:00

分析:
(1)對齊方式是按struct 中的最大類型來對齊,struct 每個字段的地址要求都是4的倍數。
?? 0(id地址開始),3(占位),4(val地址開始)
(2)第1個字節來存放Byte,第2~4字節用來占位,第5~8字節用來存放 int
???? ?
?( 3 ) 由于 12000=16進制 2EE0,而Address[4]=E0,Address[5]=2E ,可以看出本機cpu是小端
?????? 2EE0=2*16*16*16+14*16*16+14*16+0*16=

問題:
Address:4=12F444 Value:E0
Address:5=12F445 Value:2E
就可以描述int,這兩位用來干什么?
Address:6=12F446 Value:00
Address:7=12F447 Value:00
應該是負數的補碼表示法會用到。




背景知識:
MSB (Most Significant Byte, 最高有效字節)為[Xw-1, Xw-2, ... Xw-8]; LSB (Least Significant Byte, 最低有效字節)為 [X7, X6, ..., X0]. 其余的字節位于MSB, LSB之間.

??????? LSB和MSB誰位于內存的最低地址, 即誰代表該對象的地址? 這就引出了大端(Big Endian)與小端(Little Endian)的問題。

??????? 如果LSB在MSB前面, 既LSB是低地址, 則該機器是小端; 反之則是大端. DEC (Digital Equipment Corporation, 現在是Compaq公司的一部分)和Intel的機器一般采用小端. IBM, Motorola, Sun的機器一般采用大端. 當然, 這不代表所有情況. 有的CPU即能工作于小端, 又能工作于大端, 比如ARM, PowerPC, Alpha. 具體情形參考處理器手冊.


轉載于:https://www.cnblogs.com/hbb0b0/archive/2010/08/02/1790367.html

總結

以上是生活随笔為你收集整理的C# Struct 内存对齐的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。