C++虚函数剖析 从二级指针角度
写在前面
一直说 C++的多态, 其实底层原理是虚函数支持, 那么虚函数的底层原理呢, 之前一直停留在表面, 直到后来看了很多书籍/视频/博客文章, 才有了一点深刻的理解, 下面来具体看看如何通过 C 指针进行虚函数的调用, 相当于对 C 指针的一个复习, 同时也是对 C++虚函数底层原理的一个理解.
主要内容有如下几点:
二级指针的复习
通过对象首地址访问虚函数表
通过虚函数表调用虚函数
基类的私有虚函数, 可以通过指针运算访问! 这也是 C++灵活性的一个问题(缺陷)
测试代码可以参考我的 GitHub: Learn_C_CPP/oop_ood/virtual_func/read-vfunc.cpp at master · zorchp/Learn...
Git 常用操作
配置 git 环境
基本信息
git config --global user.name <your github name>
git config --global user.email <your github email>
# check :
$ cat ~/.gitconfig
[user]
name = xxx
email = yy@zz.com
这里建议采用下面的命令保存秘钥, 否则每次都要输入很麻烦(非自己机器请不要保存):
git config --global credential.helper store
可以看到, 这些配置其实都是在$HOME/.gitconfig 文件中写入某些条目而已.
ssh 公钥生成
...
Npm相关操作
gitbook install 报错TypeError: cb.apply is not a function
cd /opt/homebrew/lib/node_modules/gitbook-cli/node_modules/npm/
sudo npm install graceful-fs@latest --save
gitbook下:
cd .gitbook/versions/3.2.3/node_modules/npm
npm install graceful-fs@latest --save
Gitbook build stopped to work in node 12.18.3 · Issue #110 · GitbookIO/gitbook-cli;...
多线程压缩解压缩神器 pigz 使用方法总结
写在前面
首先要熟悉两个不同的操作:
tar: 用于打包, 打包前后的文件大小不会有区别, 仅仅是将多个小文件打包了, 最后的结果是.tar文件
zip: 压缩格式, 可以由tar命令指定压缩格式, 会执行压缩, 但是单线程执行会导致效率比较低, 最后的结果是 .zip或者.tar.gz
可以做个实验对比一下, 这里先生成一些小的文件, 通过 Shell 来做:
#!/bin/bash
dir=./files
tar_file=only_tar.tar
targz_file=with_gzip.tar.gz
# generate files for test
if [ ! -d ${dir} ]; then
mkdir ${dir}
for...
C++动态数组的释放问题,delete[]是不是必须的
写在前面
好久没认认真真写博客了, 最近一直忙着实习, 写的一些东西都发在内网了.
这次来总结一下 C++中动态数组的释放, 实际上有两种情况, 针对不同的情况也有不同的处理方式, 当然最保险的还是对应, 即:
new对应 delete
new[]对应 delete[]
最为保险, 但是昨天看了一个笔试题, 竟然多选, 那么就可以好好思考一下了.
下面分两种情况来分析, 即:
栈内存容器(complex 模板类)以及 POD 类型, 即 C-style 的类型, 例如 int, float 等等
堆内存容器(vector 这种动态数组肯定是堆内存), 以及用户自定义类型.
情况 1: 栈内存/POD
POD 类型
来看下面的代码:
#incl...
二叉树的括号表示(广义表示)转换
写在前面
笔试时候发现很多二叉树括号表示的题目, 了解一下.
转换规则
举例
mhy 的题目:
4.假设存在一棵树,其括号表示为A(B(F,G),C(H, (L)),D(J,K(M),E(N(O),P)),若将该树转换为二叉树,则该二叉树的后序遍历为
() 。
A GLIHFMKJPNEODCBA
B BFGCHILDJKMENOP
C ABGLIHEMKJPNEODC
D GFLIHMKJOPNEDCBA
堆地址和栈地址的区分
printf("main addr: %p\n", (void *)main);
int a = 1;
printf("stack addr: %p\n", &a);
int *p = (int *)malloc(sizeof(int));
printf("heap addr: %p\n", p);
free(p);
/*
main addr: 0x102257ee4
stack addr: 0x16dbaab24
heap addr: 0x600002c28050
*/
只是一个很简单的区分方法, 实际上还要受制于架构和指令集等情况.
Python牛客acm模式io题目答案
牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ;
1
import sys
for l in sys.stdin:
a, b = l.split()
print(int(a) + int(b))
2
import sys
n = input()
for l in sys.stdin:
a, b = l.split()
print(int(a) + int(b))
3
import sys
for l in sys.stdin:
a, b = l.split()
if a != '0' or b != '0':
print(int(a) + int(b)) ...
共计 460 篇文章,58 页。
您是Zorch的第 个小伙伴
Hits