为什么对齐是2的幂?

2024-04-07

有一句话来自参考参数 http://en.cppreference.com/w/cpp/language/object#Alignment:

每个对象类型都具有称为对齐要求的属性,该属性 是一个整数值(std::size_t 类型,始终是 2 的幂) 表示连续地址之间的字节数 可以分配该类型的对象。

据我了解,该参考文献是非规范性的。但没有关于价值的东西alignof(T)在标准中,而不是它不超过alignof(std::max_align_t).

对齐是2的幂并不明显。为什么对齐不是3?


该标准对该语言有最终决定权,因此这里引用了该部分的内容。我将 2 的幂要求加粗:

3.11 对齐[basic.align]

1 对象类型具有对齐要求(3.9.1、3.9.2),该要求对该类型的对象可以分配的地址施加限制。对齐是一个实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。对象类型对该类型的每个对象施加对齐要求;可以使用对齐说明符 (7.6.2) 来请求更严格的对齐。
2 基本对齐由小于或等于所有上下文中实现支持的最大对齐的对齐表示,该对齐等于alignof(std::max_align_t) (18.2)。当类型用作完整对象的类型和用作子对象的类型时,类型所需的对齐可能不同。[ 例子:

struct B { long double d; };
struct D : virtual B { char c; }

当 D 是完整对象的类型时,它将具有 B 类型的子对象,因此必须对 long double 进行适当对齐。如果 D 显示为也将 B 作为虚拟基类的另一个对象的子对象,则 B 子对象可能是不同子对象的一部分,从而减少 D 子对象的对齐要求。—结束示例]alignof 运算符的结果反映了完整对象情况下类型的对齐要求。
3 扩展对齐由大于alignof(std::max_align_t)的对齐表示。是否支持任何扩展对齐以及支持它们的上下文是由实现定义的(7.6.2)。具有扩展对齐要求的类型是过度对齐类型。[ Note:每个过度对齐类型都是或包含应用扩展对齐的类类型(可能通过非静态数据成员)。——尾注]
4 对齐方式表示为类型的值std::size_t。有效对齐仅包括基本类型的alignof表达式返回的值以及附加的实现定义的值集(可能为空)。每个对齐值应为 2 的非负整数幂。
5 阵营有从弱到强或更严格的阵营顺序。更严格的对齐具有更大的对齐值。满足对齐要求的地址也满足任何较弱的有效对齐要求。

为什么所有实现都符合该要求(这就是它可以被包含在内的部分原因)?

嗯,因为在 2 中乘法/除法/屏蔽 2 的幂是很自然的binary,所有系统(不包括一些非常古老的系统)过去、现在、并且在可预见的未来将继续存在本质上是二元的.
自然意味着它比任何其他乘法/除法/模算术更有效,有时甚至高出几个数量级。

As @MooingDuck 指出 /questions/24788262/why-alignment-is-power-of-2#comment38472446_24788755,计算平台的这种基本的二进制性质已经渗透到语言及其标准中,达到这样的程度,尝试构建一个非二进制一致的实现与解开棘手的结而不只是切断它是一样的。确实很少有计算机语言不是这样的。

另请参阅维基百科上的字大小表 //en.wikipedia.org/wiki/Word_(computer_architecture)#Table_of_word_sizes以供佐证。

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

为什么对齐是2的幂? 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐