为什么结构体的 sizeof 不安全

2024-01-28

The MSDN http://msdn.microsoft.com/en-us/library/eahchzkf%28v=vs.80%29.aspx明确指出

对于所有其他类型,包括结构体,sizeof 运算符只能 在不安全的代码块中使用。

The C# 语言规范 http://www.microsoft.com/en-us/download/confirmation.aspx?id=7029更精确的是:

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

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

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

public struct MyEmptyStruct { }

In MyStruct我们明确地强制布局、大小以及如何通过StructLayout属性。这个结构是supposed内存中的大小为 1 字节。

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

当尝试使用以下方法计算这些结构的大小时sizeof(MyStruct) and sizeof(MyEmptyStruct)编译器抛出以下错误:

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

我想知道why using sizeof在此背景下被认为unsafe。这个问题并不是要寻求解决方法,也不是要寻求解决方法correct计算结构体大小的方法,而是关注原因。


我想知道为什么在这种情况下使用 sizeof 被认为是不安全的。

马修·沃森的评论一针见血。您打算如何处理安全代码中的这些信息?它对任何事情都没有用(*)。它不会告诉您需要分配给 marshal 多少非托管字节;那是Marshal.SizeOf。它只对指针算术有用,那么为什么它应该在安全子集中​​呢?


(*) 公平地说,有一些奇怪的极端情况用于安全sizeof可以采用包含托管类型的结构。例如,假设您有一个通用集合类,它将分配一堆数组,并希望确保这些数组不会移动到大对象堆中;如果您可以获取包含托管对象的结构的大小,那么您可以非常轻松地编写此代码,并且不需要任何指针算术。但事实仍然是sizeof是专门为指针算术而设计的,而不是为了让您可以围绕数组的垃圾收集启发式进行最终运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么结构体的 sizeof 不安全 的相关文章

随机推荐

  • 通用匹配模式('/**')在其他模式之前定义

    我在尝试将 Spring Security 引入我的 web 应用程序时遇到问题 这是我的web xml
  • 如何显示行车路线[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在开发一个应用程序 用户可以输入
  • Knex.js - 如何使用“where”子句创建唯一索引?

    我正在使用 Knex js 我想使用 WHERE 子句为我的表创建唯一索引 db schema createTable newTable function t t increments t string col1 defaultTo nul
  • 使用 OpenRefine(或 R)解析大型且复杂的 Json 文件的最佳方法

    我知道如何在 Open Fine 中解析 json 单元格 但这对我来说太棘手了 我使用 API 提取了 4730 个 AirBNB 房间的日历 并通过其 ID 进行识别 以下是一个 Json 文件的示例 对于从现在到 2017 年 11
  • 在 Heroku 上登录 Django 未出现

    我在 Heroku 上创建了一个应用程序 并将我的 Django 应用程序推送到它 我使用监控日志heroku logs tail实时查看它们 然后 在我的settings py 我有以下内容 LOGGING version 1 disab
  • 将 cat 的输出通过管道传递给 cURL 以下载文件列表

    我在一个名为的文件中有一个 URL 列表urls txt 每行包含 1 个 URL 我想使用 cURL 一次性下载所有文件 我似乎无法说出正确的一句话 I tried cat urls txt xargs 0 curl O 但这只给了我列表
  • wpf文本框平面边框样式

    需要为基于 wpf 的文本框提供平面边框样式 真的很惊讶地发现没有简单的方法可以像 winforms 文本框 BorderStyle FixedSingle 那样获得此样式 有没有简单的方法可以为 wpf 文本框完成此操作 实现的方法是使用
  • iOS:为什么我们的应用程序有时不显示在通知中心?

    这个问题有3种情况 在开发过程中 我可以重新启动iPhone并重新安装 应用程序来解决这个问题 首先 这个问题经常出现在越狱的iPhone上 所以我们 认为配置可能有问题 个人资料 但现在 越来越多的用户抱怨这个问题 无法接收推送 他们使用
  • 如何比较两个git分支并通过提交消息过滤差异?

    我有一个名为的发布分支release X X X X其中包含我想要部署到生产的所有功能分支 发布分支是在master这是当前的生产状态 在每个发布日 我都会确保我们的发布分支仅包含计划用于发布的更改 我使用此命令来比较发布分支和主分支 gi
  • requireJs 订单插件:它可以存在于与 require.js 基本路径不同的路径中吗?

    使用订单插件时 require js 在给定的 basePath order js 中查找它 example require baseUrl public js require order http cdnjs cloudflare com
  • 如何将移动构造函数与二维数组 (**) 一起使用?

    可能是我错误地编码了我的类 但是当我使用移动构造函数而不是复制 cotr 作为重载之一 而不是准确地说 时 我的程序崩溃了 例如 class Sample int a int b constructor declarations 在 cpp
  • python 按键简单游戏

    我想在屏幕上看到一个符号 例如可能是 散列 符号会有一些起始位置 比如说 0 0 如果我按向右箭头 我希望看到标志向右移动 如果按向左箭头 我希望看到标志向左移动 等等 到目前为止 我的代码看起来像这样 它适用于读取 pos 但我想添加某种
  • Delphi 如何获取控件上的光标位置?

    我想知道 TCustomControl 上光标的位置 如何找到坐标 获取光标位置 http msdn microsoft com en us library ms648390 28v vs 85 29 aspx如果您无法处理鼠标事件 这会很
  • 动画 UIButton 的标题更改

    在这里我找到了如何制作动画UIButton的标题更改使用现已弃用beginAnimations context method iPhone 的 UIBUtton 标题动画 https stackoverflow com questions
  • 在 ASP.NET WebApi 2 中实现移动应用程序的外部身份验证

    我正在尝试构建一个 API 使用 ASP NET WebApi 该 API 将由学校项目的本机移动应用程序使用 我不关心 开发移动应用程序 这个责任由不同的成员承担 我现在需要实现基于令牌的 Facebook 登录 有很多教程可用于介绍如何
  • 如何以编程方式获取 Admob 的设备 ID?

    我有多个设备 而且可能还会有更多 并且不想一一添加 有人知道 Admob 使用什么 ID 吗 String aid Settings Secure getString getContext getContentResolver androi
  • Gem 安装错误可写和 PATH

    这是我遇到的两个错误 我使用的是 OS X 老实说 不知道我是否通过 gem 安装 如果这很重要的话 WARNING Installing to gem since Library Ruby Gems 1 8 and usr bin are
  • 将列表拆分为单独但重叠的块

    假设我有一个清单A A 1 2 3 4 5 6 7 8 9 10 我想创建一个新列表 比如说B 按以下顺序使用上面的列表 B 1 2 3 3 4 5 5 6 7 7 8 9 9 10 即前 3 个数字为A 0 1 2 后 3 个数字为A 2
  • GAE 云数据存储:获取最常编写的模型

    我正在尝试按最常编写的模型的降序排列模型列表 这是我到目前为止所尝试过的 client查询集提供模型及其属性 属性的详细信息 以及这些模型相关的详细信息 实体计数 内置索引计数 内置索引大小 数据大小 复合索引大小 复合索引计数 总大小 但
  • 为什么结构体的 sizeof 不安全

    The MSDN http msdn microsoft com en us library eahchzkf 28v vs 80 29 aspx明确指出 对于所有其他类型 包括结构体 sizeof 运算符只能 在不安全的代码块中使用 Th