在这draft份的附件M中,我发现:

增加了memalignment功能来查询指针的对齐方式;

然后是其文档:

7.24.9内存对齐 7.24.9.1 memalignment功能

概要

#include <stdlib.h> size_t memalignment(const void *p);

描述

memalignment函数接受指向任何对象的指针并返回最大值 对齐由其地址值满足.对齐可能是 扩展对齐,也可能超出 由alignas显式使用的实现.359)如果是这样,就会 满足实现可用的所有对齐.的值 返回的可以与alignof的结果进行比较,如果是 大于或等于,则类型操作数的对齐要求为 满意

返回

指针p的对齐方式,是二的乘方.如果p是空指针,则返回零对齐.

注意

零对齐表示测试指针不能 用于访问任何类型的对象.

问题:用外行的术语来说,"最大对齐"和"扩展对齐"是什么意思?难道指针的对齐不能与alignof操作符找到吗?

推荐答案

问:用外行的术语来说,"最大对齐"和"扩展对齐"是什么意思,.

如果地址是k的倍数,则地址为alignedk字节.1由于计算机体系 struct ,我们只关心2,2p乘方排列.地址的maximum alignment是2的倍数的最大乘方.例如,2除120(8·3·5)的乘方是1、2、4和8,但不是16或更大.因此8是地址120的最大对齐.

关于extended alignment,C标准定义了多种标准类型,包括charshortintfloat和指针.这些类型中的每一种都有对齐要求.这些标准类型的排列称为fundamental alignments.为了满足C标准的基本要求,C实现必须支持这些基本一致.然而,C实现也可能支持更严格的对齐.这些被称为extended alignments.它只是意味着与基本对象所需的更大的2次乘方对齐.

..难道不能用运算符的星号找到指针的对齐吗?

不,因为alignof操作符只能应用于type,不能应用于object.C标准定义了alignof (int),但没有定义alignof xalignof (x),其中x是对象的名称.

即使指定alignof应用于对象,类似于sizeof,它也可能只指定为给出类型的对齐要求,而不是当前对象的实际最大对齐,因为sizeofalignof的其他用途是可变长度数组类型以外的类型的编译时常数.

脚注

1或者,如果地址空间不是"平坦",那么地址与参考点的距离是k字节的倍数.

C++相关问答推荐

va_arg -Linux和Windows上的不同行为

插入元素后,Sizeof操作符无法正常工作

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

为什么海湾合作委员会在共享对象中的. init_data的虚拟内存地址之前留出一个空白

为什么已经设置的值在C中被重置为for循环条件中的新值?

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

如何正确地索引C中的 struct 指针数组?

堆栈帧和值指针

难以理解Makefile隐含规则

如何在C中引发/处理自定义信号?

在 struct 中强制转换空指针

GCC创建应用于移动项的单独位掩码的目的是什么?

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

如何只获取字符串的第一个单词,然后将其与c中的另一个单词进行比较?

-Wnonnull-Compare警告不是具有误导性吗?

有没有一种方法可以用C创建保留限定符的函数?

我可以创建适用于不同endian的 colored颜色 struct 吗?

C中的回文数字

是否有单独的缓冲区用于读写库调用?

为什么argc和argv即使在主函数之外也能工作?