在堆栈上,编译器可以自由地进行很多优化,因为上下文是静态的并且在编译时是已知的,但是在处理对动态分配的对象的访问并且通常访问“通过引用”时,上下文是未知的,所以在逻辑上在这种情况下,成员访问归结为取消引用通过添加对象基地址和该成员的偏移量得出的内存地址。或者是吗?我对此很陌生,所以在这一点上,我只是在猜测,可能会遗漏很多细节。
例如,我注意到如果我在使用堆栈成员(并使用运算符)时实现+
运算符,则汇编代码与常规运算符创建的相同,因此似乎已知指向编译时已知值的指针are 正在被优化以排除额外的取消引用(和复制),并且函数内部的间接被内联为对堆栈对象的直接访问。这是否意味着编译器“足够好”能够优化通过从堆栈上的对象基地址的常量值偏移间接实现的访问器,就好像使用结构成员访问来获取该值一样?void add(int * a, int * b, int * r);
&
+
add()