gpt4 book ai didi

c++ - 通过对象指针访问成员

转载 作者:行者123 更新时间:2023-11-30 17:37:38 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

*r = *a + *b ; 

或者

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

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

原型(prototype)(int &、int &、int &)和主体

r = a + b;

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

关于c++ - 通过对象指针访问成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22334118/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com