这里访问了多少个不同的指针/间接层
How many different pointers/levels of indirection are accessed here?
我有四个代表继承和组合层次结构的类:
class A{
//Structure here not important
}
class B : public A{
int a;
shared_ptr<C> c;
}
class C{
shared_ptr<D> d;
}
class D{
std::list<int> e;
}
然后我有一个vector<shared_ptr<A>>
,我迭代并求和两个D std::list<int>
对象的*begin()
值:
for(int i = 0; i< vec.size(); i++){
shared_ptr<B> b = vec[i];
shared_ptr<C> c = b->c;
sum += *(c->d->e.begin());
}
我试图找出每次循环迭代可以进行多少单独的缓存行访问(如果我们假设最坏的情况下,每个间接/指针级别存储在不同的缓存行中)。
到目前为止,每次迭代我计算了7.25个不同的缓存行:
- 将
shared_ptr<A>
访问vec[i]
(这是0.25,因为sizeof(shared_ptr<A>)/64
) - 访问
A
对象vec[i]
指向 - 访问
shared_ptr<C>
c指向 访问 - 访问d 的
- 访问对象
D d
访问 - 访问
d
的*begin()
数据
C
对象c
指向shared_ptr<D>
对象d
的std::list<int> e
指针我错过了什么吗?我不确定在循环(b
和c
)内的堆栈上创建的对象是否可以存储在不同的缓存行中,以访问它们正在访问的指针(vec[i]
和b->c
)。
在评论中添加答案以补充对话
这是你的循环和一些注释:
for(int i = 0; i< vec.size(); i++){
shared_ptr<B> b = vec[i]; // create 1 copy of vec[i] - increments share cout
shared_ptr<C> c = b->c; // create 1 copy of b->c - increments share cout
sum1 += *(c->d1->e.begin()); // merely dereference pointer
sum2 += *(c->d2->e.begin()); // merely dereference pointer
}
你可以保存一些副本,因此一些缓存行丢失,如果你这样写:
for(int i = 0; i< vec.size(); i++){
// take reference only - no copy.
//const means I promise not to modify the pointer object.
const shared_ptr<B>& b = vec[i];
// take reference only - no copy.
//const means I promise not to modify the pointer object.
const shared_ptr<C>& c = b->c; // dereference b (which is really vec[i])
sum1 += *(c->d1->e.begin()); // merely dereference pointer
sum2 += *(c->d2->e.begin()); // merely dereference pointer
}
相关文章:
- 通过指向指针数组的指针访问子类的属性
- 使用指针访问数组中的对象数据成员
- 无法通过指针访问对象的成员
- decltype:使用指针访问类的静态成员
- 是否可以使用指针访问变量以避免直接编辑变量?
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 使用指针访问数组元素时出现意外结果
- 使用指针访问数组的值
- C++继承从基类指针访问派生类中的非虚拟函数
- 如何使用指针访问成对向量的元素
- 为什么有些库提供无指针访问,而另一些库则不提供
- 如何通过引用或指针访问二维矢量
- 使用指针访问参数接收的结构中的元素时内存泄漏
- 我正在学习C++,我不能使用指针访问参考吗?(举个例子)
- 复制堆栈上的成员值或使用指针访问它?
- C++娜娜 如何从全局列表框*指针访问列表框内的索引 0 上的按钮?
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 从指针访问 Kaguya Lua 状态
- 说明通过指针访问非静态类成员函数
- 有没有办法使用初始化到第一行的指针访问 2d 数组的第二行?