为什么编译器在 N 字节边界上对齐 N 字节数据类型?

2024-01-06

我不明白为什么编译器在 4 字节边界上对齐 int,在 2 字节边界上对齐 Short,在 1 字节边界上对齐 char。 据我了解,如果处理器的数据总线宽度是 4 字节,则从不是 4 的倍数的地址读取 int 需要 2 个内存读取周期。
那么,为什么编译器不将所有数据对齐 4 字节边界呢? 例如:

struct s {
 char c;
 short s;
};

这里, 1) 为什么编译器在 2 字节边界上短对齐?假设处理器可以在单个内存读取周期中获取 4 个字节,那么在上述情况下,即使 char 和 Short 之间没有填充,读取 Short 不是只需要 1 个内存读取周期吗?

2) 为什么编译器不在 4 字节边界上短对齐?


这些对象必须适合数组。数组是连续的。因此,如果第一个元素是 N 字节对齐的,并且所有对象都是 N 字节大,那么数组中的所有对象也必然是 N 字节对齐的。

So, if short将是 2 个字节大,但 4 个字节对齐,数组中的所有 Shorts 之间会有 2 个字节空洞,这是禁止的。

您确实发现您的假设略有缺陷。我可以做一个struct有 26 个字符,并且它不会是 26 字节对齐的。它可以从任何地方开始。 N 字节类型的对齐方式等于 N或除以 N.

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

为什么编译器在 N 字节边界上对齐 N 字节数据类型? 的相关文章

  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • Chrome 内存/垃圾收集问题

    我在使用 Chrome 时遇到内存 垃圾收集问题 我正在开发一个照片上传网站 该网站允许我的客户使用 HTML5 和文件 API 拖放照片进行上传 因此这在 IE 中不起作用 它仅适用于 Chrome 和 FF 我还没有在 Safari O
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • cocoapods activesupport冲突ios开发

    我尝试在 cocoapods 项目上报告此问题 但被指示在此处发布 我最近承担了一个工作项目 但我无法让以前的顾问设置在我的本地工作站上运行 然而 当我运行时 我能够成功安装 cocoapods gempod install它爆炸了 spe
  • Django modelform:是否可以内联添加相关模型?

    我真的希望这不是重复的 我找不到任何东西 但这可能意味着我不擅长搜索 我有一个 Django 应用程序 并且工作人员已经在使用管理应用程序来 嗯 管理目的 我还为特定模型创建了一个快速数据输入页面 基本上是通过在基本模板中放置模型表单来创建
  • 为什么“git describe”在我的干净 git 存储库副本上显示较旧的标签版本?

    一些背景 我目前有两个本地 git 存储库 它们指向相同的源 主项目 我有两个 git 存储库的原因是 我有一个干净的主副本 我可以在需要时使用 还有一个副本 我可以在沙箱中应用更改 提交等 这可能有点矫枉过正 但有一些优点对我个人来说 有
  • 模型更改时角度视图(DOM 元素)不会更新

    在最新稳定的 Chrome 中运行最新稳定版本的 Angular 我对位于 ng 控制器 A 的视图内的 DOM 元素进行了 ng click 但 DOM 元素本身的 ng controller 设置为another控制器 B ng cli
  • F# 记录的字段声明为私有时出现奇怪的可访问范围

    我刚刚注意到 当 F 记录的字段部分被声明为私有时 出现了相当违反直觉的行为 这与是否可以将记录的字段设为私有 或者将记录成员设置为私有 https stackoverflow com questions 12389308 is it po
  • iPhone 在 API 调用后重新启动

    我面临一个非常奇怪的问题 我的 iPhone 正在重新启动 此问题仅在特定场景下发生 第 1 步 我有一个同步过程 其中加载整个应用程序的数据 所以我基本上通过上传 4 5 个相机捕获的图像并同步应用程序数据来进行大量的 API 调用 第
  • Netbeans 7.4 for PHP 上的“不要直接访问超级全局 $_SERVER 数组”

    是的 类似的问题已发布并正确回答 Netbeans 7 4 for PHP 上警告 不要直接访问超全局 POST 数组 https stackoverflow com questions 19767894 warning do not ac
  • div外框

    我有一个关于 div 和框架的问题 当框架内有下拉列表时 按下下拉列表时 下拉列表将显示在框架外部 我有一个替代下拉列表 它几乎具有相同的属性 但我必须将元素彼此相邻显示 因此元素显示在 div 中 我的问题 有没有办法 当您按下替代下拉菜
  • 对颜色进行排序 (Objective-C)

    我正在做这样的事情 NSArray colors float divisor 3333 NSMutableArray retVal NSMutableArray array for float one 0 one lt 1 0f one d
  • 通过 Loader.loadBytes(byteArray) 加载图像

    我想问一件事 如果我创建 Loader 并通过 URL 请求加载外部图像 将会得到结果 loader content is Bitmap loader content bitmapData is BitmapData 但如果我使用 Load
  • 裸存储库中的 git ls-files

    我想访问一个裸git存储库 并且我想列出存储库中的所有文件 在普通的 git 存储库上 我可以通过运行轻松地做到这一点git ls files 输出示例 git ls files README md file1 js file2 js fi
  • 从本地计算机访问 GCP Memorystore

    在开发过程中从本地计算机访问 Memorystore 的最佳方式是什么 是否有类似 Cloud SQL Proxy 之类的东西可以用来设置隧道 您可以启动 Compute Engine 实例并使用端口转发连接到您的 Redis 计算机 例如
  • 泛型和约束多态性与子类型

    In this PDF 演示文稿 http research microsoft com en us um people simonpj papers haskell retrospective ECOOP July09 pdf关于 Has
  • Pytest Monkeypatch 不适用于导入的函数

    假设一个项目中有两个包 some package and another package some package foo py def bar print hello another package function py from so
  • 如何格式化来自 MongoDB 的日期?

    我正在使用 Jade 从 Express js 中呈现我的视图 我正在 MongoDB 中保存文档并使用 Mongoose 访问我的文档 我正在保存创建新文档时创建的默认日期 并将该日期创建属性返回到需要格式化的视图 MongoDB 中存储
  • jquery ui 可调整大小的自定义句柄错误

    我试图让自定义句柄与 jquery ui 可调整大小的小部件一起使用 但是当我使用handles 选项将 jquery 引用传递给另一个元素时 它失败了 从我从文档和网络上的其他示例中读到的内容来看 这应该可以正常工作 div class
  • 具有代理支持的 python webkit

    我正在编写一个用于抓取网页的 python 脚本 我创建了一个 webkit webview 对象并使用 open 方法来加载 url 但我想通过代理加载网址 我怎样才能做到这一点 如何将 webkit 与 proxy 集成 哪个 webk
  • 退出自定义 Sails 1 和 Actions 2

    如果我想使用操作 2 在 sails 1 中返回带有状态代码和错误消息的错误的输出 该怎么办 EX exits notFound description not found responseType notFound 怎样才能退出呢 例如
  • 写入 Hadoop 中 HDFS 中的文件

    我一直在寻找一个磁盘密集型 Hadoop 应用程序来测试 Hadoop 中的 I O 活动 但我找不到任何此类应用程序可以使磁盘利用率保持在上述水平 例如 50 或者某些此类应用程序实际上使磁盘保持繁忙 我尝试了 randomwriter
  • 为什么编译器在 N 字节边界上对齐 N 字节数据类型?

    我不明白为什么编译器在 4 字节边界上对齐 int 在 2 字节边界上对齐 Short 在 1 字节边界上对齐 char 据我了解 如果处理器的数据总线宽度是 4 字节 则从不是 4 的倍数的地址读取 int 需要 2 个内存读取周期 那么