C#.NET结构体字节对齐[转载]

[StructLayout(LayoutKind.Sequential,   CharSet=CharSet.Ansi)]   
  internal   struct   DllInvoices   
  {   
  [MarshalAs(UnmanagedType.ByValArray,   SizeConst=8)]   
  public   byte[]   serial;   
  public   byte   Type;   
  public   uint   Sum;   
  }   
  调用Marshal.SizeOf(typeof(DllInvoices ))得到的大小为16,为什么不是13?

这其实是体系结构和汇编的问题。

在内存里特定类型数据的起始地址通常有一定的对齐要求,比如说32位机器上的int起始地址必须是4的整数倍,结构通常也是如此。   
       如果一个结构包含一个char和一个int,那么char作为结构体的第一个字段,需要在4的整数倍地址开始,而int有同样的要求,所以char之后必须空出3个字节来,才能使int的地址满足对齐的要求。   
    
       .NET的CLR是基于32位的,所以也由上述要求。在你的byte之后,必须空出3个字节。所以

结果就是16个字节了。

可以通过StructLayout的Pack属性改变这种对齐设置——如果有必要的话:   
       [StructLayout(LayoutKind.Sequential,   CharSet=CharSet.Ansi,Pack=1)]  结果就是13了。

原文地址:https://www.cnblogs.com/YoungSpace/p/8638474.html

时间: 2024-11-05 21:46:38

C#.NET结构体字节对齐[转载]的相关文章

结构体字节对齐

结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐. 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据: 2)提高存取数据的速度.比如有的平台每次都是从偶地址处读取数据,对于一个int型的

结构体字节对齐问题(转)

原文出处:http://wenku.baidu.com/view/019e26b765ce0508763213e2.html 初学C,对结构体的使用sizeof计算所占字节数不是很明白,看了此篇文章,终于豁然开朗,转载过来,方便以后温故. #include<stdio.h> struct a {   char no[10];   int p;   long int pp;   unsigned int ppp;   char x;   float y;   double h; }xy; voi

C++结构体字节对齐

本站文章均为Jensen抹茶喵原创,转载务必在明显处注明:转载自[博客园] 原文链接:http://www.cnblogs.com/JensenCat/p/4770171.html 直接上源码吧!~ 这里是头文件结构的定义: 一个非字节对齐结构体_tagTest2 一个字节对齐_tagTest3 (使用#pragma pack(push,1)来使字节以1个来对齐 , 使用#pragma pack(pop)来还原默认) 1 #pragma once 2 3 4 struct _tagTest1 5

结构体 字节对齐

转自:http://www.cnblogs.com/longlybits/articles/2385343.html   (有改动) 内存对齐 在用sizeof运算符求某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐. 内存对齐的原因: 1)某些平台

关于结构体字节对齐的笔记

1,空结构体的字节大小为:1: 2,含有static成员的结构体:sizeof 只算存栈中分配的空间大小,static成员存储在全局数据区内,故 static 成员变量不计算在内. 3,在默认对齐方式中,每种类型的存储开始地址是 能被该类型大小整除的地址.故:每次计算都假设结构体开始地址是 0: 4,遇到成员是结构体变量的:将此结构体变量当做一个数据类型,但是: 注意: 千万不能把此结构体的 sizeof 当做该变量的类型大小 也不能直接将此结构体拆解开 解法: 此结构体成员变量的类型大小 理解

零基础入门之结构体字节对齐

一.字节对齐的规则: 1.一般设置的对齐方式为1,2,4字节对齐方式.结构的首地址必须是结构内最宽类型的整数倍地址:另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是windows下是这样的,但在linux的gcc编译器下最高为4字节对齐),否则在前一类型后补0:这里特别提到的是数组一定要注意,而且在一些编程的技巧中,我们可以使用数组强制字节达到对齐的目的.这在网络编程中是很常见的. 举例:比如CHAR型占用空间为1字节,则其起始位置必须可被1整除.INT为4字节,其起

结构体边界对齐

结构体边界对其是一个老生常谈的话题了,网上的解释非常多,但大多偏重于讲步骤,对于每一步的原因都有点不清楚的地方,下面结合网上的讲解和自己的理解谈谈结构体对齐,不一定正确. 1.什么是结构体对齐. struct A{ char  a: char b: int c: char  d: } 对于上面的这个结构体,假设机器字长32位(4字节),那么该结构体变量占用的空间并非1+1+4+1=7,而是1+3+4+1+3=12.编译器自动将c的起始位置调整到第4个字节处,并在结构体最后加了3个字节,这种编译器

C语言 结构体(联合体)对齐规则

/* 结构体(联合体)对齐规则 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* * 原则1.第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). * 原则2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最宽基本类型大小的整数倍地址开始存储. *原则3.结构

c语言的结构体字节数统计

struct结构体的字节数 等于 结构体中最大类型的字节数的倍数. 如:?typedef struct Student{??? short id; //2个字节??? char name[15]; //1*15个字节??? int age; //4个字节??? char num; //1个字节} Student; 总共28个字节. c语言的结构体字节数统计