HarmonyOS技术特点鸿蒙操作系统(HarmonyOS)是华为公司开发的一款面向全场景的分布式操作系统。架构特点: 分布式架构:这是鸿蒙系统的显著特点之一。它支持跨设备无缝协同体验,使不同设备能够快速连接、能力互助和资源共享。通过公共通信平台、分布式数据管理、分布式能力调度和虚拟外设等功能,开发者可以更轻松地开发跨终端分布式应用,为用户带来无缝的使用体验,比如手机与平板协同办公、手机与智能电视
C++11、C++14、C++17、C++20和C++23是C++语言标准的不同版本,它们之间在功能、特性和语法上存在一些区别。以下是对这些版本主要区别的概述:C++11C++11是C++语言的一个重要标准,引入了大量新特性和改进,使C++变得更加易用和强大。主要特性包括:自动类型推导(auto):可以根据初始化表达式自动推导变量的类型。统一的初始化语法:可以使用花括号{}来初始化对象,无论是基本
智能指针的必要性C++ 引入智能指针主要是为了解决手动管理动态分配内存时可能出现的几个问题,特别是内存泄漏、野指针和异常安全等问题。智能指针通过封装原始指针的操作,提供自动化的内存管理机制,以减少这些问题的发生。具体来说,智能指针的几个主要优点和引入的原因包括:自动内存管理:智能指针在其析构函数中自动释放所管理的内存。这意味着,一旦智能指针对象超出了作用域或被删除,它所指向的内存就会自动被释放,从
我们在做Android平台GB28181设备接入模块的时候,上层需要拿到设备的IP地址,废话不多说,分享一段获取设备IP地址的代码:package com.daniulive.smartpublisher; import android.content.Context; import android.net.wifi.WifiInfo; import android.net.wifi.WifiM
TCP粘包是指发送方在发送数据时,由于网络传输的特性,多个数据包可能会被接收方一次性接收到,从而导致粘在一起的现象。TCP粘包常见的原因包括:1. 发送方发送的数据小于TCP缓冲区的大小,导致多个小的数据包被合并成一个大的数据包发送。2. 发送方快速连续发送多个数据包,接收方在一次接收中接收到了多个数据包。为了避免TCP粘包,可以采取以下几种方法:1. 消息边界:在发送的数据中增加消息边界,如在数
shared_ptr是C++中的智能指针,它提供了共享所有权的能力。以下是shared_ptr的原理和特点:先说原理:1. shared_ptr使用引用计数的方式来管理对象的生命周期。2. 每个shared_ptr都有一个关联的引用计数,用于统计有多少个指针共享同一个对象。3. 当一个新的shared_ptr指向一个对象时,引用计数加1。4. 当一个shared_ptr被销毁或指向另一个对象时,引
什么是自旋锁?C++自旋锁是一种低层次的同步原语,用于保护共享资源的访问。自旋锁是一种轻量级的锁,适用于短时间的资源锁定。自旋锁的特点:当一个线程尝试获取已经被另一个线程占有的自旋锁时,这个线程会进入一个循环(自旋),在这个循环中它不断地检查锁是否已经被释放。如果锁已经被释放,那么该线程就可以获取到锁并执行。如果锁仍然被占用,该线程就会一直处于自旋状态,直到获取到锁。自旋锁的一个重要特点是它不会导
C++20是C++语言的新标准,是继C++17之后的C++编程语言的ISO/IEC标准修订版的名称。2020年2月,该标准在布拉格的会议上由WG21进行了技术定稿。同年9月4日草案获得批准后,C++20目前正处于最终批准过程中。相比 C++17,C++20引入了新的语言概念、模块、操作符“<=>”、协程、指定初始化、新标准属性等。C++20库标准还加入了范围、特性测试宏和位操作等。C+
AtomicLong探究AtomicLong 是 Java 提供的一个原子长整型类,提供了对长整型数据的原子性操作。在多线程环境下,AtomicLong 可以确保对长整型数据的操作是线程安全的。在 Android 中,AtomicLong 的使用方法和功能与标准 Java 中的 AtomicLong 相同。你可以通过以下方式创建一个 At
什么是备忘录模式?备忘录模式 (Memento Pattern)又叫快照模式(Snapshot Pattern),备忘录模式,是在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。备忘录模式提供了一种状态恢复机制,允许对象回到之前的状态。实现了对发起人状态的备份和恢复,而不会破坏封装性。C++代码示例#include <iost
好多新学设计模式的同学,对责任链模式一知半解,今天以C++为例,做个简单的分享。责任链模式指使多个对象多有机会处理请求,避免请求发送者和接受者的耦合关系。将这些接受处理的对象连成一条链,并沿着该链处理请求,收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。可以通过以下方式实现责任链模式:创建一个抽象的处理者类或接口,包含一个处理请求的方法;创建多个具体的处理者类,它们将实
什么是观察者模式?观察者模式是一种一对多的以来关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。它的主体是通知的发布者,发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知,将观察者和被观察的对象分离开。废话不多说,上代码:#include <iostream> #include <vector> using n
闲暇之时,聊到C++14,实际上C++14相对之前的11并没有太大的改动,或者说更像C++11标准基础上的查漏补缺,C++14之后,还有17、20甚至23,所以说,C++14更像个过渡版本。下面粗略聊聊C++14新特性:语言特性:初始化列表(Initializer lists):允许在构造函数中使用初始化列表来初始化成员变量。constexpr(常量表达式):允许在编译时计算常量表达式的值,提高代
学Java还是C++?Java和C++都是非常受欢迎的编程语言,各有各的优势和适用场景。以下是对它们的简要比较:性能:C++通常被认为是一种更高效的编程语言,适用于对性能要求较高的应用程序,如游戏开发、嵌入式系统和高频交易等。C++具有更接近底层的控制能力,允许开发人员直接管理内存和硬件资源,以实现更高的性能。跨平台性:Java是一种具有强大跨平台能力的编程语言,其“一次编写,到处运行”的特性使其
在 Android 中,AtomicBoolean 是一个原子布尔类,用于在多线程环境中安全地进行布尔类型的操作。它提供了一些原子性的操作方法,如 set()、get()、compareAndSet() 等。AtomicBoolean 的主要特点如下:原子性操作:AtomicBoolean 提供了一些原子性的操作方法,这些方法可以在多线程环境中保证
设计模式是一种通用的解决问题的经验,可以帮助我们设计出可重用、可维护和可扩展的软件。在设计模式中,有八个常见的原则,它们是:单一职责原则(SRP,Single Responsibility Principle):一个类应该只有一个引起变化的原因,即一个类只应该有一个职责,并且这个职责应该完全定义在这个类中。开闭原则(OCP,Open-Closed Principle):软件实体应该对扩展开放,对修
观察者模式是一种设计模式,定义了对象之间的一对多关系。当一个对象状态发生改变时,它的依赖者都会收到通知并自动更新。在C++11中,可以通过以下方式实现观察者模式:首先,我们需要创建一个观察者接口,其中包含一个更新方法。这个接口可以被多个观察者类实现,从而实现多态。#include <iostream> #include <functional> #include &
好多新人函数指针、指针函数迟迟分不清。实际上,函数指针和指针函数有以下区别:本质:函数指针是指向函数的指针变量,其本质是一个指针,更通俗的说,如果程序中定义了一个函数,编译时系统会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址,函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针;而指针函数则是一个函数,其本质不
多态(Polymorphism)是指面向对象程序运行时,相同的消息可能会送给多个不同的类之对象,系统依据对象所属类,引发对应类的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。在C语言中,可以通过结构体和指针来实现多态。以下是通过结构体和指针实现多态的简单示例代码:#include <stdio.h> // 定义基类 struct S
既然这样,是不是C++默认的析构函数设计成虚函数更合适?答案是否定的,大
今天讨论个比较有意思的话题:析构函数是不是必须要为虚函数?先说答案:析构函数可以是虚函数,也可以不是虚函数。再说原因:析构函数为虚函数的情况:继承当父类指针释放子类对象时,如果父类的析构函数不是虚函数,子类的析构函数可能调不到(指针类型是父类,所以直接调用父类的析构函数),从而导致内存泄漏,这类代码实在太简单,这里就不再贴实例代码了。既然这样,是不是C++默认的析构函数设计成虚函数更合适?答案是否
C++11/14/17中提供的mutex系列类型如下:互斥量C++版本作用mutexC++11基本的互斥量timed_mutexC++11timed_mutex带超时功能。在规定的等待时间内,没有获取锁,线程不会一直阻塞,代码会继续执行recursive_mutexC++11 递归锁,允许在同一个线程中同一个互斥量多次被 lock() ,用于可能被连续多次上锁(期间未解锁)的情况,效率要比mute
由于std::map中,元素的key是唯一的,我们经常遇到这样的场景,向map中插入元素时,先检测map指定的key是否存在,不存在时才做插入操作,如果存在,直接取出来使用,或者key不存在时,做插入操作,存在时做更新操作。通用的做法,可以直接用emplace操作,判断指定的key是否存在,如果不存在,则插入元素,当元素存在的时候,emplace依然会构造一次带待插入元素,判断不需要插入后,将该元
背景谈起C++,它被公认为最难学的编程语言之一,不仅语法知识点广泛,细节内容之多,学习难度和学习周期也长,导致好多新入行的开发者对C++“敬而远之”,甚至“从入门到放弃”。自C++11开始,好多C++程序员慢慢的感受到了C++的魅力所在,似乎难度也越来越小。本文要讲的是C++11引入的智能指针之std::unique_ptr。std::unique_ptr系C++11引入的智能指针,拥有资源的
最近好多朋友私信我,C++好不好学?学C++好还是Java好?我的回答是:C++不好学,但你觉得C++不好学的话,Java也不好学。因为C++难是难在语言本身,java难是难在各种框架和库。C++学习进阶比较陡, 对新手不友好,新手写起来代码,心智负担很重,短期内很难出活。就像网上段子说的一样,C++前几个月学习下来,看完C++ primer类似的入门书,觉得也不过如此,3-4年的时候,开始怀疑自
std:call_once是C++11引入的新特性,如需使用,只需要#include <mutex>即可,简单来说std:call_once的作用,确保函数或代码片段在多线程环境下,只需要执行一次,常用的场景如Init()操作或一些系统参数的获取等。相对来说,std::call_once用法比较简单,配合std::once_flag即可实现,废话不多说,上代码:#include "st
C++左值和右值,初学者经常傻傻分不清,可参看“C++ Primer”书中的描述,简单来说:当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。还不明白的话,参见MSDN关于“Lvalues and Rvalues”的描述:Every C++ expression is either an lvalue or an rvalue. An
记住一句话就够了:指针三心二意,引用从一而终!指针是一个实体,而引用可理解为一个别名;”sizeof(指针)”得到的是指针本身的大小,”sizeof(引用)”返回所指向的变量(对象)的大小。引用一定不为空,创建的时候,必须初始化,相比指针,不用检查它所指对象是否为空。
C++中,我们一般可以以基类声明纯虚函数,然后让派生类继承并重写这个虚函数,用override表示显示覆盖基类方法,但一直没有提供一种方法来阻止派生类继承基类的虚函数。C++11标准引入了final说明符,很好的解决了上面的问题。final告诉编译器,该虚函数不能被派生类重写。废话不多说,上代码,试着指出来下面的代码有哪些问题?class Base{public: virtual void p
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号