我是否应该在与 C# 接口时使用固定大小的数据类型

本文关键字:数据类型 是否 接口 | 更新日期: 2023-09-27 18:33:46

我所知,C++标准并不能保证int等基本数据类型的大小。它只是保证表示int变量的最小位数。因此,从一个平台到另一个平台,这可能会发生变化。

当使用包含托管部分和本机部分(C++和C#(的应用程序以及正常的C样式接口(PinvokesMarshal..(时,数据类型大小的这种不一致可能会导致很多混乱。

那么,在界面中使用始终固定大小的数据类型是否好? 它有什么缺点吗?

我是否应该在与 C# 接口时使用固定大小的数据类型

对于整数类型:是的,您应该这样做。

在 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++标准不会给您任何提示如何存储floatdouble。不是大小也不是技术。实际上,我所知道的所有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 位整数。