Usa*_*Ito 3 c++ memory-management std multiple-inheritance c++11
在C++中,它是使用std::enable_shared_from_this和继承的小样本代码.在p此代码,调用一个成员函数FB和FA.它p是相同的对象,但称为fa和fb采用不同的this地址.
为什么要采取不同的地址?
码:
#include <memory>
#include <iostream>
template<class T> using S = std::enable_shared_from_this<T>;
struct A: S<A> { auto fa() const -> void { std::cerr << this << "\n";} };
struct B: S<B>, A { auto fb() const -> void { std::cerr << this << "\n";} };
auto main() -> int
{
auto p = std::make_shared<B>();
p -> fa();
p -> fb();
std::cerr << p << "\n";
}
Run Code Online (Sandbox Code Playgroud)
结果:(经过测试的编译器是Linux Mint 16 KDE上的clang ++ - 3.2,g ++ - 4.8和em ++ - 1.12,以及作为在线编译平台的wandbox中的clang ++ - 3.4.)
0x8376a8
0x837698
0x837698
Run Code Online (Sandbox Code Playgroud)
wandbox:http://melpon.org/wandbox/permlink/rmcCrR0rqLd7tKfV
这与此无关std::enable_shared_from_this; 这是多重继承的一般情况.在类的成员函数内X,thisis 的类型X*,即它指向X完整对象的子对象.所以当调用A::fa()一个B对象时,this指的是A子对象B.根据编译器选择的内存布局,可以从对象的初始地址偏移.
换句话说,对象B包含基类对象A和基类对象S<B>.由于您S<B>首先列出,编译器选择在布局中S<B>首先B布局,然后A在布局之后布局.所以内存布局看起来像这样:
+-------+-----+---------------------------+
| S<B> | A | B's non-inherited members |
+-------+-----+---------------------------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |