alignof(T*) 是否对所有可能的类型相同?sizeof(T*) 呢?

4

alignof(T*)对于所有可能的类型T,返回的值相同吗?sizeof(T*)呢? 请根据标准允许/指定的内容回答,并不是基于不同编译器当前情况。


4
据我所知,对于函数指针和普通(数据)指针来说,答案可能是不同的。 - HolyBlackCat
你似乎认为有类别,比如所有POD类型都是相同的,所有成员字段也是相同的,是这样吗?你能列出这些类别吗? - Koosha
2
@Tiger4Hire 成员指针虽然被称为指针,但实际上并不是 T*。只有对象指针和函数指针才是指针类型。 - eerorika
是的,有不同的类别。某些对象需要与它们的 C 等效物兼容,因此由 C 标准定义。您可以将指针广泛分为“C 指针”和“C++ 指针”。在 C++20 中,标准在这方面发生了变化,但在此之前,“POD”(包括指向 POD 数据的指针)具有更严格的要求。 - Tiger4Hire
1
你提供的链接中只讨论了 sizeof,没有提到 alignof。即使对于 sizeof,它似乎也不是一个完整的答案。所选答案是“是的”,它们都等于 sizeof(void*),但没有解释或参考资料。还有另一个答案说“不是”(根据标准),但它没有说有分类,这就是你之前说的内容。 - Koosha
显示剩余5条评论
1个回答

3
标准并未详细说明指针的大小和对齐方式,因此它们不受语言的严格限制。
将一个有效的函数指针转换为另一个函数指针再转换回来可以保证生成原始值。因此,必须有相同的最小可表示值数量,即任何给定函数指针类型的最大有效地址数,这给出了所有函数指针类型的大小下限。
对象类型之间的转换也有类似的保证,但仅适用于原始指向类型具有更严格或相等的对齐要求的情况。因此,指向高度对齐类型的对象指针需要较少的可表示值。如果对齐足够高,则该类型理论上可能更小。
在允许指向void和指向函数之间进行转换的系统上(这是有条件支持的),指向函数和指向void的可表示值的最小数量必须相同。
但即便如此,一些指针类型可能比其所需的可表示值数量更大。这些额外的位将被强制未使用。这并不是非常实用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接