考虑以下关于成员嵌套访问的代码:
struct A
{
size_t m_A;
};
struct B
{
A m_A_of_B;
};
class D
{
B instance_B;
A instance_A;
size_t m_D;
public:
size_t direct (void) { return m_D; }
size_t ind1 (void) { return instance_A.m_A; }
size_t ind2 (void) { return instance_B.m_A_of_B.m_A; }
};
我可以在这里想象两种不同的情况:
1.没有区别
据我了解,应该没有区别,因为所有函数都返回一个值,该值相对于this
类内存布局中的 / 具有编译时常量位置。
我希望编译器能够识别它。
因此,我假设从我上面展示的(甚至更深的)这样的嵌套结构中返回成员不会受到任何惩罚。
2.指针间接
可能整个“间接”都在这里进行。例如在 ind2 中:
获取这个 -> 获取 instance_B 的相对位置 -> 获取 m_A_of_B 的相对位置 -> 返回 m_A
问题
- 如何处理这种嵌套访问是否依赖于编译器?
- 这三个功能有区别吗?
我问这个是因为我只根据我对事情如何运作的了解对这个问题有一个假设。因为我的一些假设在过去被证明是错误的,所以我想在这里确定一下。
如果已经有人问过这个问题,请原谅我,如果可能的话,请指出适当的答案。
PS:您不需要对“过早的优化是万恶之源”或关于分析的任何提示。我可以使用我正在开发的编译器来分析这个问题,但我所针对的程序可以使用任何符合要求的编译器进行编译。因此,即使我无法确定任何差异,它们仍可能存在。