Gobject tutorial 一

2024-06-14 19:44
文章标签 tutorial gobject

本文主要是介绍Gobject tutorial 一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  参考: https://github.com/ToshioCP/Gobject-tutorial/tree/main?tab=readme-ov-file

Gobject class and instance

Gobject 实例是通过函数g_object_new创建的。Gobject不仅包含实例还包含类。

  • Gobject的类是在第一次调用g_object_new函数时被创建的。并且对于一个特定的对象,类只有一个。
  • Gobject的实例是每次调用g_object_new时,都会被创建。因此,实例是可以同时存在多个的。

从广义上来说,GObject是一个包含类和实例的对象。从狭义上来说,GObject仅仅是一个C结构体的定义。

typedef struct _GObject  GObject;
struct  _GObject
{GTypeInstance  g_type_instance;/*< private >*/guint          ref_count;  /* (atomic) */GData         *qdata;
};

 g_object_new函数分配一个sizeof(GObject)大小的内存,并进行初始化,函数返回值是指向此分配内存的指针。此分配的内存就是一个GObject实例,也就是说一个GObject实例就是一块内存。同理,GObject 类也是一块由g_object_new分配的内存。

#include <glib-object.h>int
main (int argc, char **argv) {GObject *instance1, *instance2;GObjectClass *class1, *class2;instance1 = g_object_new (G_TYPE_OBJECT, NULL);instance2 = g_object_new (G_TYPE_OBJECT, NULL);g_print ("The address of instance1 is %p\n", instance1);g_print ("The address of instance2 is %p\n", instance2);class1 = G_OBJECT_GET_CLASS (instance1);class2 = G_OBJECT_GET_CLASS (instance2);g_print ("The address of the class of instance1 is %p\n", class1);g_print ("The address of the class of instance2 is %p\n", class2);g_object_unref (instance1);g_object_unref (instance2);return 0;
}

上述程序运行结果如下:

The address of instance1 is 0x55b28a0d2a00
The address of instance2 is 0x55b28a0d2a20
The address of the class of instance1 is 0x55b28a0d2830
The address of the class of instance2 is 0x55b28a0d2830

即:instanace1 和instance2所指代的内存位置不同,因此是两个不同的instance,但是二者所属的类的地址是一致的。因此证明,对于所有的GObject类型的实例,其类只有一个。

在上例中,G_TYPE_OBJECT就是Gobject的类型,在glib 源码中你会发现g_object_new的声明如下:

gpointer    g_object_new                      (GType           object_type,const gchar    *first_property_name,...);

在Gobject中存在一个类型系统,类型系统属于Gobject的一个基础系统。每个数据类型都必须在类型系统中进行注册。

Reference Count

由于一个Gobject实例占据一段内存,当实例不再使用时,需要释放此段内存,那么,问题来了,怎么确认一个实例在用还是没有用了? reference count就是来解决这个问题的。

如果一个创建出来的Gobjet实例同时被A和B使用,此时,reference count 的值就是2.当A或B使用同一个Gobject实例时,都会调用g_object_ref,使对象的reference count增加1,不使用时,都会调用g_object_unref,使对象的reference count减1.当Gobject实例的reference count值为0时,表示此实例不再使用,实例就会自动销毁。调用g_object_new生成Gobject 实例时, 此实例的reference count 值为1。

这篇关于Gobject tutorial 一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061348

相关文章

A Tutorial on Near-Field XL-MIMO Communications Towards 6G【论文阅读笔记】

此系列是本人阅读论文过程中的简单笔记,比较随意且具有严重的偏向性(偏向自己研究方向和感兴趣的),随缘分享,共同进步~ 论文主要内容: 建立XL-MIMO模型,考虑NUSW信道和非平稳性; 基于近场信道模型,分析性能(SNR scaling laws,波束聚焦、速率、DoF) XL-MIMO设计问题:信道估计、波束码本、波束训练、DAM XL-MIMO信道特性变化: UPW ➡ NU

beanstalkc Tutorial 中文版

英文原版:https://github.com/earl/beanstalkc/blob/wip-doc-rtfd/doc/tutorial.rst 背景介绍: Beanstalk,一个高性能、轻量级的分布式内存队列系统。而beanstalkc是Beanstalk的一个python客户端库。看题主写的通俗易懂,就直接翻译过来。 开始: 启动服务端beanstalkd进程来监听14711端口,可以

OpenGuass under Ubuntu_22.04 install tutorial

今天开始短学期课程:数据库课程设计。今天9点左右在SL1108开课,听陈老师讲授了本次短学期课程的要求以及任务安排,随后讲解了国产数据库的三层架构的逻辑。配置了大半天才弄好,放一张成功的图片,下面开始记录成功的步骤: My operator system is Ubuntu_22.04. procedures sudo wget https://opengauss.obs.cn-so

Tutorial : Getting Started with Kubernetes on your Windows Laptop with Minikube

https://rominirani.com/tutorial-getting-started-with-kubernetes-on-your-windows-laptop-with-minikube-3269b54a226#.d9lmuvzf2 本文的注意事项: 1, 截止到2017.01.20, window上的kubernetes依然是实验性的, 存在各种不可预知的bug

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(仿射变换)

本系列学习笔记参考自OpenCV2.4.10之opencv\sources\samples\cpp\tutorial_code和http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html 本博文将继续学习opencv-tutorial-code中的ImgTrans,这里讲主要介绍仿射变换。仿射变换是直角坐标系的一种,描述的是一

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(图片边框与图片卷积)

本系列学习笔记参考自OpenCV2.4.10之 opencv\sources\samples\cpp\tutorial_code和 http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html 本博文将继续介绍如何给一张图片添加边框以及如何对一张图片进行卷积。核心函数为copyMakeBorder与filter2D 1.co

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)

本系列学习笔记参考自OpenCV2.4.10之 opencv\sources\samples\cpp\tutorial_code和 http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html 本博文接下来将介绍图像变换相关的Demo,如下图所示: CannyDetector_Demo.cpp(Canny边缘检测)

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgProc(图像处理)

本系列学习笔记参考自OpenCV2.4.10之 opencv\sources\samples\cpp\tutorial_code和 http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html       本博文将继续学习 OpenCV2.4.10中tutorial-code下的ImgProc,还有对于涉及到的知

OpenCV2.4.10之samples_cpp_tutorial-code_learn------安装配置与第一个Opencv程序

本系列学习笔记参考自OpenCV2.4.10之 opencv\sources\samples\cpp\tutorial_code和 http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html opencv作为一个开源的二维图形库,提供了一套完整的二维图像处理等相关算法的C/C++实现。自opencv2.0版

【kaldi】Kaldi tutorial翻译之Prerequisites(前提条件)-kaldi学习前必备梳理

本翻译仅供自己学习使用,不承担任何其他责任。水平有限拒绝转载。欢迎大家指出错误,共同学习。 我们假设本页的读者了解使用HMM-GMM进行语音识别的基础知识。在这里我们需要在线简明介绍的是:M. Gales and S. Young (2007).``The Application of Hidden Markov Models in Speech Recognition."