我是否应该在与 C# 接口时使用固定大小的数据类型
本文关键字:数据类型 是否 接口 | 更新日期: 2023-09-27 18:33:46
我所知,C++标准并不能保证int
等基本数据类型的大小。它只是保证表示int
变量的最小位数。因此,从一个平台到另一个平台,这可能会发生变化。
当使用包含托管部分和本机部分(C++和C#(的应用程序以及正常的C样式接口(Pinvokes
和Marshal
..(时,数据类型大小的这种不一致可能会导致很多混乱。
那么,在界面中使用始终固定大小的数据类型是否好? 它有什么缺点吗?
对于整数类型:是的,您应该这样做。
在 C# 端更容易,因为所有整数类型都具有不依赖于平台位的固定大小。
在C++端,您可以使用以下相应的类型:
int8_t
-> sbyte
= System.SByte
,这不是 ECMA 标准,但在 :NET 和 Mono 中可用
uint8_t
-> byte
= System.Byte
int16_t
-> short
= System.Int16
uint16_t
-> ushort
= System.UInt16
int32_t
-> int
= System.Int32
uint32_t
-> uint
= System.UInt32
int64_t
-> long
= System.Int64
uint64_t
-> ulong
= System.UInt64
交换指针类型也是安全的。尽管它们的大小可以变化,但特定进程的调用方和被调用方大小始终相同。
即:如果进程是 64 位,则您的C++代码必须已编译为 64 位,因此它的指针具有 64 位。此过程将使用 64 位 .NET 运行时,因此 .NET 中的指针也将是 64 位。
(顺便说一句:C# 中的指针类型是 System.IntPtr
和 ... *
(。
对于浮点类型,这有点难。C++标准不会给您任何提示如何存储float
或double
。不是大小也不是技术。实际上,我所知道的所有C/C++编译器(MSVC,gcc/g ++,clang/clang++(在我使用过的所有平台(Windows,MinGW,Linux(上都以32位IEEE-754格式存储float
,以64位IEEE-754格式存储double
。
我不知道 .NET 是否定义了修复格式,但根据我的经验,.NET 和 Mono 以相同的方式执行此操作(float
= System.Single
是 32 位 IEEE-754,double
= System.Double
是 64 位 IEEE-754(。
所以你可以决定是否相信我对C++方面的观察......
由于 C# int
始终为 32 位,因此必须确保C++部件在接口时也使用 32 位整数。缺点不应该让您担心,因为这是必须的。
此外,目前尚不清楚 64 位整数对您是好是坏。这取决于你在做什么。他们会占用更多的空间,这是肯定的。
您可以定义自己的数据类型,无论您使用哪种体系结构,该数据类型的大小都不会改变。优点是当您移动到不同的架构(例如 32 到 64 位等(时,您无需修改程序。缺点是,假设您最初为 32 位编写了程序并考虑以下内容,并且您已经定义了这样的 64 位数据类型。
typedef struct A
{
int a;
int b;
} my64bitint;
要使用它,您需要编写自己的代码。当您移动到 64 位时,您可以继续使用相同的,但这样您将无法获得在新架构中获得的 64 位整数的优势。您需要将代码更改为使用 64 位整数。