首页 > 编程语言 >C++对象模型:g++的实现(三)

C++对象模型:g++的实现(三)

时间:2022-10-27 22:14:09浏览次数:48  
标签:变量 ++ 模型 C++ int Test 成员 指针

这篇讲一下《深度探索C++对象模型》第三章最后没总结的一部分,就是类的成员变量指针。
这里所谓类的成员变量指针就是指绑定某个类的某个成员变量的指针,而不是某个对象的某个成员变量的指针,下面展现了两者的不同:

// test14.cpp
#include <cstdio>

struct Test {
    char c;
    short s;
    int i;
};

int main() {
    Test t = {.c = 1, .s = 2, .i = 3};
    int* pi = &t.i; // 这个指向对象的成员变量的指针,类型为int*
    int Test::* pmi = &Test::i; // 这是指向类的成员变量的指针,类型为int Test::*

    // 类的成员变量指针的使用:
    t.*pmi = 4;         // 通过对象使用
    printf("t.i = %d\n", t.i);

    Test* pt = &t;
    pt->*pmi = 5;       // 通过指针调用
    printf("t.i = %d\n", t.i);
}

类的成员变量的指针表征的是该成员变量在类内的偏移量。
那如何判断一个指向类的成员变量的指针是无效还是有效?通常指针值为0是无效地址,但偏移为0是有效的呀。
在《深度探索C++对象模型》一书中谈到,为了实现上面的功能,向类的成员变量的指针通常会在其偏移量上加1,在使用时再把1减去。即有效的指向类的成员变量的指针是大于0的,这样0值就是无效的了。
那g++是怎么样实现的呢?

// test15.cpp
#include <cstdio>

struct Test {
    char c;
    short s;
    int i;
};

int main() {
    Test t = {.c = 1, .s = 2, .i = 3};
    int Test::* pi_valid = &Test::i;
    int Test::* pi_invalid = nullptr;
}

使用gdb调试如下:
img
可见,g++的实现就是直接把无效的指针设置为-1,而不修改偏移量。
好了,除了存取效率之外,到此为止第三章内容基本就说完了,至于效率我就不测试了。

标签:变量,++,模型,C++,int,Test,成员,指针
From: https://www.cnblogs.com/lycpp/p/16834180.html

相关文章

  • Modern C++ 智能指针 shared_ptr
    现代C++为了解决内存泄露以及资源回收等问题,引入了智能指针的概念。在日常的C++实践中也是高频使用。本文是在实践过程中,对现代C++中的智能指针进行的一个稍微全面的总结......
  • Python,C++中点云 .las转.pcd
    (39条消息)Python,C++中点云.las转.pcd_程序媛一枚~的博客-CSDN博客1.Python.las转.pcd#-*-coding:utf-8-*-#读取las文件并保留为XYZI格式的pcd文件import......
  • 如何在CMake中启用C++ 17
    如何在CMake中启用C++17MiP*_*MiP  38 c++ cmake visual-studio c++17 我正在使用VS15.3,它支持集成的CMake3.8.如何在不为每个特定编译器编写标志的情况下定......
  • UE4 C++实现第三人称角色基本功能
    首先基于Character创建一个角色类,在头文件为其添加弹簧臂和摄像机组件UPROPERTY(VisibleAnywhere,Category="Comp")classUCameraComponent*CameraComp......
  • 【 C++ 】如何查看项目中使用的c++版本
    【C++】如何查看项目中使用的c++版本Francesca_upper于2022-07-0610:15:58发布1847收藏2分类专栏:C++文章标签:c++开发语言版权C++专栏收录该内容1篇文章0......
  • Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集|附代码数据
    全文链接:tecdat.cn/?p=24376在这篇文章中,我们讨论了基于gensim包来可视化主题模型(LDA)的输出和结果的技术(点击文末“阅读原文”获取完整代码数据********)。介绍......
  • 马尔可夫Markov区制转移模型分析基金利率|附代码数据
    全文下载链接:tecdat.cn/?p=19611过程会随着时间的推移而发展,结果会发生变化 ( 点击文末“阅读原文”获取完整代码数据******** ) 。考虑一下经济衰退和扩张。在衰退开......
  • C++对象模型:g++实现(二)
    上一篇博客《C++对象模型:g++实现(一)》用我的理解总结了在无继承体系下g++实现的C++对象的内存布局,这篇就来总结一下在有继承情况下的C++对象的内存布局。有继承情况下的C++......
  • *PAT_甲级_1053 Path of Equal Weight (30分) (C++)【数组排序/DFS】
    目录​​1,题目描述​​​​ 题目大意​​​​输入​​​​输出​​​​2,思路​​​​数据结构 ​​​​如何排序 ​​​​如何设计DFS算法​​​​3,心路历程​​​​4,代......
  • C++ Const Pointer
    Compaction*constcompaction;//即该指针声明后不能再指向其他地址这样记:const后边的内容为“常量”。constintptr;//ptr为常量,初始化后不可更改int*constpt......