gpt4 book ai didi

c++ - 指向不完整类型成员函数的指针

转载 作者:可可西里 更新时间:2023-11-01 16:38:43 28 4
gpt4 key购买 nike

我不明白为什么为类添加前向声明会改变其指向成员类型的指针的大小

#include <iostream>
using namespace std;

int main()
{
//struct CL;
//cout<<sizeof(int (CL::*)())<<endl;
struct CL{};
cout<<sizeof(int (CL::*)())<<endl;
}

输出VS2013:
4

但是如果我在 main() 中取消注释前两行,那么输出就会不同:
16
16

因此,只需在 struct CL 的定义之前添加前向声明即可增加指向 CL 成员的指针的大小。为什么?我知道成员函数指针的大小取决于类型的结构(例如,虚函数和基类可能会增加它),但为什么 sizeof 运算符可以应用于指向不完整类型成员的指针?或者它不能?我没有在标准中找到它

最佳答案

MSVC 编译器使用不同大小的成员函数指针作为优化。这种优化违反了标准。感谢Igor Tandetnika MSDN form post 中提及 reinterpret_cast , [expr.reinterpret.cast]p10

A prvalue of type “pointer to member of X of type T1” can be explicitly converted to a prvalue of a different type “pointer to member of Y of type T2” if T1 and T2 are both function types or both object types. The null member pointer value is converted to the null member pointer value of the destination type. The result of this conversion is unspecified, except in the following cases:

  • converting a prvalue of type “pointer to member function” to a different pointer to member function type and back to its original type yields the original pointer to member value.

因此存在往返保证,这有效地强制符合要求的实现对所有指向成员函数类型的指针使用相同的大小。


如果 /vmb switch 执行 MSVC 优化已设置。对于单继承的情况,优化后的成员函数指针只需要void*大小的存储空间,参见The Old New Thing: Pointers to member functions are very strange animals .

如果您仅前向声明类型 CL,然后形成一个指向成员函数的指针,则优化有望被停用(不幸的是,我找不到任何相关文档)。否则,您可能会在 CL 定义前后得到不一致的大小。

顺便说一下,如果您在未指定基础类型的情况下前向声明它们,然后为枚举的定义显式定义基础类型,则您可能会在 VS2010 中获得不一致的枚举大小。这仅适用于激活的语言扩展。

关于c++ - 指向不完整类型成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923296/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com