Skia源码点滴

2024-01-24 01:08
文章标签 源码 点滴 skia

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

今天在看SkCanvas类的save()方法时看到两行code,有点不解,具体如下:

int SkCanvas::save() {this->willSave(kMatrixClip_SaveFlag);return this->internalSave(kMatrixClip_SaveFlag);
}

int SkCanvas::internalSave(SaveFlags flags) {int saveCount = this->getSaveCount(); // record this before the actual save<strong>    MCRec* newTop = (MCRec*)fMCStack.push_back();new (newTop) MCRec(fMCRec, flags);    // balanced in restore()</strong></strong>fMCRec = newTop;if (SkCanvas::kClip_SaveFlag & flags) {fClipStack.save();}return saveCount;
}

加粗的两行code中,第二行的new关键字用法有些不解,然后百度之,解释如下:

关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。

当然,如果我们创建的是简单类型的变量,那么第二步会被省略

假设有如下类A:

class A {    
int i; 
public:     A(int _i) :i(_i*_i) {}     
void Say()  { printf("i=%dn", i); 
} ; 
//调用new: 
A* pa = new A(3); 

那么上述动态创建一个对象的过程大致相当于以下三句话(只是大致上)

A* pa = (A*)malloc(sizeof(A)); 
pa->A::A(3); 
return pa; 
C++中一提到new,至少可能代表以下三种含义:new operator、operator new、placement new.

new operator就是我们平时所使用的new,其行为就是前面所说的三个步骤,我们不能更改它operator new是用来重载new操作符,示例如下:

class A { 
public:	  void* operator new(size_t size)	 {printf("operator new calledn");		  return ::operator new(size); //这里通过::operator new调用了原有的全局的new}
};

new的第三种形态——placement new是用来实现定位构造的,因此可以实现new operator三步操作中的第二步,也就是在

取得了一块可以容纳指定类型对象的内存后,在这块内存上构造一个对象

#include <new.h> 
void main() {char s[sizeof(A)];A* p = (A*)s;new(p) A(3); //p->A::A(3);p->Say();
}

对头文件<new>或<new.h>的引用是必须的,这样才可以使用placement new。这里
new(p) A(3);
这种奇怪的写法便是placement new了,它实现了在指定内存地址上用指定类型的构造函数来构造一个对象的功能,后面A(3)就是对构造函数的显式调用。这里不难发现,这块指定的地址既可以是栈,又可以是堆,placement对此不加区分。但是,除非特别必要,不要直接使用placement new ,这毕竟不是用来构造对象的正式写法,只不过是new operator的一个步骤而已。使用new operator地编译器会自动生成对placement new的调用的代码,因此也会相应的生成使用delete时调用析构函数的代码。如果是像上面那样在栈上使用了placement new,则必须手工调用析构函数,这也是显式调用析构函数的唯一情况: p->~A();

百度完毕。

<strong>    MCRec* newTop = (MCRec*)fMCStack.push_back();new (newTop) MCRec(fMCRec, flags);    // balanced in restore()</strong>

SkCanvas类的save()方法在new一个新的栈帧时提前在堆中分配好了内存,然后在这个分配好的内存中构造了栈帧。

这篇关于Skia源码点滴的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、