问题描述
|
假设我想获得额外的类型检查,以处理在语义上意味着不同的原语:
public struct Apple
{
readonly int value;
// Add constructor + operator overloads
}
public struct Orange
{
readonly int value;
// Add constructor + operator overloads
}
关键是我们无法将“苹果与桔子”进行比较,因此将实际的int包装在结构中意味着我们可以进行类型检查以及通过代码获得一些额外的可读性和文档。
我的问题是:无论是在内存还是速度上,与之相关的开销是多少?由于结构是值类型,包含这些结构的变量是否为32位或更大?使用这些结构而不是基元的性能开销又如何呢?运算符重载是否会产生较大的开销?
关于这样做的智慧还有其他建议吗?
解决方法
内存中没有使用
Marshal.SizeOf()
可以验证的结构的开销:
struct testStruct
{
public readonly int value;
}
..
int size = Marshal.SizeOf(typeof(testStruct)); //returns 4
这也与sizeof(testStruct)
返回的相同:
unsafe
{
int size = sizeof(testStruct); //returns 4
}
根据MSDN,两种大小调整方法之间的区别是:
虽然您可以使用
Marshal.SizeOf方法,该值
此方法返回的值并不总是
与返回的值相同
sizeof。 Marshal.SizeOf返回
类型确定后的大小
封送,而sizeof返回
大小,因为它已经由
公共语言运行时,包括任何
填充。
, 为此,我可能会回避,但是您可以这样做:
using Apple = System.Int32;
using Orange = System.Int32;
您将无法跨文件使用它。从技术上讲,您仍然可以将苹果与桔子进行比较。