STL容器使用姿势--存储对象还是指针

问题描述

c++的STL使用范围比较广泛,拿vector举一个例子,vector中可以存储对象也可以存储指针,那存储对象和存储指针分别有什么优缺点呢?

问题分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <vector>
#include <iostream>

class TestObj {
public:
explicit TestObj(int data) : data(data) {}
private:
int data;
};

int main() {
TestObj obj(10);
std::vector<TestObj> vec;
vec.push_back(obj);

std::cout << "origin TestObj address: " << &obj << std::endl;
std::cout << "Address of vector: " << &vec[0] << std::endl;
return 0;
}
1
2
origin TestObj address: 0x7ffc0198678c
Address of vector: 0x1472c20

查看更多

进程的栈跟踪之pstack命令

linux之pstack命令

pstack 命令用来显示进程或者线程的栈信息,可以使用pstack来确定进程或者线程挂起的位置。
此命令只有一个参数就是pid

如下使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>

void* start_run(void* arg) {
sleep(10);
printf("%s\n", arg);
return NULL;
}

int main() {
pthread_t thread1;
int ret = pthread_create(&thread1, NULL, start_run, (char*)"hello");
if (ret != 0) {
printf("pthread create failed");
return -1;
}
ret = pthread_join(thread1, NULL);
if (ret != 0) {
printf("pthread join failed");
return -1;
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
root@xxx:learn#pstack 28603
Thread 2 (Thread 0x7f8649c9c700 (LWP 28604)):
#0 0x00007f8649f668ed in nanosleep () from /usr/lib64/libc.so.6
#1 0x00007f8649f66784 in sleep () from /usr/lib64/libc.so.6
#2 0x000000000040068d in start_run(void*) ()
#3 0x00007f864a276ea5 in start_thread () from /usr/lib64/libpthread.so.0
#4 0x00007f8649f9f9fd in clone () from /usr/lib64/libc.so.6
Thread 1 (Thread 0x7f864a58c740 (LWP 28603)):
#0 0x00007f864a278017 in pthread_join () from /usr/lib64/libpthread.so.0
#1 0x00000000004006f3 in main ()

查看更多

进程与环境变量

环境变量

我们首先捋一下一个进程的启动步骤,拿 C 语言来举个例子吧,当内核执行 C 程序时,在调用 main 函数前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址—这是由链接编辑器设置的,而链接编辑器则由C编译器调用。启动例程丛内核取得命令行参数和环境变量值,然后为按上述方式调用main函数做好安排。

一个进程的环境变量是在调用main函数之前,由启动例程帮这个进程设置好的。准确点说,一个进程的环境变量是继承其父进程的。在linux 下,进程的环境变量可根据 cat /proc/1/envrion 查看。而用户启动的进程一般继承自终端shell,而终端shell的环境变量又可以被设置,常用的命令 export 也是如此,会写入当前终端shell对应的进程的环境变量的文件中。而一个进程的信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
root@9-134-239-95:3675# pwd
/proc/3675
root@9-134-239-95:3675# ll
总用量 0
-rw-r--r-- 1 root root 0 4月 13 10:00 autogroup
-r-------- 1 root root 0 4月 13 10:00 auxv
-r--r--r-- 1 root root 0 4月 13 10:00 cgroup
--w------- 1 root root 0 4月 13 10:00 clear_refs
-r--r--r-- 1 root root 0 4月 13 10:00 cmdline
-rw-r--r-- 1 root root 0 4月 13 10:00 comm
-rw-r--r-- 1 root root 0 4月 13 10:00 coredump_filter
-r--r--r-- 1 root root 0 4月 13 10:00 cpuset
lrwxrwxrwx 1 root root 0 4月 13 10:00 cwd -> /usr/local/services/monitor_agent/bin
-r-------- 1 root root 0 4月 13 10:00 environ
lrwxrwxrwx 1 root root 0 4月 13 10:00 exe -> /usr/local/services/monitor_agent/bin/monitor_agent
dr-x------ 2 root root 0 4月 13 10:00 fd
dr-x------ 2 root root 0 4月 13 10:00 fdinfo
-r--r--r-- 1 root root 0 4月 13 10:00 hostinfo
-r-------- 1 root root 0 4月 13 10:00 io
-r--r--r-- 1 root root 0 4月 13 10:00 latency
-r--r--r-- 1 root root 0 4月 13 10:00 limits
-rw-r--r-- 1 root root 0 4月 13 10:00 loginuid
-r--r--r-- 1 root root 0 4月 13 10:00 maps
-rw------- 1 root root 0 4月 13 10:00 mem
-r--r--r-- 1 root root 0 4月 13 10:00 mountinfo
-r--r--r-- 1 root root 0 4月 13 10:00 mounts
-r-------- 1 root root 0 4月 13 10:00 mountstats
dr-xr-xr-x 7 root root 0 4月 13 10:00 net
dr-x--x--x 2 root root 0 4月 13 10:00 ns
-r--r--r-- 1 root root 0 4月 13 10:00 numa_maps
-rw-r--r-- 1 root root 0 4月 13 10:00 oom_adj
-r--r--r-- 1 root root 0 4月 13 10:00 oom_score
-rw-r--r-- 1 root root 0 4月 13 10:00 oom_score_adj
-r--r--r-- 1 root root 0 4月 13 10:00 pagemap
-r--r--r-- 1 root root 0 4月 13 10:00 personality
lrwxrwxrwx 1 root root 0 4月 13 10:00 root -> /
-rw-r--r-- 1 root root 0 4月 13 10:00 sched
-r--r--r-- 1 root root 0 4月 13 10:00 sessionid
-r--r--r-- 1 root root 0 4月 13 10:00 smaps
-r--r--r-- 1 root root 0 4月 13 10:00 stack
-r--r--r-- 1 root root 0 4月 13 10:00 stat
-r--r--r-- 1 root root 0 4月 13 10:00 statm
-r--r--r-- 1 root root 0 4月 13 10:00 status
-r--r--r-- 1 root root 0 4月 13 10:00 syscall
dr-xr-xr-x 3 root root 0 4月 13 10:00 task
-r--r--r-- 1 root root 0 4月 13 10:00 wchan
root@9-134-239-95:1327# cat environ
LANG=CPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binNOTIFY_SOCKET=/run/systemd/notifySSH_USE_STRONG_RNG=0

而文件 envrion 存的是这个进程的环境变量。这个文件是只读的。

查看更多

shell重定向

shell 重定向

>默认为标准输出重定向,与 1> 相同

2>&1 意思是将标准错误的返回值传递给标准输出通道。&1表示1(标准输出)输出通道

1>&2 意思是将标准输出的返回值传递给标准错误输出通道。&2表示2(标准错误)输出通道

1>2 意思是将标准输出重定向到标准错误。

重定向就意味着文件描述符对应的文件指针指向别的文件表了。

查看更多

git标签

git 标签

一. 创建标签

1
2
3
4
5
6
7
8
9
10
11
1. 切换到要打标签的分支上
git branch dev, git checkout dev
2. 打一个新标签
git tag v1.0
3. 创建带有说明的标签,使用 -a 指定标签名, -m 指定说明文字
git tag -a v1.0 -m "version 1.0 released" 1094adb
4. 使用命令查看所有标签
git tag
注意:标签不是按时间顺序列出,而是按字母排序。
5. 查看标签的详细信息
git show tag_name

注意:默认标签是打到最新提交的 commit 上的。如果想在之前提交的 commit 上打标签

1
2
3
4
5
6
7
1. 找到历史提交的commit
git log --pretty=oneline --abbrev-commit
c4c46bd (HEAD -> dev, origin/master, master) init
e06133a Update README.md
1261493 Initial commit
2. 对某个 commit 打标签
git tag v0.9 c4c46bd

查看更多

git本地库操作

git本地库操作

一、版本管理

1
2
3
4
5
6
7
8
1. 查看仓库当前的状态
git status
2. 查看修改内容
git diff
注:git diff HEAD -- readme.txt 可以查看工作区和版本库里面最新版本的区别
3. 查看提交日志
git log, git log --pretty=oneline
注: --pretty=oneline 参数简化输出,还可以带上文件名,专门指这个文件的修改历史

在 git 中,使用 HEAD 表示当前版本,也就是最新的提交。上一个版本就是 HEAD^,同理,上上一个版本就是 HEAD^^。上上100个版本可以写成 HEAD~100 。

1
2
3
1. 版本回退(回退到上一个版本)
git reset --hard HEAD^
git reset --hard 1094a # 回退到某个版本

查看更多