我是否应该在与 C# 接口时使用固定大小的数据类型
Should I use fixed size data types while interfacing with C#
我所知,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 位整数。
- 类对象在 c++ 中是否具有数据类型?
- C++中是否有用于长数据类型的 lower_bound() 函数?
- C++ - 检查结构数据类型中的单词是否为回文
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 是否可以用类似C/C++(或任何语言)的语言,从作为用户输入的字符串或文件中创建用户定义的数据类型
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- 使用 dectlype 推断模板元素类型中的数据类型是否正确?
- 将分配的内存与基本数据类型一起使用时,是否需要新放置? std::complex?
- 是否可以使用 std::vector<std::any> vec;这将导致异构数据类型
- C++11 中是否有实际的 4 位整数数据类型
- 在 c++ 中确定某个值是否在该数据类型的最大范围内
- 是否有任何数据类型或方法可以计算当前单元格中先前数组单元格的总和
- 即使数据类型不同,是否有可能将帧的参数作为参数传递给回溯中的另一个帧
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 如何检查程序是否超过数据类型存储
- 用于 str.find() 的size_t数据类型是否安全?
- 数据类型是否"int"定义为类?
- 将结构视为数据类型是否准确
- 使用小数据类型是否会减少内存使用(来自内存分配而不是效率)
- 如何检查数据类型是否为数组?(c++)