繁体   English   中英

通过函数调用预取对象的成员变量

[英]Prefetching a member variable of an object, accessed via function call

今天提出了这个问题( 预取双精度类成员需要转换为char *? ),并且可接受的解决方案是预取成员函数的返回值,该成员函数通过引用返回成员变量。

但是,这使我感到好奇-如果成员距离对象的起始位置小于缓存行偏移量,那么调用对象的成员函数的行为就不会隐式地将对象加载到缓存中,从而消除了需要预备会员? 在不调用成员函数的情况下预取对象是否会更有效(如我的回答所建议)?

调用对象的成员函数的行为不是将对象隐式加载到缓存中,从而避免了预先缓存成员的需要吗?

不完全的。 例如,看这段代码。

#include <iostream>
using namespace std;

class DoubleContainer {
public:
    char space[8];
    double double_;
    double* getDoubleAddr();
};

double* DoubleContainer::getDoubleAddr()
{
    return &double_;
}

int main()
{
   DoubleContainer *dc = NULL;
   double* dp = dc->getDoubleAddr();
   cout << dp << endl;
   return 0;
}

似乎在double* dp = dc->getDoubleAddr();行上应该存在空指针错误double* dp = dc->getDoubleAddr(); ,假设dcNULL 但是,如果编译并运行此程序,通常不会例外。

在以此为基础的汇编代码中,所有对象方法(例如dc->getDoubleAddr()都将转换为标准函数,并且第一个参数是调用对象的地址(在本例中为dc )。 因此,调用该函数不会导致空指针异常。 参数仅为0x0。

然后,在代码中,getDoubleAddr返回给定对象地址的对象内部double的地址。 此处无需访问内存-程序已经知道对象类型,因此也知道double_的位置。 它仅返回对象的地址,加上其与char space[8]八字节偏移量,程序将输出0x8。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM