
C++
文章平均质量分 90
记录linux下C/C++以及linux底层相关技术
赶路人儿
一个十年以上编程人员,擅长使用java、python、C++等语言,具有广告投放、个性化推荐引擎等超大规模系统开发经验。
展开
-
内存对齐(C/C++)
内存对齐是操作系统为了可以让 CPU 高效读取内存中的数据采用的一种策略,它使得数据在内存中都按一定的规则排列。本篇来解释一下内存对齐。转载 2023-11-01 14:47:41 · 1029 阅读 · 0 评论 -
基于B树实现(⽂件)索引存储
1、为什么⽂件索引要使⽤B-tree 实际上⽂件索引的数据结构⽆⾮就是 B树 和 B+ 树,但实际上在内存中也可以应⽤这种数据结 构,但是意义不⼤,因为这种结构就是为⽂件存储设计的, 为了减少磁盘IO,加速查找 ,那为什么 要使⽤这两种数据结构呢,第⼀ 这是树形结构,所以在保存的时候可以按照有序的规则去储存索引信息 ,第⼆ 这个树形结构每⼀个节点可以保存多个关键字也就是相当于可以存储多个索引,这样的话⼀次I/O就会尽可能多的知道下⼀步 的位置及当前是否命中索引 .2、为什么把索引存储在⽂件中 想转载 2022-05-04 17:39:37 · 1325 阅读 · 0 评论 -
Linux内核Page Cache和Buffer Cache关系及演化历史
在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏页(dirty page)数据(实际文件内容及元数据信息)一同写回磁盘。这里提到的脏页(dirty page)即为页缓存(page cache)。块缓存(buffer cache),则是内核为了加速对底层存储介质的访问速度,而构建的一层缓存。他缓存部分磁盘数据,当有磁盘读取请求时,会首先查看块缓存中是否有对应的数据,如果有的话,则直接将对应数据返回,从而减少对磁盘的访问。两层缓存各有自己的缓存目标,我转载 2021-10-08 13:27:24 · 244 阅读 · 0 评论 -
简述Linux 2.6 中的直接 I/O 技术
简介: 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O。本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在磁盘和应用程序地址空间进行传输,所以该文件访问的机制称作为直接 I/O。Linux 中就提供了这样一种文件访问机制,对于那种将 I/O 缓存存放在用户地址空间的应用程序来说,直接 I/O 是一种非常高效的手段。本文将基于 2.6.18 版本的内核来讨论 Linux 中直接 I/O 的技术的设计与实现。https://www.ibm.com/.转载 2021-09-26 11:27:04 · 565 阅读 · 0 评论 -
多线程下的fwrite和write
Linux下的文件操作,有人喜欢用C库的文件流操作(标准IO),有人喜欢用Linux的文件IO。一般来说,C库的文件操作会更高效一些,因为C库自己做了文件缓存的处理。今天,主要研究多线程下的fwrite与write,每个线程都对相同的FILE*或者fd进行写操作,看看结果是否为预期行为。1、实验描述:定义三个线程向同一个文件中写入数据:线程1~3分别写入"aaaaaa\n","bbbbbb\n",和"cccccc\n"各一百万次。如果写入文件的操作是“线程安全”的,那么最终的文件行数应该是3百万行,转载 2021-09-25 16:40:25 · 2216 阅读 · 1 评论 -
MMAP和DIRECT IO区别
在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO。本篇文件打算详细全面,深入浅出。剖析文件IO的细节。从多个角度探索如何提高IO性能。本文尽量用通俗易懂的视角去阐述。不copy内核代码。阐述之前,要先有个大视角,让我们站在万米高空,鸟瞰我们的文件IO,它们设计是分层的,分层有2个好处,一是架构清晰,二是解耦。让我们看一下下面这张图。1、穿越各层写文件方式:程序的最终目的是要把数据写到磁盘上, 但是系统从通用性和性能角度,尽量提供一个折中转载 2021-09-24 14:53:12 · 523 阅读 · 0 评论 -
Linux 编程中的API函数和系统调用的关系
API:(Application Programming Interface,应用程序编程接口):指的是我们用户程序编程调用的如read(),write(),malloc(),free()之类的调用的是glibc库提供的库函数。API直接提供给用户编程使用,运行在用户态。我们经常说到的POSIX(Portable Operating System Interface of Unix)是针对API的标准,即针对API的函数名,返回值,参数类型等。POSIX兼容也就指定这些接口函数兼容,但是并不管API具体转载 2021-09-22 22:36:34 · 1264 阅读 · 0 评论 -
linux下so动态库一些不为人知的秘密
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。一、动态链接库依赖问题基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看 :# ldd /bin/lslinux-vdso.so.1 => (0x00007fff597ff000)libselinux.so.1 => /lib64/libselinux.so.1 (0x00000036c2e00000)libr转载 2021-09-18 17:02:48 · 1274 阅读 · 0 评论 -
VSCode介绍、常用 插件使用以及java、C++、python环境配置
一、常用配置:1、左侧视图中树组件的缩紧:默认左侧树缩紧太小,当打开大的工程,层级比较多shi原创 2020-06-21 16:13:47 · 2809 阅读 · 0 评论 -
C++11新特性:default函数、delete函数
1、默认函数:C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。2、=default:C++11 标准引入了一个新特性:"=default"...原创 2020-04-29 15:46:43 · 3894 阅读 · 0 评论 -
C++四种强制类型转换介绍
1、C风格的强制转换:C风格的强制转换(Type Cast)容易理解,不管什么类型的转换都可以使用使用下面的方式。TypeName b = (TypeName)a;规则:将浮点型数据赋值给整型变量时,舍弃其小数部分。 将整型数据赋值给浮点型变量时,数值不变,但是以指数形式存储。 将double型数据赋值给float型变量时,注意数值范围溢出。 字符型数据可以赋值给整型变量,此...原创 2020-04-26 17:23:45 · 1085 阅读 · 0 评论 -
C++:关于函数返回的一件小事——是返回值还是返回引用?
C语言中的指针的错误使用,是很多内存错误的根源。C++中引入了_引用(reference)_,来化解指针的毒。但是引用并不是一剂完全的解毒药,还有好多毒还不能解。下面这个毒就是个例子:int& f() { int a = 1; return a;}上面的代码,函数f()中返回了自身局部变量a的引用。这是相当危险的行为,当f()返回时,相应的栈上的内存消解了,局部变量也随...转载 2020-04-21 21:19:29 · 1281 阅读 · 0 评论 -
C++ protobuf示例
https://blog.csdn.net/liuxiao723846/article/details/99884741这边文章主要介绍了如何在linux上安装protobuf,以及如何使用。本文在此基础之上,做一些深入的讨论的总计。1、for循环repeated字段:1.1)对于基本类型的repeated:可以通过属性()的方法获取到类型为::google::protobuf::R...原创 2020-04-17 12:41:44 · 22212 阅读 · 4 评论 -
C++函数返回值
首先,强调一点,和函数传参一样,函数返回时也会做一个拷贝。从某种角度上看,和传参一样,也分为三种:一般(传统)返回:返回任意类型的数据类型,会有一个拷贝,对于复杂对象效率低下;例如:int test(){}或者 Point test(){} 返回指针:返回一个指针,也叫指针类型的函数;例如:int *test(){} 或者 Point *test(){} 返回引用:返回一个引用,也叫引用类...原创 2020-03-12 19:03:15 · 22705 阅读 · 5 评论 -
C++指针、引用
1、取地址运算符、间接寻址运算符:& 取地址运算符,返回变量的内存地址(指针)。 * 是间接寻址运算符(解引用),是 & 运算符的补充,返回变量所指定地址的变量的值。#include <iostrem>using namespace std;main() { int var; int *p; int val; var = 3000;...原创 2020-03-11 20:05:38 · 535 阅读 · 0 评论 -
C++函数的参数传递
1、三种参数传递方式:1)值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。默认是值传递。2)指针传递:形参也是实参的拷贝,只不过拷贝的是实参的地址。当在函数内对形参的指向操作时,就相当于对实参本身进行的操作。传递参数时:通过取地址运算符(&)对实参取地址,或定义一个指...原创 2020-03-11 17:02:39 · 3363 阅读 · 0 评论 -
JNI 简单示例
JNI即Java Native Interface(Java本地接口),是一个协议,主要作用为:实现Java调用c/c++代码(类库),或者C/C++调用Java代码。本文主要介绍通过JNI实现java调用C/C++通过Java jni来调用native code,需要如下几个步骤:编写java代码,使用native关键字声明本地方法接口(例如:native void printstr(S...原创 2019-10-12 11:52:31 · 1075 阅读 · 0 评论 -
pkg-config 详解
pkgconfig有什么用?大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接C++程序的时候,必须要指定这些头文件和库文件的位置。对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。pkg-config是一个linux下的命令,她能够把这些...原创 2019-09-02 20:24:22 · 3080 阅读 · 0 评论 -
解决C++编译时报错:ld: cannot find -lxxx方法
编译程序有时会遇到“ld: cannot find -lxxx”的错误,就是链接器说找不到xxx库。一般先使用如下命令查找系统中是否存在xxx库而ld程序未找到(以zlib为例):$ ld -lzlib --verbose输出如下信息:====================================attempt to open /usr/x86_64-linux-gnu...原创 2019-08-28 22:47:33 · 67219 阅读 · 8 评论 -
C++构建之cmake
一般来说。GNU 开源软件的 Build 系统,软件的安装过程都是:解压源代码包 ./configure make make install这个过程中, 需要有一个 configure 脚本,同时也需要一个 Makefile 文件。最早的时候,程序员完成源代码开发以后,发布代码包时,一般会附带相应的 Makefile 文件。然后就可以 make && make in...原创 2019-08-27 21:47:09 · 5201 阅读 · 0 评论 -
C++ glog示例
1、下载、安装:方式一:从github上下载源码、编译、安装:https://github.com/google/glog$ cd /usr/local$ git clone https://github.com/google/glog.git$ cd glog$ ./autogen.sh && ./configure && make &&a...原创 2019-08-26 13:08:35 · 2625 阅读 · 0 评论 -
C++ gflas示例
1、下载、安装:Google 的 gflags 是一套命令行参数处理的开源库。比 getopt 更方便、功能更强大。包括 C++的版本和 python 的版本。github地址:https://github.com/gflags/gflags1)安装cmake工具:在安装gflags前需要先安装cmake:官网:https://cmake.org/download/gith...原创 2019-08-24 21:22:16 · 1318 阅读 · 0 评论 -
C++ protobuf示例
1、linux上安装protobuf3:1)下载:https://download.csdn.net/download/liuxiao723846/115848622)编译安装:function check_install_status() { if [ $? -ne 0 ]; then echo "--!!ERROR" exit 1 ...原创 2019-08-21 12:51:43 · 8806 阅读 · 3 评论 -
C++头文件
通常,在一个C++程序中,只包含两类文件:.cpp文件和.h文件,前者称为源文后者称为头文件,里面放的都是C++代码。1、分别编译:C+ +语言支持“分别编译”(separate compilation)。也就是说一个程序,可以分成不同的功能分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的,在编 译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的...原创 2019-08-17 20:26:33 · 2427 阅读 · 0 评论 -
C++ 值传递、指针传递、引用传递详解
值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作引用传递:形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在...原创 2019-08-05 23:38:47 · 835 阅读 · 0 评论 -
C++连接redis示例
我们通过第三方库hiredis来连接redis。hiredis.h的下载地址为:https://github.com/redis/hiredis1、下载安装hiredis库:$ wget https://github.com/redis/hiredis/archive/master.zip$ mv hiredis-master /usr/loca$ cd /usr/local...原创 2019-07-28 19:10:47 · 2516 阅读 · 0 评论 -
GCC/G++编译器中指定库文件(LIB)、头文件(INCLUDE)
库文件在连接(静态库和共享 库)和运行(仅限共享库的程序,静态库会和可执行编译到一起)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。设置库文件的搜索路径总的来说有以下几种:L...原创 2019-07-28 18:35:38 · 38983 阅读 · 1 评论 -
C++编译、连接
Windows中我们常用vs来编译编写好的C和C++代码,vs把编辑器,编译器和调试器等工具都集成在这一款工具中。linux下,通常我们使用vim编辑器,然后用gcc和g++编译、链接生成可执行程序。我们很难说 C++ 拥有独立的编译器,例如 Windows 下的微软编译器(cl.exe)、Linux 下的 GCC 编译器、Mac 下的 Clang 编译器(已经是 Xcode 默认编译器,雄心...原创 2019-07-28 18:26:37 · 1704 阅读 · 0 评论 -
C++ extern/static/const区别与联系
在讨论全局变量之前我们先要明白几个基本的概念:1、编译单元(模块): 在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌 入式下做开发工作的话,那么你...转载 2019-07-25 22:04:32 · 452 阅读 · 0 评论 -
Protocol Buffers动态自描述、反射(C++版)
1. 人人都爱Protocol Buffers1.1 Protocol Buffers(PB)是什么?Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data –think XML, but smaller, ...转载 2019-07-20 17:30:34 · 2998 阅读 · 0 评论 -
C++之字符串
最近遇到一个C++的项目,准备着手学一些C++的知识。由于本人大部分的C语言知识都已经还给了老师(什么指针的指针...),加上多年以来一直从事java相关的开发,看了一天之后,发现C++这个坑真是大,没有速成,只能一点一点啃。这篇文章就记录一下刚遇到的字符串问题。开始上代码:#include <stdio.h>class Student {public: ...原创 2019-07-17 22:31:35 · 646 阅读 · 0 评论