指向C++中成员的指针如何在内部工作?
How do pointers to members in C++ work internally?
我想知道指向成员的指针如何在C++中工作。
我看了一些地方,发现它们存储了某种偏移量。并利用成员在内存中出现的顺序与在类/结构定义中声明它们的顺序相同。但。。。
#include <iostream>
#include<typeinfo>
using namespace std;
struct S
{
S(int n): mi(n) {}
int mi;
int k;
int f() {return mi+k;}
};
int main()
{
S s(7);
int S::*pmi = &S::mi;
int S::*lop = &S::k;
int (S::*sf)() = &S::f;
cout<<&S::mi<<endl<<&S::k<<endl<<&S::f<<endl<<pmi<<endl<<lop<<endl<<sf<<endl;
cout<<typeid(lop).name()<<endl;
}
我希望看到某种偏移量。但是,第一行中带有 cout<<的所有值都给出 1 作为输出。
我不明白,如果所有人都给出 1,那么有关偏移量的信息存储在哪里?
如果您能解释一下真正发生的事情,那将非常有帮助。
Iostreams 插入运算符没有指向成员的指针重载。
然而,bool
存在重载,指向成员的指针可隐式转换为bool
- 指向成员的空指针将转换为 false,否则为 true。bool
如果为真,则流式传输为 1,如果为假,则流式传输为 0。因此,您观察到的输出是,指向成员的所有指针都不是空的。
我尝试按++递增..但这也不起作用..
递增不起作用,因为指向成员的指针不支持指针算法。
那么,有没有办法实际看到偏移值?
任何东西都可以作为字节数组来观察,所以你可以用一个小的辅助函数来惊叹于成员指针的内容:
template<class T>
void print_raw(const T& obj) {
const unsigned char* cptr = reinterpret_cast<const unsigned char*>(&obj);
const unsigned char* end = cptr + sizeof(T);
while(cptr < end) {
printf("%02hhx ", *cptr++); // is there simple way with iostreams?
}
std::cout << 'n';
}
std::cout << "pmi: ";
print_raw(pmi);
std::cout << "lop: ";
print_raw(lop);
std::cout << "sf: ";
print_raw(sf);
我的系统上的示例输出:
pmi: 00 00 00 00 00 00 00 00
lop: 04 00 00 00 00 00 00 00
sf: f0 08 40 00 00 00 00 00 00 00 00 00 00 00 00 00
这可能会让您深入了解编译器如何实现它们。请注意,如果实现包含任何填充字节/位,则这些字节/位可能具有任何值,因此任何非零值可能毫无意义。
成员对象指针输出似乎很明显。它看起来像一个字节序 64 位偏移到对象中。mi
的偏移量为 0,k
的偏移量为 4 字节。
iostreams 不能直接打印指向成员的指针。
但是,任何指针都可以转换为布尔值。
它恰好是使std::cout::operator<<
工作的唯一可能的转换,因此它不是模棱两可的。
您的代码等效于以下内容:
cout
<< static_cast<bool>(&S::mi) << endl
<< static_cast<bool>(&S::k) << endl
<< static_cast<bool>(&S::f) << endl
相关文章:
- 如何在公共头文件中向库的用户公开枚举,同时在内部使用它?
- std::strlen 在内部是如何工作的?
- STRCMP内部IF在内部不起作用
- 递归函数调用在后台工作
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 指向C++中成员的指针如何在内部工作?
- 删除和删除[]在内部如何工作?
- 自动参数如何在内部工作
- C++放置位置删除如何在内部(C++运行时)工作?如何克服其局限性?
- 函数指针仅在 main 内部工作
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- 如何将负数转换为更广泛的类型在内部工作
- 在UTF-8内部工作,然后仅在Windows中需要时转换为UTF-16,是否存在任何危险
- 静态是如何在函数内部工作的
- 套接字api不能在类内部工作
- Setter不在类方法内部工作
- 在哪里可以找到SciPy库中csr矩阵加法的内部工作
- C++14记忆模型如何在内部工作以及它与培根的垃圾收集统一理论的比较
- Switch case语句如何在内部实现或工作