在堆栈上,编译器可以自由地进行大量优化,因为上下文是静态的并且在编译时是已知的,但是当处理对动态分配的对象的访问并且通常通过引用"上下文是未知的,所以在这种情况下逻辑上,成员访问归结为解引用通过添加对象基地址和该成员的偏移量导出的内存地址。 或者是吗?我对此很新,所以在这一点上我只是猜测并且可能遗漏了很多细节。
例如,我注意到,如果我在使用堆栈成员(并使用+
运算符)时将void add(int * a, int * b, int * r);
运算符实现为&
,则汇编代码与常规{ {1}}运算符创建,因此看起来已知指向编译时已知值的指针正在被优化以排除额外的解除引用(和复制),并且+
函数内的间接内联作为直接内联访问堆栈对象。 这是否意味着编译器足够好"能够优化来自堆栈中对象基地址的常量值偏移的间接实现的访问器,就好像使用struct member访问来获取该值一样?
答案 0 :(得分:0)
我不知道你是如何实现函数的主体所以这个答案可能完全关闭:)。
如果你在函数内添加r = a + b,代码看起来会一样但不会相同。
对于原型(int *,int *,int *),你将添加错误的指针。 要获取函数内的整数值,正文应为:
*r = *a + *b ;
OR
r[0] = a[0] + b[0];
以获得您想要的价值。 该主体不应具有与+运算符相同的汇编代码,因为指向的值在编译时不是已知的。
原型(int&,int&,int&)和正文
r = a + b;
编译器将内联此函数,所以是的,程序集应该是缩进的。