0

在堆栈上,编译器可以自由地进行很多优化,因为上下文是静态的并且在编译时是已知的,但是在处理对动态分配的对象的访问并且通常访问“通过引用”时,上下文是未知的,所以在逻辑上在这种情况下,成员访问归结为取消引用通过添加对象基地址和该成员的偏移量得出的内存地址。或者是吗?我对此很陌生,所以在这一点上,我只是在猜测,可能会遗漏很多细节。

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

4

1 回答 1

0

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

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

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

*r = *a + *b ; 

或者

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

为了得到你想要的价值。该主体不应具有与 + 运算符相同的汇编代码,因为指向的值在编译时是未知的。

对于原型 (int &, int &, int &) 和主体

r = a + b;

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

于 2014-03-11T22:35:23.120 回答