C# Struct 内存对齐
生活随笔
收集整理的這篇文章主要介紹了
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. 具體情形參考處理器手冊.
結構體:
?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 内存对齐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Repeater 得到checkbox值
- 下一篇: 项目实践精解:C#核心技术应用开发