通过指向对象的指针访问成员
Member access through pointer to object
在堆栈上,编译器可以自由地做很多优化,因为上下文是静态的,在编译时是已知的,但是当处理对动态分配的对象的访问时,通常"通过引用"访问上下文是未知的,因此在这种情况下,从逻辑上讲,成员访问归结为对通过添加对象基地址和该成员的偏移量派生的内存地址进行解引用。是吗?我是新手,所以在这一点上我只是猜测,可能遗漏了很多细节。
例如,我注意到,如果我在使用堆栈成员(并使用&
操作符)时将+
操作符实现为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;
编译器将内联这个函数,所以是的,程序集应该是相同的。
相关文章:
- 通过指向指针数组的指针访问子类的属性
- 使用指针访问数组中的对象数据成员
- 无法通过指针访问对象的成员
- decltype:使用指针访问类的静态成员
- 是否可以使用指针访问变量以避免直接编辑变量?
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 使用指针访问数组元素时出现意外结果
- 使用指针访问数组的值
- C++继承从基类指针访问派生类中的非虚拟函数
- 如何使用指针访问成对向量的元素
- 为什么有些库提供无指针访问,而另一些库则不提供
- 如何通过引用或指针访问二维矢量
- 使用指针访问参数接收的结构中的元素时内存泄漏
- 我正在学习C++,我不能使用指针访问参考吗?(举个例子)
- 复制堆栈上的成员值或使用指针访问它?
- C++娜娜 如何从全局列表框*指针访问列表框内的索引 0 上的按钮?
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 从指针访问 Kaguya Lua 状态
- 说明通过指针访问非静态类成员函数
- 有没有办法使用初始化到第一行的指针访问 2d 数组的第二行?