通过指向对象的指针访问成员

Member access through pointer to object

本文关键字:指针 访问 成员 对象      更新时间:2023-10-16

在堆栈上,编译器可以自由地做很多优化,因为上下文是静态的,在编译时是已知的,但是当处理对动态分配的对象的访问时,通常"通过引用"访问上下文是未知的,因此在这种情况下,从逻辑上讲,成员访问归结为对通过添加对象基地址和该成员的偏移量派生的内存地址进行解引用。是吗?我是新手,所以在这一点上我只是猜测,可能遗漏了很多细节。

例如,我注意到,如果我在使用堆栈成员(并使用&操作符)时将+操作符实现为void add(int * a, int * b, int * r);,那么汇编代码与常规+操作符创建的代码相同,因此似乎已知指向编译时已知值的指针正在被优化以排除额外的解引用(和复制),并且add()函数内部的间接被内联为直接访问堆栈对象。这是否意味着编译器"足够好",能够优化从堆栈上的对象基址的常量值偏移间接实现的访问器,就像使用结构体成员访问来获得该值一样?

我不知道你是如何实现函数体的,所以这个答案可能完全关闭:)。

如果你在你的函数r = a + b中添加,代码看起来是一样的,但不会是相同的。

对于原型(int *, int *, int *),您将添加指针,这是错误的。要在函数中获取整数值,函数体应该是:

*r = *a + *b ; 

r[0] = a[0] + b[0];

,以获得您想要的值。该函数体不应该与+操作符具有相同的汇编代码,因为所指向的值在编译时不是已知的。

表示原型(int &, int &, int &)和body

r = a + b;

编译器将内联这个函数,所以是的,程序集应该是相同的。