sizeof 运算符给出了 C# 中结构的额外大小[重复]

2023-12-12

我正在尝试使用 sizeof 运算符检查所有变量(值类型)的大小。我经历了其中之一msdn 文章哪里写着

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

而且结构不应包含任何引用类型的字段或属性

为此,我在项目属性中启用了不安全编译并创建了结构,如下所示-

struct EmployeeStruct
{
    int empId;
    long salary;       
}

并按如下方式使用它-

unsafe
{
   size = sizeof(EmployeeStruct);
}

Console.WriteLine("Size of type in bytes is: {0}", size);

在这里,我得到的输出为类型大小(以字节为单位):16,但是通过查看结构,它应该是 12(4 表示 int,8 表示 long)。 有人可以帮我理解为什么我会得到 4 字节的额外大小吗?


您不需要使用不安全的代码。建议使用 System.Runtime.InteropServices.Marshal.SizeOf()

例如:Marshal.SizeOf(new EmployeeStruct());

返回 16 而不是 12,因为内存中的默认包大小是 8。

因此对于:

struct EmployeeStruct
{
    int empId; // 4 bytes
    long salary;  8 bytes
}

//返回16而不是12(因为最小单位是8)

for:

 struct EmployeeStruct
 {
    int empId; // 4 bytes
    int empAge; // 4 bytes
    long salary;  8 bytes
  }

//也返回16

and for

   struct EmployeeStruct
   {
      int empId; // 4 bytes
      int empAge; // 4 bytes
      int IdCompany; // 4 bytes
      long salary;  8 bytes
   }

返回 24 而不是 20(因为最小单位是 8)

我不知道你想要什么,但如果你需要每个字段大小的总和,你可以尝试使用这个函数:

    public int SizeOf(Type t)
    {
        int s = 0;
        var fields = t.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
        foreach (var f in fields)
        {
            var x = f.FieldType;
            s += x.IsPrimitive ? Marshal.SizeOf(x) : SizeOf(x);
        }

        return s;
    }

对于您的情况,它返回 12 而不是 16,您可以将它用于复杂的结构,例如:

    struct EmployeeStruct
    {
        int field1; // 4 bytes
        long field2; // 8 bytes
        Person p; // 12 bytes
    }

    struct Person
    {
        int field1; // 4 bytes
        long field2; // 8 bytes
    }  

SizeOf(typeof(EmployeeStruct) 将返回 24 而不是 32,但请记住,内存上的实际大小是 32,编译器使用 32 字节来分配内存。

Regards.

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

sizeof 运算符给出了 C# 中结构的额外大小[重复] 的相关文章

  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • 从结构调用 C++ 成员函数指针

    我找到了有关调用 C 成员函数指针和调用结构中的指针的信息 但我需要调用结构内部存在的成员函数指针 但我无法获得正确的语法 我在类 MyClass 的方法中有以下代码片段 void MyClass run struct int MyClas
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • X 轴和 Z 轴上的 Quaternion.Slerp,无 Y 轴

    I am trying to rotate the Player about X Y and Z axis The Y axis should not move from last angle Example if I rotate 45
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 为什么连续抛出 2 个异常不会生成无法访问的代码警告?

    为什么以下代码行不会创建编译器警告 void Main throw new Exception throw new Exception 据我所知 编译器应该通知您无法到达第二个抛出异常 这显然是一个编译器错误 它是在 C 3 0 中引入的
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • 理解 zend 中的网格布局

    我对 zend 中的表单设计有点困惑 我知道我的表单类中有字段 并且外观应该在视图中完成 在几乎是纯 html 的索引视图中 我没有问题 但在显示我的表单的添加和编辑视图中 我在更改外观时遇到问题 我有一个如下的视图脚本 h1 h1
  • 正则表达式替换除数字和小数点之外的所有内容

    我有一个文本字段 只需要保留文本或小数 这是我当前用来替换除数字和小数点之外的所有内容的代码 问题是 我无法找出可以识别其他所有内容的正则表达式 document getElementById target value newVal rep
  • javax.faces.FacesException:java.lang.ClassCastException:java.lang.String无法转换为javax.faces.component.UIComponent

    我的 Java EE Web 应用程序是与 Glassfish 2 1 配合良好 现在我想迁移到 Glassfish 3 1 1 我已按照提供的修改进行操作here 我对 richfaces 的依赖如下
  • Python 脚本无法通过 TextMate 运行,但在 IDLE 和 Eclipse 中正常

    我为家庭作业编写了以下内容 它在运行 Python 3 的 IDLE 和 Eclipse 中运行良好 然而 我尝试使用新的第 1 行 我在此处找到的 从 TextMate 运行它 以将其指向 Mac 上的 Python 3 它似乎正在运行
  • ActionView::MissingTemplate:缺少模板

    当 Google 机器人尝试访问我的其中一个控制器时 我收到此错误消息 ActionView MissingTemplate Missing template channels show application show with loca
  • 如何将参数传递给 WCF post 方法(Restful 服务)

    我正在开发基于 WCF 休息的服务 我在我的服务中编写了 Get 和 Post 方法 当我输入 URL JSON 格式 时 Get 方法能够工作 获取数据 问题是 当我尝试对 POST 方法执行相同操作时 URL 会导航到其他页面 找不到页
  • 调用 onConnected 函数后,GoogleApiClient 抛出“GoogleApiClient 尚未连接”

    所以我发现了一些关于 GoogleApiClient 对我来说不是很清楚的东西 谷歌API客户端有一个函数叫做已连接当客户端运行时运行连接的 一定 我有自己的函数 称为 开始位置聆听这最终是在 GoogleApiClient 的 onCon
  • 为什么我使用 UNUserNotificationCenter 创建的本地通知没有显示在屏幕的右上角?

    运行下面的代码不会在屏幕右上角显示通知 作为横幅或警报 通知is shown在通知中心 我确保我的系统上禁用了 请勿打扰 我还尝试了系统偏好设置 gt 通知 gt 我的应用程序名称中的 横幅 和 警报 设置 Source import Co
  • 如何将图像分成两部分? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我是安卓初学者 我想将位图图像分成块 然后以相同的方式显示图像 但分开 Edit 这段代
  • 我可以使用 google api 对文件设置锁定吗?

    当我查看Gdrive时 还有一个fuse客户端来挂载Gdrive 我想知道 当通过这个客户端修改Gdrive上的文件时 该文件是否被 锁定 或以任何其他方式设置为 正在使用 以防止其他人修改互联网上的 原始 文件 我还没有找到任何与此有关的
  • Bluez 5 未知连接标识符

    我有一个运行最新 Raspbian 的 Raspberry Pi 3 并且我有 从 5 23 升级了 bluez 至 5 43 我正在尝试连接到 BLE 以 2 秒间隔发布广告的设备 我写了一些基于的代码 在 gatttool 上并尝试连接
  • 尼黑阈值处理

    我正在尝试实现 niblack 阈值算法 该算法使用以下公式 pixel pixel gt mean k standard deviation object background 其中 k 的标准值为 0 有人可以告诉我如何在matlab中
  • window.onunload 仅在 Firefox 中关闭选项卡时触发,而不是整个浏览器关闭

    UPDATE 因此 在阅读了您的两个答案后 我意识到没有可靠的方法来确定浏览器窗口何时关闭 本来我打算在页面关闭时用它来解锁数据库中的一条记录 基本上 当用户加载页面时 它访问的记录会锁定 然后在页面关闭时解锁 关于如何以不同 更好的方式做
  • 从 Eclipse 启动 Tomcat 时出现“SetPropertiesRule”警告消息 [重复]

    这个问题在这里已经有答案了 当我从 Eclipse 3 4 启动 Tomcat 6 0 18 时 我收到以下消息 日志中的第一个消息 警告 SetPropertiesRule 服务器 服务 引擎 主机 上下文 将属性 源 设置为 org e
  • 在块矩阵中排列 numpy 数组

    我有 3 个 numpy 数组A B and C 为了简单起见 我们假设它们都是形状的 n n 我想将它们排列为块矩阵 A B B t C where B t应表示转置B 当然 我可以通过一系列串联来做到这一点 top row np con
  • Maven Surefire 找不到 ForkedBooter 类

    最近来到一个新项目 我正在尝试编译我们的源代码 昨天一切都很好 但今天却是另一回事了 每次我跑步的时候mvn clean install在模块上 一旦达到测试 它就会崩溃并出现错误 INFO maven surefire plugin 2
  • 4个字节怎么能存储这么大的值3.4e38

    与 32 位一样 我们只能存储 2 32 位数据 在C语言中 我们如何存储这么大的值3 4e38 我无法理解其背后的机制 在 IEEE 754 32 位二进制浮点格式中 32 位用作 一位符号字段 s 八位指数字段 e 23 位有效数 小数
  • 从2加入多线程访问UI线程控件

    我目前正在为我的公司开发一个小型自动更新项目 经过对多线程的一些研究后 我设法构建了以下代码 线程 01 Private Sub startUpdate If InvokeRequired Then Invoke New FTPDelega
  • 当用户单击上下文菜单中的禁用项目时,会调用哪个事件?

    我有一个按钮 它显示上下文菜单 菜单中有几个项目 其中一些被禁用 setEnabled false 当用户单击禁用的项目时 会调用哪个事件 它不是 onContextItemSelected 也不是 onContextMenuClosed
  • sizeof 运算符给出了 C# 中结构的额外大小[重复]

    这个问题在这里已经有答案了 我正在尝试使用 sizeof 运算符检查所有变量 值类型 的大小 我经历了其中之一msdn 文章哪里写着 对于所有其他类型 包括结构体 sizeof 运算符只能在不安全的代码块中使用 而且结构不应包含任何引用类型