C++ 内存布局 - Part6: 虚继承 虚继承可以在菱形继承体系中,防止派生类中有多份重复祖基类内容。如下图所示,如果是常规继承,Class Final中会有两份Class Base的内容。通过虚继承,即Derived1 虚继承自Base, Derived2 也虚继承自Base, 那么Final中将最终保留一份Base部分的内容。
C++ 内存布局 - Part5: 继承关系中 构造析构与vptr的调整 当delete这个派生类对象时,首先执行派生类的析构函数,此时对象的vptr仍然执行派生类的虚表,派生类的析构函数会继续执行基类的析构函数,此时对象的vptr会指向基类的虚表。当new一个派生类对象时,首先会执行基类的构造函数,这时这个构造中的对象,其vptr指向基类的虚表,当基类部分构造完毕,继续执行派生类的构造函数时,此时对象的vptr指向派生类的虚表。从结果中可以看到, 在执行Base部分的构造和析构时,vptr指向的是基类的虚表,指向Derived部分的构造和析构时,vptr指向的是派生类的虚表。
C++ 内存布局 - Part4: 多继承与this指针调整 可见,Base2中被重写的Derived::fooC() 函数指针被放到了_vptr.Base1虚表之中,没有被重写的Base2::fooD() 依然存放在_vptr.Base2。可见,是将指向Base2部分的指针向上偏移16,指向Derived对象的内存起始地址,从而访问到Base1部分虚表里的Derived::fooC()将会对当前的this指针(b2ptr)向上偏移到Derived对象起始地址。
C++ 内存布局 - Part3: 隐式转换为基类指针 如果new一个派生类对象,把new之后的指针赋值给基类指针,那这个基类指针指向哪里,一定是这个派生类对象的起始地址吗?【答案】赋值给基类指针以后,这个基类指针会指向派生类对象中这个基类部分的起始地址,编译器自动进行了指针偏移操作。
C++ 内存布局 - Part2: 从内存布局角度看类型转换 static_cast, dynamic_cast, reinterpret_cast 开门见山,先把结论写在这里:1)static_cast 在做基类指针和派生类指针之间的转换时,会根据编译时的静态偏移操作指针,但是没有运行期的类型安全检查,程序员需要自己确保类型的正确性,比如派生类指针确实指向了派生类对象。2)dynamic_cast 依赖于虚表做运行期类型检查,适用于有虚函数的类型转换。3)reinterpret_cast是最不安全的类型转换,完全暴力强制转换。
C++ 内存布局 - Part1: typeid, typeinfo及单继承 typeinfo中存储的是关于类型的信息,可以通过以下代码都是在X86_64 Linux中完成,g++编译。可见,在没有虚函数的情况下,即使指针 ptr实际指向的是派生类对象,但是没有虚表的帮助,只能返回编译器静态类型,也就是基类类型。[有虚函数的类继承]
C11与C++11关于Atomic原子类型的异同 头文件C11 使用。C++11 使用。数据类型C11 使用atomic_int等_Atomic类型定义。C++11 使用模板类。初始化C11 推荐使用宏进行初始化,也可以直接赋值。C++11 通过构造函数直接初始化。操作函数C11 使用标准库函数,如。C++11 使用类成员函数,如storeload。编译参数C11 需要使用-std=c11。C++11 需要使用-std=c++11。
GNU C 宏构造利器:语句表达式 GNU C 对 C 标准作了扩展,允许在一个表达式里内嵌语句,允许在表达式内部使用局部变量、for 循环和 goto 跳转语句。这样的表达式,我们称之为语句表达式。({ 表达式1;表达式2;表达式3;})语句表达式最外面使用小括号()括起来,里面一对大括号{}包起来的是代码块,代码块里允许内嵌各种语句。语句的格式可以是 “表达式;”这种一般格式的语句,也可以是循环、跳转等语句。跟一般表达式一样,语句表达式也有自己的值。语句表达式的值为内嵌语句中最后一个表达式的值。我们举个例子,使用语句表达式求值。
[转载] linux内核中GNU C和标准C的区别 linux 系统上可用的C编译器是GNU C编译器,它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。GNU C对标准C进行进一步扩展,以增强标准C的功能。
Netfilter/iptables 其中:etables作用域数据链路层,arptables针对ARP, iptables/ip6tables针对IP层。nftables 是新的包过滤组件.nft是相对应的新的用户态组件,用于替换etables,arptables,iptables,ip6tables.
VirtualBox虚拟机串口通信 设置方式就是在VirtualBox的设置里面设置串口,需要注意的是其中一台不勾选“连接至现有通道或套接字”,另外一台勾选,不勾选的那台需要先启动。在其中一台执行 cat /dev/ttyS0 ,另外一台执行 echo "hello world" > /dev/ttyS0。可以看到在执行cat /dev/ttyS0 的机器同步输出。现在希望两台CenOS虚拟机能通过串口通信。两台Guest虚拟机: CentOS。设置前先关闭两台虚拟机。
Docker安装配置 1) 查找镜像,如果有阿里云账号,那么:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors。参照:https://docs.docker.com/config/daemon/systemd/#httphttps-proxy。通过docker info可以查看是否已经生效。通过docker info可以查看是否已经生效。然后可以执行docker build。Docker中国区官方镜像。
k8s 集群安装(vagrant + virtualbox + CentOS8) 主机环境:windows 11k8s版本:v1.25dashboard版本:v2.7.0calico版本: v3.26.1CentOS8版本:4.18.0-348.7.1.el8_5.x86_64##################### 所有节点都需要执行的操作 开始 #################ssh配置:配置centos yum源:如果需要设置代理:增加一行:### 升级内核:安装完以后reboot。