类型的 sizeof() 运算符

Posted

技术标签:

【中文标题】类型的 sizeof() 运算符【英文标题】:sizeof() operator for types 【发布时间】:2013-08-04 01:43:23 【问题描述】:

我通常会在我的 C++ 代码中这样做:

int variable = 10;
int sizeOfVariable = sizeof(variable);   //Returns 4 for 32-bit process

但这似乎不适用于 C#。有模拟吗?

【问题讨论】:

int 的大小在 C# 中总是 32 位。这是因为intSystem.Int32 的别名,而System.Int32 根据定义是32 位的,并且不会永远改变。期间,故事结束。 @Jason 那不是很光荣吗?! @Jason:我显然没有以那种特定的形式使用它。 Getting the size of a field in bytes with C# 的可能重复项 @Jason:关键是直接获取variable的大小,而不引用它的类型,这样如果将来有人决定将variableint更改为short,他不必寻找其他地方进行替换。 【参考方案1】:

C# 中的sizeof 运算符仅适用于编译时已知类型,不适用于变量(实例)。

正确的例子是

int variable = 10;
int sizeOfVariable = sizeof(int);

所以您可能正在寻找可用于任何对象实例或运行时类型的Marshal.SizeOf

int variable = 10;
int sizeOfVariable = Marshal.SizeOf(variable);    

更多信息请见here

【讨论】:

谢谢。我是新的,这很容易。但只是出于好奇,sizeof 是做什么的? 它用于获取类型的大小(以字节为单位)。类型应该在编译时就知道了。 Marshal.SizeOf(object) 告诉您对象的 非托管 大小。 可能对象的非托管大小与其托管大小不同。 sizeof(typename) 告诉您名称为typename 的类型实例的托管 大小。 sizeof只能应用于作为值类型名称的typenames。 sizeof 只能不安全代码中使用。 请不要在boolchar 上使用Marshal.SizeOf() :-) @xanatos 为什么 Marshal.SizeOf 对 bool 和 char 行为不端?或者它实际上是 sizeOf C# 运算符行为不端?谁在报告这些值时是正确的。它是否以某种方式归因于关于它们如何存储在内存中的一些事实内部表示?【参考方案2】:

.NET 4.0 及以上版本:

if (Environment.Is64BitProcess)
    Console.WriteLine("64-bit process");
else
    Console.WriteLine("32-bit process");

.NET 框架的旧版本:

public static bool Is64BitProcess

    get  return IntPtr.Size == 8; 

从你的例子中我假设你想这样做来确定进程的位数,这实际上可能不是你想要做的!)

【讨论】:

我没有使用它来确定操作系统的位数。我需要它知道内存中原始变量的大小。【参考方案3】:

您可以使用Marshal.SizeOf() 方法,或在非托管代码中使用sizeof

Console.WriteLine(Marshal.SizeOf(typeof(int)));

This prints 4 on ideone.

这是一个link to Eric Lippert's blog,描述了两个 sizeof 选项之间的区别。

【讨论】:

【参考方案4】:

只有少数标准情况下您需要这样做:

int x = sizeof(T) // where T is a generic type

遗憾的是它不起作用:-)

int x = Marshal.SizeOf(T) // where T is a generic type

除了charboolMarshal.SizeOf(typeof(char)) == 1 而不是 2,Marshal.SizeOf(typeof(bool)) == 4 而不是 1)之外,它确实有效

int x = sizeof(IntPtr);

它不起作用,但你可以这样做

int x = Marshal.SizeOf(typeof(IntPtr));

或者,更好

int x = IntPtr.Size;

所有其他基本类型(bytesbyteshortushortintuintlongulongfloat、@987654341 987654342@, bool, char) 有一个固定的长度,所以你可以做sizeof(int),它总是4。

【讨论】:

Marshal.SizeOf API 错误报告 char 和 bool 类型变量的大小实际上是错误的,或者归因于它们如何存储在内存中的一些事实内部表示? @RBT “错误”大小是因为返回的大小是对 Windows API 进行封送处理时使用的大小(您正在使用 Marshal.SizeOf :-))。例如见UnmanagedType.Bool:A 4-byte Boolean value 感谢您的回复@xanatos。与此同时,我出于好奇问了同样的问题,汉斯很好地解释了它。你可以看看here。【参考方案5】:

您可以在不安全的上下文中对用户定义的结构使用sizeof,但与 Marshal.SizeOf 不同的是,它不支持装箱对象

【讨论】:

以上是关于类型的 sizeof() 运算符的主要内容,如果未能解决你的问题,请参考以下文章

sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理

sizeof运算符介绍以及常见的坑

具有可变长度数组类型的 Sizeof 运算符

C语言中,sizeof运算符有啥作用?

对象表示和运算符 sizeof 的定义

指针数组与sizeof运算符