[英]Where is local variable of member function created if object is created via new?
[英]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();
,假设dc
为NULL
。 但是,如果编译并运行此程序,通常不会例外。
在以此为基础的汇编代码中,所有对象方法(例如dc->getDoubleAddr()
都将转换为标准函数,并且第一个参数是调用对象的地址(在本例中为dc
)。 因此,调用该函数不会导致空指针异常。 参数仅为0x0。
然后,在代码中,getDoubleAddr返回给定对象地址的对象内部double的地址。 此处无需访问内存-程序已经知道对象类型,因此也知道double_
的位置。 它仅返回对象的地址,加上其与char space[8]
八字节偏移量,程序将输出0x8。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.