- 博客(99)
- 收藏
- 关注
原创 为什么C++只能通过指针或引用来使用(动态)多态?
摘要:C++中只有通过指针或引用才能实现运行时多态,主要原因包括:1) 虚函数表机制需要间接寻址;2) 值传递会导致对象切片,丢失派生类信息;3) 指针/引用能区分静态和动态类型。直接访问对象会引发静态绑定,而指针/引用通过vptr实现动态绑定。这种设计体现了C++对性能与灵活性的权衡,要求开发者显式选择多态行为。(149字)
2025-06-03 11:29:21
113
原创 C++可变参数宏定义语法笔记
本文介绍了C/C++中可变参数宏的使用方法。首先,基础语法通过__VA_ARGS__展开可变参数,并展示了如何定义和使用宏。其次,针对空可变参数可能导致语法错误的问题,提出了使用##__VA_ARGS__来优化,避免尾随逗号。接着,介绍了C++20引入的__VA_OPT__,用于更灵活地控制可变参数的展开。文章还提供了多个示例,如调试日志、泛型包装和条件编译,展示了可变参数宏的实际应用。最后,总结了使用时的注意事项,包括参数中的逗号处理、兼容性问题以及避免副作用。通过这些内容,读者可以更好地理解和应用可变参
2025-05-23 16:22:38
473
原创 关于创建UNIX/Linux daemon进程的笔记
(1) 上述几个步骤的目的是让进程脱离原session和terminal终端。(2) 第一个fork是为调用setsid做准备,创建新session,脱离原session。副作用:成为session和进程组长。(3)第二次fork是为了消除第二部副作用,不再是组长,不能获得terminal终端。
2025-04-22 11:37:28
512
原创 bash中如何区分系统命令和自定义函数
type 显示命令的类型(系统命令、函数、别名等) 通用检查。declare -F 检查函数是否已定义 判断函数是否存在。declare -f 列出或显示函数的定义 检查函数定义。command -v 显示命令的路径或名称 简洁检查。compgen 列出所有命令、别名、函数等 批量检查。系统命令:输出命令的路径(例如 /bin/ls)。通过以上方法,可以轻松区分系统命令和自定义函数。which 查找系统命令的路径 仅检查系统命令。函数:输出函数名(例如 myfunc)。方法 功能 适用场景。
2025-03-21 11:42:50
432
原创 Android/AOSP源码编译错误:TEMPORARY_DISABLE_PATH_RESTRICTIONS
分析操作流程,在同一个编译环境中,连续编译不同版本的Android源码(Android 11和Android 12),由于不同版本源码编译时设置不同的环境变量,并且不同版本源码对环境变量的检查条件不兼容导致的。,在Android12编译时,不兼容这个变量的设置,并且编译脚本不会取消这个变量,导致编译报错。具体到遇到的这个问题,在Android11上编译是,配置脚本设置。编译环境多次编译过源码,工具链等都是正确配置,不存在问题。取消次环境变量设置,再次编译源码,可正常编译。
2025-03-13 14:11:23
282
原创 Ubuntu上用adb连接Android提示无权限(no permissions (missing udev rules? user is in the plugdev group))
需要配置udev rule,在/etc/udev/rules.d/下创建对应的rule文件。重新插拔设备连接到PC上的USB线即可。
2025-03-11 13:39:59
342
原创 sudo免密码
Ubuntu上执行需要root权限的命令需要使用sudo命令,默认每次都需要输入密码进行授权。可以通过配置sudoer把用户添加到白名单中,执行sudo命令是不需要输入密码验证。
2025-03-10 10:42:47
162
原创 随机过程和马尔科夫过程
随机过程是一族随机变量 {X(t),t∈T}{X(t),t∈T},其中 TT 是参数集(通常是时间或空间),X(t)X(t) 是在每个时刻或位置 tt 的随机变量。例如,股票价格随时间的变化、天气温度的变化、电话呼叫的到达时间等都可以用随机过程来描述。随机过程 {Xn,n=0,1,2,… }{Xn,n=0,1,2,…状态空间:S={s1,s2,… }S={s1,s2,…}(可以是有限或无限的)。转移概率。
2025-02-24 14:28:13
765
原创 vs code配置Android native开发的include path
编辑settings.json(Ctrl + ,或者直接打开如下配置文件,在vs code的界面上只能逐项添加)为了方便修改,可以添加自动以变量,定义android源码的根目录,如果切换源码目录,只需要修改这个变量即可。修改属性:C_Cpp.default.includePath,追加include path。
2024-12-24 14:28:54
458
原创 记录一个Android编译中遇到的(有点)奇怪的问题vendor_available
这几个xml是对应工程中hal接口描述文件(学名叫兼容矩阵compatibility matrix,这里不展开),根据.bp文件中的配置vendor是否可用,选择是否在vendor目录下放置此文件。把上述几个.xml文件删除,重新make就可以正常编译通过。此时单独编译工程,使用mm或者mmm命令,可以正常编译。Android源码已经完整编译过。
2024-09-13 11:12:56
700
原创 DDS笔记: hello world解析
获取DomainParticipantFactory -> 创建participant -> 注册sub-pub type -> 创建topic(顺序可延后) -> 创建publisher / subscriber -> 创建writer / reader -> write / read / WaitSet.wait。创建subscriber时传入listener参数,通过listener回调事件和数据(on_subscription_matched, on_data_available)。
2024-08-18 14:47:03
362
原创 Android.bp编译报错
确认可用类型,查找编译目录,找到以下几种平台类型的静态库。前面几种arm类型的都能对应上,x86平台的只编译出来linux_glibc_x86_64_static版本,这个是和当前PC编译环境对应的,其他3中x86类型缺失是由于当前环境下不具备编译条件。这个例子中发现缺少:image:vendor.30。可以通过libc++fs库对应的.bp文件进行确认。同时,提示当前可用版本类型(available variants),每行是一个类型。把“期望类型”和“已有类型”对比差异,逐个字段比较,看缺少哪项。
2024-07-23 17:37:44
2093
原创 Android Hal service compatibility matrix
编译后文件保存的位置:(/etc —> /system/etc)2)在Android.bp中增加对应的编译选项。
2024-04-07 13:31:47
850
原创 Linux socket: udp server and client demo
(2)收到client请求后,在server fd上调用accept获得client fd,client sockaddr_in对象。1)创建socket,指定协议版本(v4,v6)、协议类型(udp、tcp),获得server fd。(3)bind和connect入参相同,server fd, addr, addr_length。server端,不指定具体的client地址,设置为INADDR_ANY。1)创建socket,指定协议版本和协议类型,获得server fd。4)接收client连接请求。
2024-01-04 15:01:55
953
原创 c++ asio: udp server and client demo
2)receive_from可以获取到client的endpoint,也可以用这个对象给client发送数据(send_to)2)创建一个udp::endpoint对象,指定协议版本(v4,v6)和端口号,初始化socket对象。执行收发动作,socket.receive_from和socket.send_to。1)需要创建一个io_context对象,初始化socket对象。1)收发都需要一个asio::buffer缓存。创建udp::socket,用于收发数据。一、server 端。
2024-01-04 14:45:06
1064
原创 Bash script进阶笔记
3)必须提供‘下标’,下标可用数字(此时和数组类似),可以是字符串(单引号、双引号都可以)2)需要使用declare -A声明,不能像数组那样可省略declare -a。declare是bash内置命令,可为变量设置属性(值类型、访问类型等)。1)最外面是小括号(),内部元素间用空格分隔,下标用中括号[]指定。-A: associative array Map类型。-a: indexed array 数组。-x: export,导出环境变量。Map类型(关联数组)
2023-12-14 14:29:30
667
原创 C++知识点梳理:C++ templates
这3种参数是不同维度的,尤其是类型参数和template template参数,容易混淆,在实例化时需要区分模板参数和普通类型参数,如果定义为模板参数则只能提供模板名(不能用具体类型实例化,如vector,不是vector< int >)6)匿名参数,在模板参数列表中定义匿名参数,这些参数在模板定义中没有用到,仅用于静态分发(通过类型选择不同的模板),或者为了应用SFINAE规则(阻止生成不符合某些规则的模板)。只需要类名和后面的类型说明,和定义时不同,此时需要提供具体的类型。
2023-11-17 12:43:16
562
原创 C++知识点梳理:移动语意、右值
a)传入lvalue调用,过程中分配内存2次:v->x复制一次(第一次分配内存),x move to data_由于data_内存不够大(data_默认构造的,除非v为空)需要在移动构造函数内再次分配内存(第二次分配内存)。本质上,就是这个局部变量是多余的,通过传值在函数参数初始化时创建一个临时变量(省略掉多余的局部变量),函数参数的变量名是必须有的,只是能够选择分配内存(传值、赋值)或不分配内存(传引用、右值)。如果是类成员变量,已经初始化了?b)返回值,NRVO优化,不会复制。
2023-11-13 16:40:32
177
原创 C++知识点梳理:包装类型/词汇类型 vocabulary types
2)std::get< index >(v) 通过索引检索当前保存的值,如果对应索引没有保存值,抛出异常:std::bad_variant_access。3)std::get< type >(v) 通过类型检索当前保存的值,如果对应类型没有保存值,抛出异常:std::bad_variant_access。std::get_if< index >(&v) 通过索引检索当前保存的值,如果对应索引没有保存值,返回nullptr。注意:传入指针,返回指针。注意:传入指针,返回指针。
2023-11-10 14:34:23
170
原创 Linux pipe()系统调用示例
一个pipe是单向数据传输的,不用用于父子进程双向读写。创建2个pipe实现父子进程间的双线读写。Linux系统调用pipe函数,创建一个pipe,通过传入的fd数组返回pipe的读、写两端。其中fd[ 0 ]用于读,fd[ 1 ]用于写。
2023-11-08 17:56:12
294
原创 Rust笔记【3】
Deref 强制转换可以将&String 转换为&str,因为String 实现了Deref trait 因此可以返回&str。Deref 强制转换(deref coercions)将实现了Deref trait 的类型的引用转换为另一种类型的引用。• 当T: DerefMut<Target=U> 时从&mut T 到&mut U。• 当T: Deref<Target=U> 时从&mut T 到&U。• 当T: Deref<Target=U> 时从&T 到&U。2)移动大量数据,避免赋值。
2023-11-07 15:43:01
116
原创 Rust笔记【2】
(3)如果定义中没有使用到lifetime参数,可使用匿名lifetime:'_ ,如下面的read()方法。(2)输出lifetime可自动推导的情况:唯一输入lifetime和方法&self的lifetime。语法示例,lifetime在函数、struct的语境中作为泛型参数使用,无法单独使用。(1)struct中有引用类型,就需要声明lifetime参数。(1)泛型参数列表中,lifetime在typename之前。适配器是惰性的,需要调用消费适配器的方法,才会实际执行。函数中的lifetime。
2023-11-01 09:23:22
385
原创 Rust笔记【1】
注意:作用域结束不是以大括号结束,是以变量最后一次使用结束变量作用域(是没有显式标志)。1)为所有情况单独处理每个分支,例如enum类型。Rust中match匹配必须是穷尽的。字符串slice类型声明:&str。2)使用通配模式,用到匹配的值。字符串字面值是slice。
2023-10-24 14:49:44
400
原创 DBus笔记
2)track life-cycle,application exit/crash notification,当app退出时,message bus通知其他应用对应的app name失去owner。1)[Bus Name],可选,如果没有使用dbus daemon就不需要bus name,相当于点对点通信。4)特例,不使用dbus daemon,需要明确server app和client app,以及它们的地址。1)方法调用,前3种消息,调用和返回双向,一对一。2)广播消息,第4中,单向,一对多。
2023-09-15 13:40:22
372
原创 vlan笔记
1)标签型VLAN:Tagging VLAN,IEEE 802.1Q协议(dot one Q),对数据帧附加识别信息。TPID的值固定为0x8100,它标示网络帧承载的802.1Q类型,交换机通过它来确定数据帧内附加了基于IEEE 802.1Q的VLAN信息。每个数据帧头部都会被附加26字节的“ISL包头(ISL Header)”,并且在帧尾带上通过对包括ISL包头在内的整个数据帧进行计算后得到的4字节CRC值。1)静态VLAN(基于端口的VLAN):将交换机的各端口固定指派给VLAN。
2023-09-04 13:56:29
548
原创 C++模板:用递归实现阶乘的几种方法
主要是演示C++模块的递归语法和实现机制,以阶乘为例。下面分别用类模板(factorial1)、函数模板(factorial3、factorial4)和变量模板(factorial2)分别实现。这里的模板递归都是在。
2023-08-21 10:08:51
1057
原创 C语言读写文件函数:read/write,pread/pwrite,readv/writev,preadv/pwritev,preadv2/pwritev2
read/write/pread/pwrite函数比较直观,这里仅示例readv/writev函数用法。把程序中定义的buf通过writev函数输出到屏幕上。
2023-08-18 11:11:15
843
原创 OBD针脚定义参考
2)其中一种4/5/7/8也是上下对应的;另一种4-5,12-13,7/8和15/16交叉连。OBD定义的一种标准的参考,不同的车场有不同的定义,貌似没有统一。1)1/2/3/6几个针脚都是一样的,分别上下针脚对应。
2023-08-08 16:28:50
4212
原创 AUTOSAR笔记2:AP主要模块
CM(Communication Management)组件提供独立于网络和协议的应用间通信服通信协议CM是独立于具体通信协议的通信管理框架,当前支持部署到不同协议,包括:数据分发服务协议(简称DDS)、车载以太网协议(简称SOME/IP)。DDS协议主要用于内部通信高性能场景;SOME/IP协议主要用于与外部部件对接的通信场景,如与Classic AUTOSAR对接,其中,SOME/IP支持采用两种序列化方式进行。
2023-08-07 10:27:25
1991
1
原创 Android native开发:system/core/libutils
文章目录1. AndroidThreads.h2. Atomic.h3. BitSet.h4. ByteOrder.h5. CallStack.h6. Compat.h7. Condition.h8. Debug.h9. Endian.h10. Errors.h11. FastStrcmp.h12. FileMap.h13. Flattenable.h14. Functor.h15. JenkinsHash.h16. KeyedVector.h17. LightRefBase.h18. List.h19.
2023-06-28 11:07:55
1051
原创 Android native开发:system/core/base
跨平台支持获取thread id,在Linux上调用gettid()或syscal(__NR_gettid)2)ScopedLockAssertion,为了Clang做线程安全分析的辅助类。还提供一些assertion宏。1)一些thread相关的__attribute__宏定义。临时保存errno,作用域结束后恢复。
2023-06-19 17:00:17
1225
原创 PC - Android - QNX 传输文件
开发中需要把一些文件从PC(Windows或者Linux)上传输到Android或者QNX上。下面这个脚本,可以在Linux上执行,把文件复制到QNX系统上,即 PC --> QNX。如果需要可以参照编写一个QNX–>PC传文件的脚本。
2023-06-15 17:45:45
1413
原创 不常用的 Linux/C 函数/系统接口整理
如果通过编译参数(-fno-builtin)关闭内置函数,此时为了编译通过的方法:#define strcpy(d, s) __builtin_strcpy ((d), (s))(1)没有C标准库对应方法的__builtin_函数,这类方法总是被inline展开,没有入口地址,只能用在函数中(不能用在表达式中,内联展开会导致编译错误)。(2)有对应C标准库方法的__builtin_函数,内置函数和C库函数有完全相同的原型、入口地址。strp指向的内容,需要用free()函数释放。
2023-06-12 17:58:47
777
数据结构知识梳理汇总文档
2023-01-09
全面的Android view相关知识汇总整理
2023-01-09
Android面试必备参考提纲(2022)
2023-01-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人