VB、C#、VC使用条件编译自动选择结构体对齐方式

11 篇文章 0 订阅
订阅专栏
4 篇文章 1 订阅
订阅专栏
3 篇文章 0 订阅
订阅专栏

VB、C#、VC使用条件编译使程序自动选择结构体对齐方式


一、系统默认内存对齐

1、Windows 64 位系统默认 8 字节,Windows 32 位系统默认 4 字节

2、Linux 64 位系统默认 8 字节,Linux 32 位系统默认 4 字节


二、常用程序默认对齐

1、Office 64 位程序默认 8 字节,Office 32 系统默认 4 字节(VBA 结构体编程才能体会)

2、Visual Studio 2017 默认 8 字节(VB、C#、VC 都是默认 8 字节),VC2017 可以选择结构体对齐(1、2、4、8、16)

3、Visual Studio 6.0 默认 4 字节,VC6.0 可以选择结构体对齐(1、2、4、8、16)


三、使用条件编译自动选择结构体对齐方式

根据内存发展的规则,32 位系统默认 4 字节对齐,64 位系统默认 8 字节对齐,那么采用VS编程就可以使用条件编译程序。

以 VB.net 2017 为例,在项目属性里,高级编译选项,设置定义 TRACE 常数:

1、选择项目 x64 平台,自定义常量 x64 = True

在这里插入图片描述

或者,选择项目 x86 平台,自定义常量 x86 = True

在这里插入图片描述

2、编辑条件编译程序代码

VB.NET 代码:
#If x86 Then   '编译是 x86 平台,按 4 字节结构体参数  '条件编译语句,根据选择的编译平台,选择结构体的对齐方式
    ''' <summary>椭球转换参数</summary> 
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)>'编译为X86,采用Pack=4。编译为X64,Pack=8或默认。
    Public Structure SevenParam
        Dim dX As Double 'X平移
        Dim dY As Double 'Y平移
        Dim dZ As Double 'Z平移
        Dim rX As Double 'X旋转
        Dim rY As Double 'Y旋转
        Dim rZ As Double 'Z旋转
        Dim K As Double '尺度
    End Structure
    ''' <summary>定义椭球投影参数</summary>   
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)>   '编译为X86,采用Pack=4。编译为X64,Pack=8或默认。
    Public Structure ProjectionParam
        ''' <summary>中央子午线</summary>
        Dim CentralMeridian As Double
        ''' <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
        Dim CentBool As Boolean
        ''' <summary>投影尺度</summary>
        Dim ProjectionScale As Double
        ''' <summary>是否自动椭球参数的布尔值</summary>
        Dim eTwoBool As Boolean
        ''' <summary>北向常数</summary>
        Dim NorthwardConstant As Double
        ''' <summary>是否北向或南向坐标的布尔值</summary>
        Dim NortBool As Boolean
        ''' <summary>东向常数</summary>
        Dim EasterlyConstant As Double
        ''' <summary>是否东向或西向坐标的布尔值</summary>
        Dim EastBool As Boolean
    End Structure
#Else    '编译不是 x86 平台,按 8 字节结构体参数
    ''' <summary>椭球转换七参数</summary> 
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)>'编译为X86,采用Pack=4。编译为X64,Pack=8或默认。
    Public Structure SevenParam
        Dim dX As Double 'X平移
        Dim dY As Double 'Y平移
        Dim dZ As Double 'Z平移
        Dim rX As Double 'X旋转
        Dim rY As Double 'Y旋转
        Dim rZ As Double 'Z旋转
        Dim K As Double '尺度
    End Structure
    ''' <summary>定义椭球投影参数</summary>   
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)>   '编译为X86,采用Pack=4。编译为X64,Pack=8或默认。
    Public Structure ProjectionParam
        ''' <summary>中央子午线</summary>
        Dim CentralMeridian As Double
        ''' <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
        Dim CentBool As Boolean
        ''' <summary>投影尺度</summary>
        Dim ProjectionScale As Double
        ''' <summary>是否自动椭球参数的布尔值</summary>
        Dim eTwoBool As Boolean
        ''' <summary>北向常数</summary>
        Dim NorthwardConstant As Double
        ''' <summary>是否北向或南向坐标的布尔值</summary>
        Dim NortBool As Boolean
        ''' <summary>东向常数</summary>
        Dim EasterlyConstant As Double
        ''' <summary>是否东向或西向坐标的布尔值</summary>
        Dim EastBool As Boolean
    End Structure
#End If
C# 代码与 VB.NET 类同
先设置高级编译选项的自定义常数,然后编辑如下代码:
#if x86 //编译是 x86 平台,按 4 字节结构体参数 '条件编译语句,根据选择的编译平台,选择结构体的对齐方式
	/// <summary>椭球转换参数</summary> 
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=4)]
	public struct SevenParam
	{
		public double dX; //X平移
		public double dY; //Y平移
		public double dZ; //Z平移
		public double rX; //X旋转
		public double rY; //Y旋转
		public double rZ; //Z旋转
		public double K; //尺度
	}
	/// <summary>定义椭球投影参数</summary>   
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=4)]
	public struct ProjectionParam
	{
		/// <summary>中央子午线</summary>
		public double CentralMeridian;
		/// <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
		public bool CentBool;
		/// <summary>投影尺度</summary>
		public double ProjectionScale;
		/// <summary>是否自动椭球参数的布尔值</summary>
		public bool eTwoBool;
		/// <summary>北向常数</summary>
		public double NorthwardConstant;
		/// <summary>是否北向或南向坐标的布尔值</summary>
		public bool NortBool;
		/// <summary>东向常数</summary>
		public double EasterlyConstant;
		/// <summary>是否东向或西向坐标的布尔值</summary>
		public bool EastBool;
	}
#else //编译不是 x86 平台,按 8 字节结构体参数
	/// <summary>椭球转换七参数</summary> 
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=8)]
	public struct SevenParam
	{
		public double dX; //X平移
		public double dY; //Y平移
		public double dZ; //Z平移
		public double rX; //X旋转
		public double rY; //Y旋转
		public double rZ; //Z旋转
		public double K; //尺度
	}
	/// <summary>定义椭球投影参数</summary>   
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=8)]
	public struct ProjectionParam
	{
		/// <summary>中央子午线</summary>
		public double CentralMeridian;
		/// <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
		public bool CentBool;
		/// <summary>投影尺度</summary>
		public double ProjectionScale;
		/// <summary>是否自动椭球参数的布尔值</summary>
		public bool eTwoBool;
		/// <summary>北向常数</summary>
		public double NorthwardConstant;
		/// <summary>是否北向或南向坐标的布尔值</summary>
		public bool NortBool;
		/// <summary>东向常数</summary>
		public double EasterlyConstant;
		/// <summary>是否东向或西向坐标的布尔值</summary>
		public bool EastBool;
	}
#endif

VC++ 可以直接进入项目属性,C/C++ 的代码生成里,设置结构成员对齐,x64 设置为 8 字节,x86 设置为 4 字节,如图

在这里插入图片描述
在这里插入图片描述

也可以具体编辑需要设置对齐的代码:
#ifdef _M_IX86 //编译是 x86 平台,按 4 字节结构体参数 '条件编译语句,根据选择的编译平台,选择结构体的对齐方式(或 _WIN32)
	/// <summary>椭球转换参数</summary> 
    #pragma pack(4)/4字节对齐
	public struct SevenParam
	{
		public double dX; //X平移
		public double dY; //Y平移
		public double dZ; //Z平移
		public double rX; //X旋转
		public double rY; //Y旋转
		public double rZ; //Z旋转
		public double K; //尺度
	}
	/// <summary>定义椭球投影参数</summary>   
	public struct ProjectionParam
	{
		/// <summary>中央子午线</summary>
		public double CentralMeridian;
		/// <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
		public bool CentBool;
		/// <summary>投影尺度</summary>
		public double ProjectionScale;
		/// <summary>是否自动椭球参数的布尔值</summary>
		public bool eTwoBool;
		/// <summary>北向常数</summary>
		public double NorthwardConstant;
		/// <summary>是否北向或南向坐标的布尔值</summary>
		public bool NortBool;
		/// <summary>东向常数</summary>
		public double EasterlyConstant;
		/// <summary>是否东向或西向坐标的布尔值</summary>
		public bool EastBool;
	}
	#pragma pack()//恢复默认对齐
	
#else // _M_X64 //编译不是 x86 平台,按 8 字节结构体参数 (或 _WIN64)
	/// <summary>椭球转换七参数</summary> 
    #pragma pack(8)//按8字节对齐
	public struct SevenParam
	{
		public double dX; //X平移
		public double dY; //Y平移
		public double dZ; //Z平移
		public double rX; //X旋转
		public double rY; //Y旋转
		public double rZ; //Z旋转
		public double K; //尺度
	}
	/// <summary>定义椭球投影参数</summary>   
	public struct ProjectionParam
	{
		/// <summary>中央子午线</summary>
		public double CentralMeridian;
		/// <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
		public bool CentBool;
		/// <summary>投影尺度</summary>
		public double ProjectionScale;
		/// <summary>是否自动椭球参数的布尔值</summary>
		public bool eTwoBool;
		/// <summary>北向常数</summary>
		public double NorthwardConstant;
		/// <summary>是否北向或南向坐标的布尔值</summary>
		public bool NortBool;
		/// <summary>东向常数</summary>
		public double EasterlyConstant;
		/// <summary>是否东向或西向坐标的布尔值</summary>
		public bool EastBool;
	}
	#pragma pack()//恢复默认对齐
#endif

C#使用反射获取结构体实例及思路
01-01
代码如下:static void Main(string[] args){ ...换种方式,似乎结构体使用反射无法得到其构造函数ConstructorInfo对象 类中有一个隐式的构造函数,而结构没有构造函数 我甚至尝试查找非public构造函数 依然没有 这问
C语言结构体对齐问题
j_learn的博客
05-04 611
c语言程序中,我们经常使用sizeof来计算大小。然而结构体本身采用默认对其的方式,我么可以采用伪指令的方式可以改变其对其,从而影响结构体大小。
C++:c#c++结构体对齐问题
博客
10-30 1710
使用C#调用C++的dll,参数传递结构体,发现定义的结构体大小不一样,同样定义的结构体,在C#C++使用sizeof查看后所占字节数不一样,导致乱码。 原来要对C#代码进行对齐处理 对齐方法如下 C++中定义结构体 typedef struct { bool useLogo = false; Point p1; Point p2; Point p3; Point p4; boo...
vscode 利用.clang-format 格式化C代码--连续宏定义和条件编译格式对齐
weixin_43971328的博客
08-10 3991
vscode利用clang-format格式化合并的头文件,连续宏定义对齐
结构体内存对齐总结
hgxy123的博客
11-21 309
  首先我们都知道结构体是多个变量的集合,在其中可以存放整型,浮点型等等各种,然后结构体内存是如何对齐的呢,他并不是按连续顺序去排下去的,首先我们先上一段代码 #include&lt;iostream&gt; #include&lt;cstdlib&gt; using namespace std; struct a{ int m; char n; double c; }; stru...
VS2010命令行编译C#VC项目
Elon的博客
12-25 2304
原文链接:http://blog.sina.com.cn/s/blog_45eaa01a0101ew24.html S2010命令行编译C#VC项目   根据需要动态创建数据库字段后,需要动态创建或者调整页面,那就需要编译这些页面和后台文件。因此使用命令行编译将会非常方便,对于C#只需要安装相应版本的Framework即可。这些内容来自网络,并加以整理。 一 vs2010命令行编译C#
Visual Studio C#代码自动对齐
xiansanderen的博客
12-21 7517
Visual Studio C#代码自动对齐 1,ctrl+a 全选要对齐的代码 2, ctrl+k,f 格式化选取范围
vc结构体调整字节对齐
macob的专栏
11-30 451
vc 结构体 调整 字节对齐
C#C++交互编程结构体(struct)对齐问题
最新发布
u010019329的博客
07-05 389
C#,C/C++,bool,pack=1,托管内存(C#),非托管内存(C/C++),[MarshalAs (UnmanagedType.I1)],[MarshalAs (UnmanagedType.U1)]
c++对象长度之内存对齐(2)
寻梦&之璐
12-14 2213
内存对齐VC++6.0中,类和结构体中的数据成员是根据它们在类或结构体中出现的顺序来依次申请申请内存空间的,由于内存对齐的原因,它们并不一定会像数组那样连续地排列。由于数据类型的不同,因此占用的内存空间大小也会不同,因此占用的内存空间大小也会不同,在申请内存时,会遵守一定的规则。 要找对齐的话,我个人感觉应该先找到 编译器的指定对齐值,因为结构体中的当前数据成员类型长度为M,指定的对齐值是N,那么实际的对齐值为q=min(M,N),其成员的地址安排在q的倍数上。 但是,并非设定了默认对齐值就将结构体的对
gcc结构体对齐.pdf
12-27
关于gcc编译结构体对齐说明
实例讲解C语言编程中的结构体对齐
09-02
主要介绍了C语言编程中的结构体对齐,值得注意的是一些结构体对齐的例子在不同编译器下结果可能会不同,需要的朋友可以参考下
用com在VBVC间传递结构体
10-01
简介:由于要开发一个软件,其中用com在VB与VC间传递结构体数组,在网上找了很久没有成功,后来在国外一网站找到了,并且按照其中的关键步骤操作成功了。由于原文是英文的,没有精力去翻译,于是用网页翻译了...
C# 传递给C++函数的结构体没有对齐的问题
weixin_33672400的博客
11-21 202
今天遇到C#传递结构体C++ 返回结果没有对齐的问题,后来在网上查到定义结构体时可以添加 Pack 特性。 MSDN讲解如下: 此字段指示在指定 LayoutKind. Sequential 值时应使用的内存边界。 Pack 的值必须介于 0、1、2、4、8、16、32、64 或 128: 值为 0 则指示封装对齐方式设置为当前平台的默认值。 1 值表示字节边界上发生的...
C语言结构体对齐与不对齐设置总结
热门推荐
gll028的专栏
10-08 1万+
参考: 相信不同的编译平台间的默认设置差异给大家带来了很多困扰。在此,仅就结构体对齐解析下之间的差异设置方法。 1.gcc中结构体默认是4个字节对齐,即为32的倍数。 1.1修改字节对齐: struct data{ int a; char b; char c; }__attribute__((aligned(8))) data; 或 #pragma pa
vs如何修改结构体默认对齐
kingsdai的博客
05-29 167
vs 结构体 默认对齐值 设置
C#.NET结构体字节对齐
SunCherryDream的专栏
01-21 1万+
[StructLayout(LayoutKind.Sequential,   CharSet=CharSet.Ansi)]     internal   struct   DllInvoices     {     [MarshalAs(UnmanagedType.ByValArray,   SizeConst=8)]     public   byte[]   serial;
详解结构体内存对齐
努力进大厂的小码娄
03-20 1113
结构体大小的计算,内存对齐的意义以及修改默认成员对齐数。
c语言标准里关于结构体对齐方式说明的原文
03-04
C语言标准中关于结构体对齐方式说明的原文如下: 结构体成员变量的排列顺序是按照成员的定义顺序,从结构体首地址开始,依次向后排列。如果遇到字节对齐的情况,就在成员之间填充字节,以达到对齐要求。 具体而言,一个结构体的大小必须是其成员中占用空间最大的数据类型的整数倍,而且每个成员变量的地址必须是它自身大小的整数倍,否则就需要填充字节。 例如,如果一个结构体有一个char类型成员和一个int类型成员,而int类型需要4字节对齐,那么编译器就会在char类型成员和int类型成员之间填充3个字节,以保证int类型成员地址为4的倍数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Virtual Serial Port Driver Pro 9.0的破解和汉化 58873
  • 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理 23360
  • 最新x64dbg软件-比OD更好的工具 19979
  • VS2017安装文件太大,VS2015正好 14195
  • MathNet.Numerics主要类功能简述 11030

分类专栏

  • 原创 22篇
  • VC++2019 1篇
  • VC++2017 3篇
  • VB 11篇
  • DLL动态链接库
  • 调试 1篇
  • OllDbg 1篇
  • 汇编语言 3篇
  • 虚拟串口 6篇
  • 液晶电视维修 1篇
  • 维修分析 1篇
  • Office 1篇
  • accdb 2篇
  • mdb 2篇
  • mdb或
  • 勘测 2篇
  • 导航 3篇
  • HYPACK 4篇
  • 地形测量 3篇
  • C# 4篇
  • x64dbg 4篇
  • 补丁 9篇
  • 汉化 8篇
  • 修约 1篇
  • 数据处理 8篇

最新评论

  • 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 最新版本 V10.0.979

    qq_38273188: 你好,已购买但无法使用,提示“未能配置COM端口设置。”,怎么解决呢?

  • 虚拟串口VSPD_V10.0.944官方最新版

    qq_38273188: 你好,已购买但无法使用,提示“未能配置COM端口设置。”,怎么解决呢?

  • 虚拟串口VSPD_V10.0.944官方最新版

    qq_38273188: 你好,已购买但无法使用,提示“未能配置COM端口设置。”,怎么解决呢?

  • 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 最新版本 V10.0.979

    Lin_ Anom: 文件没了,求一个版本9或10的,谢谢

  • 最好用的 Office 功能区编辑器 Ribbon Creator 各版本

    Lin_ Anom: 虚拟串口10pj的软件求一个

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Hypack 2024 简体中文资源完整翻译汉化已经全部完成
  • 最好用的 Office 功能区编辑器 Ribbon Creator 各版本
  • HDDSN FOR VC2019 读取硬盘型号和序列号的源代码和程序
2024年1篇
2023年2篇
2022年19篇
2021年10篇
2020年2篇
2019年12篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中游鱼

获取完整源代码,提高工作效率

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司怀化网络推广推荐鹤壁网站建设哪家好娄底网站搜索优化推荐汕头网站设计模板价格福州建设网站价格揭阳网站设计推荐山南网站改版推荐武汉关键词按天扣费哪家好汉中网站设计推荐横岗网站推广系统推荐盘锦如何制作网站哪家好布吉至尊标王多少钱丹竹头网站推广价格漳州阿里店铺运营推荐襄阳网站改版价格双龙外贸网站制作报价诸城seo网站推广龙岩百度网站优化排名价格台州网站改版价格抚顺网站制作设计多少钱思茅建设网站多少钱龙华SEO按效果付费推荐鞍山网站建设设计滨州营销网站推荐合肥网站优化按天收费推荐大浪外贸网站设计多少钱丽江阿里店铺托管报价景德镇模板网站建设推荐木棉湾网站推广方案飞来峡关键词按天收费价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化