相关疑难解决方法(0)

为什么结构的sizeof是不安全的

MSDN中明确规定

对于所有其他类型(包括结构),sizeof运算符只能用于不安全的代码块.

C#语言规范是更精确的:

  1. 未指定成员打包到结构中的顺序.
  2. 出于对齐目的,在结构的开头,结构内和结构的末尾可能存在未命名的填充.
  3. 用作填充的位的内容是不确定的.
  4. 当应用于具有结构类型的操作数时,结果是该类型的变量中的总字节数,包括任何填充.

但是CLR如何处理以下结构:

[StructLayout(LayoutKind.Explicit, Size = 1, Pack = 1)]
public struct MyStruct
{
    [FieldOffset(0)] public byte aByte;
}

public struct MyEmptyStruct { }
Run Code Online (Sandbox Code Playgroud)

MyStruct我们明确地强制布局,大小,以及如何通过它打包StructLayout属性.该结构应该在内存中具有1个字节的大小.

另一方面MyEmptyStruct是空的,我们可以假设内存中的大小将是0字节 - 即使这样的结构很可能不会被使用它仍然是一个有趣的案例.

当尝试使用来计算论文结构的大小sizeof(MyStruct)sizeof(MyEmptyStruct)编译器会引发以下错误:

' * '没有预定义的大小,因此sizeof只能在不安全的上下文中使用

我想知道为什么sizeof要考虑在这种情况下使用unsafe.问题不是要求解决方法,也不是要求计算结构大小的正确方法,而是要关注原因.

c# struct sizeof

12
推荐指数
2
解决办法
3486
查看次数

获取给定System.Type的结构的sizeof

给定一个结构MyStruct,我可以sizeof(MyStruct)在不安全的代码中使用该结构的实例大小.但是,我想获得给定结构Type对象的结构的大小,即sizeof(typeof(MyStruct)).有Marshal.SizeOf,但是返回非托管编组大小,而我想要该结构的托管大小.

.net c# sizeof

7
推荐指数
1
解决办法
4737
查看次数

Writing packed structs with a MemoryMappedViewAccessor bug?

I have a struct that is defined with Pack=1 and it is 29 bytes long. If it is not packed, it would be 32 bytes long.

  • Marshal.SizeOf(TypeOf(StructName)) returns 29.

  • StructName struct; sizeof(struct) returns 32.

When I write that struct out using MemoryMappedViewAccessor it writes out 32 bytes, NOT 29 bytes.

So, short of marshalling the struct to a byte array and writing it out that way, is there any way to get it to write out that struct correctly?

More …

c# struct marshalling memory-mapped-files

7
推荐指数
1
解决办法
3644
查看次数

具有泛型类型字段的struct的大小

我想估计包含泛型类型参数的结构数组的大小,在本例中是一个字典条目结构.要做到这一点,我需要结构的大小.

struct Entry
{
   int hash;
   int next;
   TKey key;
   TValue value;
}
Run Code Online (Sandbox Code Playgroud)

如何获得此结构的字节大小?

编辑

似乎使用Marshal.SizeOf是有问题的.传递结构的类型将引发一个异常,说该参数不能是泛型类型定义.

如果我改为调用带有实例的重载,例如,Marshal.SizeOf(default(Entry))如果两个泛型类型参数都是值类型,它将起作用.如果泛型参数是例如,<int, object>则抛出此异常

无法将字典`2 + Entry [System.Int32,System.Object]'封送为非托管结构; 不能计算有意义的大小或偏移量.

.net c# struct

4
推荐指数
1
解决办法
3712
查看次数

标签 统计

c# ×4

struct ×3

.net ×2

sizeof ×2

marshalling ×1

memory-mapped-files ×1