自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 C++实践2:在c++20中为spdlog与fmt装配source_location

介绍了cpp20下,c++常用的日志库spdlog和格式化输出功能库fmt如何使用source_location

2022-08-28 11:43:41 2497 2

原创 C++实践1:RVO优化

问题1. 如下代码会输出什么?class String{public: explicit String(const char* p){ size_t size = std::strlen(p) + 1; data = new char[size]; std::memcpy(data,p,size); cout<<"1"<<endl; } ~String(){ delete[

2021-07-21 15:03:12 1335 1

原创 nm命令实战2: C++的static变量到底存储在哪里

上一篇先说结论已初始化存储在.data节,未初始化存储在.bss节,不管是否初始化,static关键字修饰的变量不允许外部引用。总结普通全局变量可被外部引用,static全局变量不可被外部引用局部变量不可被外部引用验证1. main.c如下static int global_var1 = 1;static int global_var2;int fun(){ static int inner_var1 = 3; int inner_var2 = 4; return 0

2021-07-16 15:18:19 567

原创 nm命令实战1: 分析ELF符号表&汇编输出

一.准备工作1. main.c代码如下extern int u_n1;extern void u_func1();long t_n3;long d_n4 = 3;int d_func2(){ u_func1(u_n1, t_n3, d_n4);}2. 生成ELF文件命令cc -o main.o -c main.c二. 理论知识1. nm命令的学习nm命令2. ELF的格式ELF文件就是我们使用上述命令生成的文件(main.o),它以.o结尾,就是我们常说的可重定位

2021-07-16 14:55:46 1208

原创 使用AT&T汇编格式 以循环方式计算阶乘 并打印输出到标准输出

首先是将数字转化为字符串思想做除法,从低位到高位,依次取出各位对每位,加上‘0’的ascii,此时其变为了字符放入一个栈中,从而反向输出从高位到低位代码#将数字转为字符串.bss .lcomm buff ,30 # 分配一个栈.data temp : .string "" # 保存最后结果.text.global _start_start: movq $1234, %rax # 被除数

2021-06-22 11:11:09 318

原创 UNP 学习笔记 第6章

一. 大纲1. 从本章开始构建基于IO多路复用的服务器.2. 略微的学习使用select ,poll略过.之后最终以epoll为主.3. 因此会补充大量的前置知识,如下会标出.4. 同时本书(Unix Network Programming)也会在学完第6章后暂时告一段落.5. 部分章节仅仅是阅读了一遍,下次系统学习本书时应该着重细看:UDP相关的第8章,第13章 守护进程和inetd超级服务器,6. 部分章节第本次学习没有时间看了,下次应该重点学习: 第22章 高级UDP套接字编程,第28章的

2020-11-29 13:49:00 238 1

原创 UNP 学习笔记 第16章

一.前言本章主要学习非阻塞式IO. 没仔细看.

2020-11-29 11:33:38 202 1

原创 UNP 学习笔记 第十四章

各种IO函数基于多进程服务器,稍微修改head.h,测试各种IO函数1.recv 和 send 函数void client_simple_echo(int sockfd){ char sendline[MAXLINE]; char recvline[MAXLINE]; while(fgets(sendline,MAXLINE,stdin) != NULL) { //read (from stdin) -> write (to serv) -> read(from

2020-11-29 11:04:06 116

原创 UNP 学习笔记 第十五章

一. Unix域套接字1. 描述符传递 && 接收发送者的凭证用到的时候再看2. struct sockaddr_un3. socketpair4. 书上有三四个例子,跟着学习一下如何创建一个Unix域套接字二. 书上内容的补充1.基础2.socketpair三.学习创建一个Unix域C/S使用Unix域协议的理由1.Unix域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍。2.Unix域套接字可用于在同一个主机上的不同进程之间传递描述符。3.Unix域

2020-11-28 14:42:12 146

原创 UNP 学习笔记 第二十六章

一.概述上接第5章,实现完多进程服务器后,开始实现多线程服务器.多线程服务器最重要的问题就是同步互斥问题.因此我的多线程服务器的学习步骤为: 1.熟悉线程间的同步和对资源的互斥访问问题,主要用到互斥锁,信号量和条件变量 2.线程方面重点API的学习. 3.基于前几章的多进程服务器,结合csapp,将其改进为具有线程池的多线程服务器 4.学习第15章,在上述服务器中加入Unix域协议,并尽可能多的加入其它线程间通信机制 5.大致翻看http图解这本书 6.复习html基础知识 7.在上述服

2020-11-27 11:38:06 253

原创 UNP 学习笔记 第五章

一. 复习所有的ANSI C IO函数1. printf 和 scanf .各种格式都要复习到2. fprintf 和 fscanf3. sscanf 和 sprintf ,snprintf4. fgets 和 fputs5. gets 和 puts6. vsnprintf 可变参数列表7. putc 和 getc8. putchar 和 getchar...

2020-11-21 18:30:18 282

原创 UNP 学习笔记 第七章

一. 两个API 和 一些选项getsockopt 和 setsockoptgetsockopt把对套接字的操作放入到optval中setsockopt对套接字设置操作SO_BROADCAST开启/禁止广播SO_DEBUGSO_DONTROUTE饶过底层协议的正常路由机制.SO_KEEPALIVE设置此选项后,2小时内无数据报交换的话,tcp会检测对端是否存活.SO_LINGER1. linger结构体2. close的默认操作3.设置SO_LINGER,且l_linger为正值

2020-11-20 21:02:52 166

原创 UNP 学习笔记 第十一章

一.

2020-11-20 14:45:34 153

原创 UNP 学习笔记 第四章

一.复习GDB调试链接:GDB常用1.笔记上的基础操作2.学习输出帧栈和局部变量的信息---->首先是使用到的源代码#include <stdio.h>#include <string.h>//用来测试bt等类似命令void fun(){ static int a = 1; a++; if(a == 10) return ; printf("a=%d\n",a); fun();}int main(){ fun(); re

2020-11-18 14:00:25 317

原创 UNP 学习笔记 第三章

第三章地址结构1. IPv4/IPv6/外加两个通用地址结构2. 复习结构体的对齐网络字节序1. 复习大小端2. 4个大小端转换函数值-结果参数是什么字节操纵函数1. 书上给出的3个BSD版本的常用api,必会2. ANSI C书上给出的3个,包括源码,必会3. [c标准库,string.h里的这些所有都要会](https://blog.csdn.net/liuqiyao_01/article/details/26967813?ops_request_misc=%257B%2522

2020-11-16 07:50:02 176

原创 现代操作系统 第二章 进程与线程 答案 自己整理版

第一题可能发生:理想情况下,如仅有一个进程时,某个进程从阻塞态直接到运行态是可能的.而从就绪态到阻塞态则不可能.第三题汇编可以直接操纵底层硬件.第四题用户栈空间不足时不至于使操作系统崩溃. 第五题pow(1/2,5) = 1/32第六题可以容纳的进程数: (4G - 512m) / 256m = 14假设每个进程等待I/O的概率是 p则14个进程都等待I/O的概率是 p^14令 p ^ 14 = 1 - 0.99 = 0.01 得p = 0.72第七题顺序执行耗时: 40

2020-10-21 23:44:20 1093

原创 现代操作系统 第一章 引论 答案 自己整理版

第一章 引论第一题 操作系统的两大作用本书:提供一个资源集的清晰抽象.(即把底层隐藏起来)管理这些硬件资源.(即让应用程序合理有序的使用硬件设备等)机组:(从硬件方面来考虑)防止硬件设备受失控应用程序的影响给高层提供简单一致的映像.而不用为纷繁复杂的底层硬件编写各种接口.第二题 简述9种操作系统及其作用大型机操作系统服务器操作系统多处理器操作系统个人计算机操作系统掌上计算机操作系统嵌入式操作系统传感器结点操作系统实时操作系统智能卡操作系统第三题 分时操作系统和多道

2020-10-19 21:09:19 611

原创 C++Prime 第十九章 最后一章

C++Prime 第十九章练习19.1void* operator new(size_t size){ if (void* mem = malloc(size)) return mem; else throw bad_alloc();}void operator delete(void* mem)noexcept{ free(mem);}练习19.2略练习19.3(a) 失败,基类不可向派生类转化(b) 成功© 成功存疑.练习19.4略练习19.5并非任

2020-07-12 23:36:47 184

原创 C++Prime 第十八章

C++Prime 第十八章练习18.1(a) r是一个range_error类型对象(b) p是exception练习18.2v被摧毁,p指针销毁,但是所指内存没有得到释放,in自动调用析构函数.未找到catch,系统调用terminate函数,程序终结.练习18.3方案一:对p使用智能指针,补充try-catch语句方案二:p改为全局对象练习18.4exception是基类,runtime_error也是overflow_error的基类,基类的捕获语句应该放在后面 try {

2020-07-12 14:44:53 148

原创 C++ Prime第十七章

C++ Prime第十七章练习17.1 tuple<int, double, long> t(10, 20, 30); tuple<size_t, size_t, int> t2{10,20,30}; tuple<int, long, double> t3; t3 = make_tuple(10, 20, 30);练习17.2tuple<string, vector<string>, pair<string, int>>

2020-07-11 21:37:57 197

原创 C++Prime第十六章 后36题

C++Prime第十六章 后36题练习16.32编译器使用函数调用中的实参类型来寻找模板实参,用这些模板实参生成的函数版本与给定的函数调用最为匹配.练习16.33模板实参会忽略顶层const,同时允许const转换一级数组或函数到指针的转换.练习16.34(a)不合法,T的类型分别时const char [3],const char [6],(b)同理,b合法.练习16.35(a)T为char,第二个参数是’c’的ascII(b)T为double,第二个参数执行缩招转换,float-&g

2020-07-10 18:13:39 153

原创 C++Prime第十六章 前31题

C++Prime第十六章 前30题练习16.1编译器使用推断出的模板参数代替对应的模板参数,常见出模板的一个实例,这就是实例化.练习16.2template<typename T>int compare(const T& t1, const T& t2) { if (t1 < t2) return -1; if (t2 < t1) return 1; return 0;}int main(){ cout << compare(1,

2020-07-09 17:24:08 196

原创 C++Prime 第十五章

C++Prime 第十五章练习15.1虚成员:基类希望派生类覆盖的成员函数.任何构造函数之外的非静态函数都可以是虚函数.练习15.2protected: 允许派生类访问private:不允许练习15.3#pragma once#include <iostream>#include <vector>using namespace std;class Quote{public: Quote() = default; Quote(const string&am

2020-07-08 15:51:35 223

原创 C++Prime 第14章后23题

C++Prime 第14章后23题练习14.31智能指针或内置类型,可以自己管理自己拥有的资源,于是使用编译器合成的拷贝控制函数就满足要求了.练习14.32class X{public: string* operator->() { return ptr->operator->(); };private: StrBlobPtr* ptr;};练习14.33重载的函数调用运算符最少接受0个对象,最多接受无限个对象.练习14.34#pragma once#inc

2020-07-05 15:17:58 125

原创 C++Prime 第14章 前30题

C++Prime 第14章 前30题练习14.1重载运算符与内置运算符:区别:1)某些运算对象的求值规则无法在重载运算符中保存下来.比如&&和||的短路求值特性被舍弃.2)重载运算符必须要求至少有一个成员是class类型相同:1)一般来说,优先级,结合律和操作数的数目是一致的.2)一般来说,表达的逻辑是相同的.练习14.2 friend std::istream& operator>>(std::istream& is, Sales_data&

2020-07-04 16:55:39 160

原创 C++Prime 第十三章 后28题

C++Prime 第十三章 后28题练习13.31不知道为啥我的就是不调用swap,代码如下.头文件:#pragma once#include <iostream>using std::string;class HasPtr{public: HasPtr(const HasPtr&); HasPtr(const std::string& s = string()) :ps(new string(s)), i(0) {} HasPtr& operat

2020-07-04 12:54:03 193

原创 C++Prime 第十三章 前30题

C++Prime 第十三章 前30题练习13.1拷贝构造函数:通过拷贝对象的方式创建一个新对象.满足以下条件:本身是构造函数,第一个参数必定是自身类类型的引用,且任何额外参数都有默认值.使用:"=";函数非引用形参;非引用返回值;用花括号初始化一个数组中的元素或者一个聚合类中的成员;某些类类型会对他们所分配的对象使用拷贝初始化.练习13.2拷贝构造函数第一个参数必须是对自身类类型的引用,不然会陷入无限的递归调用中.本题,如定义Sales_data a = b;则相当于 a.Sales_data

2020-07-02 22:05:27 141

原创 C++Prime 第十二章

C++Prime 第十二章练习12.1b2被销毁,其中元素未被销毁,b1和b2包含4个元素.练习12.2class StrBlob{ typedef std::vector<std::string>::size_type size_type; StrBlob(); StrBlob(std::initializer_list < std::string> il); size_type size() const { return data->size(); }

2020-07-01 21:47:13 189

原创 C++Prime 第十一章

C++Prime 第十一章练习11.1map以关键字来存储和访问,vector以元素在容器中的位置来存储和访问.练习11.2list: 插入&删除,如链表中间插入一个数据vector: 随机访问,deque: 头尾插删,map: 关键字存储,如字典set:关键字的集合.如判断一个元素是否在集合中出现过练习11.3 map<string, size_t> word_count; string word; while (cin >>

2020-06-28 16:22:16 277 1

原创 C++ Prime第十章

C++ Prime第十章练习10.1int main(){ vector<int> data; int num, sum = 0; while (cin >> num) data.push_back(num); cout << "输入一个要查找的值: " << endl; int val; cin.clear(); cin >> val; sum = count(data.begin(), data.end(), v

2020-06-27 22:43:36 187

原创 C++Prime 第九章后22题

C++Prime 第九章后22题练习9.31

2020-06-25 15:15:18 196

原创 C++Prime 第九章前30题

C++Prime 第九章前30题练习9.1(a)选择list,因为可能在容器中间插入元素.也可以选择vector,全部读取完毕后,直接sort.(b)选择deque,因为插入删除操作只在头部进行.(c)选择vector.练习9.2 list<deque<int> > data;练习9.3迭代器范围:两个迭代器指向同一容器,或者是容器最后一个元素之后的位置,begin递增若干次后等于end.练习9.4#include <iostrea.

2020-06-22 16:58:46 145

原创 C++Prime 第八章

C++Prime第八章练习8.1 练习8.2#include <iostream>#include <sstream>#include <fstream>using namespace std;istream& print(istream& is){ string word; while (is>>word) { cout << word<<endl; } is.clear();..

2020-06-21 12:21:40 368

原创 C++Prime 第七章后28题

C++Prime 第七章后28题练习7.31class Y;class X { Y* y; };class Y { X x; };练习7.32重点在于友元成员函数的实现,如下:class Window_mgr //第一步,首先定义Window_mgr类{public: using ScreenIndex = std::vector<int>::size_type; void clear(ScreenIndex i);//第二步,声明clear函数,但不定义.(

2020-06-20 09:11:43 218

原创 C++Prime 第七章前30题

C++Prime 第七章前30题练习7.1书上代码照着敲就行.练习7.2#include <iostream>#include "Sales_data.h"using namespace std;int main(){ Sales_data total; if (cin >> total) { Sales_data trans; while (cin >> trans) { if (total.isbn() == tran

2020-06-18 18:17:30 222 1

原创 C++Prime 第六章 后36题

C++Prime 第六章 后36题练习6.31返回对局部变量的引用无效.常量如果是在函数中,那么其实它也是局部的,同上.练习6.32合法滴,将指定数组元素修改为0 - 10.练习6.33#include <iostream>#include <vector>using namespace std;void print(vector<int> vi,int n){ if (n == vi.size()) return; cou

2020-06-14 22:37:05 108

原创 C++Prime 第六章 前30题

C++Prime 第六章 前30题练习6.1实参和形参的区别: 实参是实际提供给函数的参数,实参是形参的初始化值,练习6.2(a) 返回类型不符(b)无返回类型(c)形参不能重名(d)函数体必须用括号括起来练习6.3 练习6.4(稍微一改就行)#include <iostream>using namespace std;long long fact(int n){ if (n == 1) return 1; return n * fact(n

2020-06-14 15:47:16 163

原创 C++Prime 第五章

C++Prime 第五章练习5.1以分号结尾成为空语句,语法上需要一条语句,逻辑上不需要时.练习5.2用花括号括起来的语句语句,可以为空,称为复合语句,或者块.语法上需要一条语句,逻辑上需要多条语句时.练习5.3 略练习5.4(a) while(string::iterator iter != s.end()) //iter未初始化直接用,while判断语句里不允许定义变量(for可以,while不可以!!!)(b) while(bool status = find(wor.

2020-06-12 17:47:44 157

原创 C++Prime第四章

C++Prime第四章练习题,自己做的答案,不对之处恳请批评指正。练习4.1结果是:105练习4.2(a) *vec.begin() == *(vec.begin())(b) *vec.begin() + 1 == *(vec.begin()) + 1练习4.3不可接受。有些错误隐蔽不好发现。练习4.4( ( ((12 / 3) * 4 ) + (5 * 15) ) + ( (24 % 4) / 2) ) = 91#include <io...

2020-06-12 11:33:38 223

原创 C++Prime第三章

C++Prime第三章练习3.1using namespace std; 和 using std::cin; 和 std::cout<<""<<std::endl; 三种形式选择就行。练习3.2#include <iostream>#include <string>using namespace std;int main(){ string line; while (getline(cin, line)) cout <&

2020-06-04 20:46:56 221

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除