C/C++
小瓶盖的猪猪侠
这个作者很懒,什么都没留下…
展开
-
leveldb源码分析之log 读文件代码
首先是读程序的数据结构SequentialFile* const file_; //文件操作类 Reporter* const reporter_; //错误报告 bool const checksum_; //是否检查校验值 char* const backing_store_;//临时存储从log文件中读取的内容 Slice buffer_; //用于存储读取内容 bool eof_; //是否为文件的结尾 // Offset of the last record re原创 2020-07-29 10:59:18 · 187 阅读 · 1 评论 -
leveldb源码分析之log 写文件代码
首先分析分析的是RecordType,用于记录log文件的结构enum RecordType { // Zero is reserved for preallocated files kZeroType = 0, kFullType = 1, // For fragments kFirstType = 2, kMiddleType = 3, kLastType = 4};static const int kMaxRecordType = kLastType;stat原创 2020-07-27 10:48:29 · 191 阅读 · 1 评论 -
C++学习之std::move()和std::forward()
C++11通过std::move()和std::forward()函数分别实现了左值转右值和完美转发的功能。对于std::move(),考虑如下情形: void func(int &&args) { std::cout << args << std::endl; } int a = 10; func(20); // ok func(a); // error, 右值引用不能绑定左值 func(std:原创 2020-07-09 22:19:47 · 265 阅读 · 0 评论 -
C++学习之类的初始化及析构的顺序
创建对象的顺序:1、构造函数调用基类的构造函数2、调用成员的构造函数3、执行自身的构造函数析构对象的顺序:1、执行自身的析构函数2、执行成员的析构函数3、调用基类的析构函数这种执行顺序是保证一个基类或一个成员不会在它的初始化完成之前或者销毁之后被调用...原创 2020-07-05 22:13:49 · 158 阅读 · 0 评论 -
C++学习之宏的介绍
宏在C语言中非常重要,但是在C++中的作用就小了很多,关于宏的最重要的原则是除非万不得已,不然不要用。#define PI 3.14宏将两个字符串拼接起来#define NAME(a,b) a##bint NAME(hack,cah)();//上面的转义之后变为下面的hackcah();保留参数名称#define print(x) cout<<#x<<" = "<<x<<endl;print(a);//上面的表现形式如下cout&原创 2020-07-05 16:14:52 · 97 阅读 · 0 评论 -
C++学习之函数未定的参数数量
使用省略号(…)结束参数列表#include <cstdarg>#include <iostream> using namespace std;void error(int severity ...){ va_list ap; va_start(ap,severity); for(;;){ char * p = va_arg(ap,char *); if(p == nullptr) break; cerr<<p<<" ";原创 2020-07-05 15:02:16 · 192 阅读 · 0 评论 -
C++学习之详解new和delete
很多时候我们在函数内部创建了对象,并且希望在函数返回后仍然使用这些对象。运算符负责创建这些对象。运算符delete负责销毁他们。new分配的对象位于自由存储之上或在动态内存中。获取内存空间自由存储运算符new、delete、new[]和delete[]的实现void* operator new(size_t);void operator delete(void *p);void *operator new[](size_t);void operator delete[](void *p);重原创 2020-07-04 23:20:04 · 222 阅读 · 0 评论 -
C++学习之指针
说明指针用于存储物理地址,可以理解为一种特殊的类型。char a = 'f';char *b = &a;void*除了函数指针和指向类成员的指针,指向其他任意类型对象的指针都能被赋给一个void类型的变量。此外,一个void能被赋给另一个void*,两个void能够比较是否相等,我们还能显示将void转化为其他类型。由于编译器实际上并不清楚void所指的对象到底是什么类型,所以对它执行官其他操作可能不太安全且会引发编译器错误。要想使用void,我必须显示的转化成特定的类型指针。void原创 2020-07-01 22:52:21 · 110 阅读 · 1 评论 -
C++学习之类型别名
usingusing Pchar = char;using PFun = void(*)(int);typedeftypedef char Pchartypedef void(*PFun)(int)原创 2020-07-01 22:04:25 · 95 阅读 · 0 评论 -
C++学习之对象的生命周期
对象的生命周期从对象的构造函数完成那刻开始,直到析构函数执行行为止,我们从声明周期的角度把对象划分为以下类型:自动对象除非程序员特别说明,否则在函数中声明的对象在其定义处被创建,当超出作用域范围被销毁。在大多数实现中,自动对象被分配在栈空间中,每调用一次函数,获取新的栈帧以存放它的自动对象。静态对象在全局作用域或名字空间作用域中声明的对象以及在函数或者类中声明的static成员只被创建并初始化一次。并且直到程序结束以前都活着,这样的对象被称为静态对象。自由存储对象用new和delete直接控制其原创 2020-07-01 21:34:33 · 1134 阅读 · 0 评论 -
C++学习之作用域
声明语句的访问范围收到作用域的影响,在C++中作用域包括有:局部作用域函数或者lambda表示式中声明的变量称为局部变量。局部变量的作用域从声明处开始,直到声明语句所在块的结束。类作用域如果某个类位于其他类或者函数或者枚举类或其他名命空间的外面,则定义在该类的类成员变量的作用域从类的声明开始,到类的结束。名字空间作用域某个名字空间位于任意函数、lambda表达式、类或者枚举类或者其他名字空间的外部,则定义在该名字空间的变量作用域从声明语句开始,到名字空间结束为止。全局作用域语句作用域如果某原创 2020-06-30 22:20:54 · 191 阅读 · 0 评论 -
字节对齐
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-转载 2020-06-30 21:21:08 · 490 阅读 · 0 评论 -
6、gdb学习之core文件
看到上面的结果是不是有种老相识的感觉哈,接下来就尝试使用core解决上面问题core文件有问题的程序运行后,产生“Segmentation fault”时生成的具有堆栈信息和调试信息的文件。编译时需要加 -g 选项使程序生成调试信息: gcc -g core_test.c -o core_test配置生成 core 文件使用 ulimit -c 查看core开关,如果为0表示关闭,不会...原创 2019-10-20 17:07:07 · 249 阅读 · 0 评论 -
5、gdb学习之多线程调试
首先贴上本节的代码//thread.c#include <stdio.h>#include <stdlib.h>#include <pthread.h>#define MAX_N 1000000#define MAX_THREADS 100int nthreads, n, prime[MAX_N+1], nextbase;int w...原创 2019-10-20 16:26:48 · 121 阅读 · 0 评论 -
4、gdb学习之主要变量操作
在gdb中,查看变量的值主要使用print整个命令,print格式是print xxxp xxx下面使用的code//test.cpp#include <iostream>using namespace std;int* t;int main(){ int i = 1; int b[] = {1,2,3,4,5}; t = new int(10); fo...原创 2019-10-20 11:01:42 · 375 阅读 · 0 评论 -
3、gdb学习之主要断点操作
断点用来让程序暂停执行的位置,gdb有三种方式让程序暂停执行,断点 通知gdb在程序中特定位置暂停执行监视点 通知gdb内存特定位置的值发生变化时暂停执行捕获点 通知gdb当特定事件发生时暂停执行设置断点gdb设置断点方法有很多,主要使用以下三种方法break functionbreak line_numberbreak filename:line_numberbreak...原创 2019-10-19 20:44:38 · 337 阅读 · 0 评论 -
1、gdb学习之初涉调试
前期准备我本次学习使用的系统是centos,首先需要安装vim编辑器和gdb调试器,可以使用命令yum install vim gdb -y,如果是使用ubuntu的需要使用apt-get进行安装。code下面是我本单元使用的code,//gdb_1.cpp#include <iostream>using namespace std;int add(int a,int...原创 2019-10-19 10:47:13 · 86 阅读 · 0 评论 -
原码、反码、补码
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助!一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是...转载 2019-10-13 10:59:18 · 76 阅读 · 0 评论