VB、C#、VC使用条件编译自动选择结构体对齐方式
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
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiebccj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22