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# 中结构的额外大小[重复] 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 理解 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 运算符只能在不安全的代码块中使用 而且结构不应包含任何引用类型