假设我希望获得额外的类型检查,以便在语义上处理不同的原语:
public struct Apple
{
readonly int value;
// Add constructor + operator overloads
}
public struct Orange
{
readonly int value;
// Add constructor + operator overloads
}
关键是我们无法比较“apple to oranges”,所以在结构中包含实际的int意味着我们可以通过代码获得类型检查和一些额外的可读性和文档。
我的问题是:在内存和速度方面,与此相关的开销是多少?由于结构是值类型,包含这些结构的变量是32位还是更大?使用这些结构而不是基元的性能开销怎么样?运算符重载会产生很大的开销吗?
有关这方面的智慧的任何其他建议吗?
答案 0 :(得分:9)
在内存中使用结构没有任何开销,您可以使用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返回 类型之后的大小 marshaled,而sizeof返回 由它分配的大小 公共语言运行库,包括任何 填充。
答案 1 :(得分:2)
我可能会为此避开,但你可以做:
using Apple = System.Int32;
using Orange = System.Int32;
您将无法跨文件使用它。从技术上讲,你仍然可以将苹果与橙子进行比较。