自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 (gdb) n Cannot find bounds of current function

GDB 调试出现错误出现这样的错误,并产生 segment fault;0x00008766 in ?? ()(gdb) nCannot find bounds of current function我遇到的问题是因为动态库链接错误而导致的,解决方案如下:但当遇到这个问题的时候,我继续单步调试,但是当遇到某个函数的时候我发现当我使用 s 命令单步调试的时候却没法进入该函数,会出现这样的错误:Cannot find bounds of current function所以这个时候我们应该明白

2022-06-04 15:28:18 4261 1

原创 Linux常用命令总结

文章目录1.1 查看磁盘空间大小命令:(1)查看当前文件夹下各个文件占用的磁盘空间的大小,并进行排序(2)查看当前磁盘的占用空间可用空间等(3)查看当前文件夹占下的文件一共S用多少空间(4)磁盘被占满但是实际上却找不到占用磁盘的文件1.2 后台任务(1)启动后台会话命令(2)退出一个后台会话命令(3)查看当前启动了那些后台会话(4)回到后台回话状态(5)终止后台会话(6)清除 dead 会话1.3 查看进程和杀死进程(1)查看某个进程的进程号,例如 mysqld server(2)终止某个进程1.4 Vim

2022-05-28 11:03:05 458

原创 g++ 编译,GDB调试时发生这样的问题(No debugging symbols found in xxxx)

GDB 调试C++程序,出现 **(No debugging symbols found in xxxx)**这样的语句,并且无法在程序上打断点等。出现 (No debugging symbols found in xxxx) 这样的问题,一般有如下两种情况:编译的时候没有在 gcc 命令中加上 -g 选项,导致可执行文件中没有调试信息;编译的是 C++ 程序,而且用的是 Makefile 工具,但是 Makefile 程序中用的变量为编译 C 语言程序的变量。如下:当用 Makefile 编

2022-01-08 10:28:34 3057

原创 C++面试题合集

C++面试题1.大端存储和小端储存?2. Virtual 关键字的作用 构造函数和析构函数能不能定义为虚函数?3. extern “C”1.大端存储和小端储存?大端模式: 数据的高字节保存在内存的低地址中。小端模式:高字节保存在内存的高地址中。总结起来就是小端存储方式中数据较高字节的放在储存器的较高的地址位置,数据的较低的字节放在较低的存储器位置。而大端存储方式则是数据较高的字节存放于存储器较低的地址中。如下图中:应用场景: socket编程中网络字节序一般是大端存储,一般x86、ARM架构

2021-11-18 21:41:11 7179 3

原创 C语言数组或者枚举类型初始化时出现宏定义和包含头文件的奇怪语法

最近在看一个开源项目的源代码,遇到这样的语法。unsigned int md_opmask[OP_MAX] = { 0, /* NA */#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,O3,I1,I2,I3,I4) 0,#define DEFUOP(OP,NAME,OPFORM,RES,FLAGS,O1,O2,O3,I1,I2,I3,I4) 0,#define DEFLINK(OP,MSK,NAME,SHIFT,MASK) MASK,#

2021-11-02 17:51:13 815

原创 2021-10-18 python 操作 excel 表格 画图等

由于最近参加建模比赛需要用到 python 做一些辅助,因此在这里将数学建模中常用的 pyhton 辅助代码记录一下!python读取 excel 数据#打开一个excel表格对象import xlrdworkBook = xlrd.open_workbook(path)#两种方式获取 excel 中的 sheetsheet1 = workBook.sheet_by_index(0)sheet1= workBook.sheet_by_name('Sheet1')#获取sheet名称、行数、列

2021-10-18 21:49:36 473

原创 C/C++中关于宏定义中使用 # 和 ## 的作用

最近在阅读redis源码,遇到这样的宏定义代码#define __str(s) #s,在以前并没有看到过这样的宏定义方式,因此就查阅资料对此类特殊的宏定义进行一个总结。’ # ’ 在宏定义中的使用将参数设置转换为字符串,即给参数的加上 " " ;#include<stdio.h>#define __str(s) #sint main(){ char *str = __str(hello world!); printf("%s\n",str); return 0;}上述

2021-10-10 22:01:28 321

原创 Linux执行sh脚本报错: Syntax error: Bad fd number

今天再用chronos分析的WCET的时候,出现这样一个错误:: Syntax error: Bad fd number这个错误是执行sh脚本时报的错误,而且是打开文件的时候的发生的错误。解决方案:经过查阅资料得知,有可能是sh链接到了dash,而非bash,因此只需要检查链接情况即可。执行命令ls -l /bin/sh结果:如果得到以上的结果,则继续执行命令:sudo mv /bin/sh /bin/sh.origsudo ln -s /bin/bash /bin/sh再次检

2021-09-27 15:41:38 6941 1

原创 C/C++中位运算在实际中的应用

位运算在C/C++语言中经常用到,记录一下位运算在实际中常用的类型。1.将摸个整数的特定位置清零或者置为1使用安位运算与运算,按位与的两个二进制均为一则结果为一,否则结果为0。i)代替布尔类型的数组按位与操作最常用的就是用整数来代替 vector<bool>类型的数组,如下的代码:...

2021-09-24 17:07:01 333

原创 SourceInsight解决中乱码问题,python脚本批量实现文件的编码转换

SourceceInsight用于源码的阅读是非常方便的,但是会出现中文乱码的问题,进过查询得知SourceInsight默认的编码额为ANSI编码格式,因次我们常用的utf-8编码方式对于中文的注释便会乱码,网上给出的很多解决方法我都尝试了,似乎用处并不大。但是手动的将文件编码格式转换为ANSI的方式可以解决中文乱码的问题,鉴于很多源代码的文件数量庞大,因此,我写了一个python脚本对文件的进行批量编码格式转换。你只需要将主函数中的目录改为你的源码所在的目录,然后运行脚本便可以了。import os

2021-08-14 17:35:14 572

原创 C++ 继承、多态关系中的赋值运算符的重载、=operator()

文章目录1.异形赋值2.dynamic_cast解决异形赋值问题3.抽象基类解决异形赋值问题1.异形赋值操作符的重载是非常有用也是非常常见的,但是当涉及到继承和多态时情况可能就比较复杂了。对于多态,则一般都会涉及到虚函数重载,而我们在继承体系中如果重载赋值运算符则需要考虑对父类的赋值。假设有如下的继承体系:Animal是Dog和Cat的父类,则我,我们可以写出如下所示的代码:class Animal {public: Animal(std::string name_ = "animal

2021-06-13 17:26:56 1532

原创 C++ String的引用计数、写时复制 的实现 《More Effective C++》

文章目录1.引用计数2.写时复制1.引用计数c++引用计数的可以节省内存,而且同时可以降低构建对象和析构的开销,所谓引用计数简单说来就是对各对象共享一份实体的数据,但是我们需要实现对该数据的引用的对象的记录,这样最后一个对象引用结束后能够安全的删除数据。用字符串举例,假设我们想要实现字符串的拷贝或者赋值,那么我们想要呈现的客户的是各自独立的字符串。如下:但是,对于计算机的内部实现而言,这样的方式显然出现了冗余存储的现象,那么我们期待计算机内部是这样实现的。这样所有的用户拥有的字符串都是同一个,

2021-06-10 09:43:04 461 1

原创 C++实现 原型模式(ProToType)

原型模式的意图便是通过已有的对象创建一个新的对象,创建的新的对象和原来的对象具有相同的属性,但是不具有形同的地址空间,也就是说创建的对象应该是深拷贝,而非简单的的拷贝指针。prototype一般主要包括三个方面:ProToType类:抽象基类,声名了克隆自身的接口ConcreteProToTepe(根据实际需求名称有所不同):继承并实现ProTotype中的相应的接口Client:调用接口实现克隆。结构模型:代码示例://抽象基类class ProToType {public:

2021-06-09 10:33:38 533

原创 C++ 工厂模式 类模板实现

工厂模式正如其名字一样,用于产生对象的,往往是用于代替new,特别是在多态继承体系中,利用工厂模式可以将对象的产生延迟到子类中实现,而我们只需要知道子类的名称即可得到一个该子类的对象。就象我是我们需要购买一台空调,但是我们只需要知道空调的品牌和参数即可,而不需要知道空调是具体通过什么方式生产出来的。下面就介绍一下几种不同的工厂模式,而工厂类则实现了生产的细节,仅是提供了接口。而对应于编程的实现,我们往往是实现抽象基类,通过继承实现接口的方式来实现即可。1.简单工厂模式...

2021-06-07 10:33:50 1600 2

原创 C++ 单例模式(singleton)

static实现单例模式是设计模式中最简单的设计模式,也是做容易实现的模式。所谓单例模式就是让某个类只能产生一个对象。那么在C++语言中该如何设计呢?用static关键字可以实现单例模式,因为static保证同时只有一个对象的产生。下面是单例模式的代码的static实现方式:class single_printer {public: void print(const string& str); static void test() { cout<<"

2021-06-05 11:41:25 322

原创 C++线程池

线程池1.任务队列2.可窃取任务的队列3.线程池的实现4.线程销毁代码来自 <<c++ Concurence in Action>>所谓线程池,就是一个由多个线程组成的数组或者队列,在相应的队列中不断取出任务进行执行。将多个线程此存放于一个数组中可以减少不断地产生和销毁线程带来的开销。下面便是一个由c++实现的线程池。更多的细节请参阅相关书籍。1.任务队列任务队列就是就是一个共享的队列,其需要实现线程的安全的访问,并且不能在访问时产生死锁。线程安全的队列可以参考文章:线程安

2021-06-02 10:56:29 3057 1

原创 C++并发编程----异常安全的并行算法(《C++ Concurrency in Action》 读书笔记)

1.accumulate//仿函数template<typename Iterator, typename T>struct accumulate_block{ void operator()(Iterator first, Iterator last, T& result) { result = std::accumulate(first, last, result); // 1 }};template<typename I

2021-05-17 16:05:59 238

原创 C++并发编程----并发代码的设计(《C++ Concurrency in Action》 读书笔记)

线程间的工作划分数据划分:第一组N个元素分配一个线程,下一组N个元素再分配一个线程,以快速排序为例,以此类 推:一项任务被分割成多个,放入一个并行任务集中,执行线程独立的执行这些任务,结果在会有主线 程中合并。递归划分一般来说每次递归产生一个新的进程对数据进行划分并处理操作,这样每递归一次,线程的数量将会翻一倍,线程数量将会呈现指数级的增长,但是当大量的线程产生时,将会导致大量时间和资源用于线程切换,因而导致程序的指向效果很差。一般会通过使用 std::thread::hardware_con

2021-05-11 17:34:38 189

原创 C++并发编程----无锁实现线程安全队列(《C++ Concurrency in Action》 读书笔记)

采用计数器的方式防止条件竞争。template<typename T>class lock_free_queue{private: struct node; struct counted_node_ptr { int external_count;//记录外部线程通过指针的引用 node* ptr; }; std::atomic<counted_node_ptr> head; std::atomi

2021-05-10 17:22:50 1037 5

原创 C++并发编程----实现线无锁线程安全的数据结构(《C++ Concurrency in Action》 读书笔记)

无锁线程安全的栈template<typename T>class lock_free_stack{private: struct node { std::shared_ptr<T> data; // 1 指针获取数据 node* next; node(T const& data_) : data(std::make_shared<T>(data_))

2021-05-07 15:32:50 559

原创 C++ 动态内存分配 new / delete、operator new、placement new

C++动态内存分配是一个较为复杂的环节,特别是容易发生内存泄露等问题,今天将不会讨论内存泄露的问题,今天仅是讨论关于c++ 中的new 表达式的相关内容。new / delete expression所谓的 new 表达式,就是我们做常用的用于分配动态对象的表达式,如下操作就是运用new表达式进行动态对象的分配。int* p = new int(1024);string* p1 = new string("一条舔狗!");string *p2 = new string[10];//将会待用3次,s

2021-05-06 16:07:23 207

原创 C++并发编程----利用锁实现线程安全的数据结构(《C++ Concurrency in Action》 读书笔记)

2021-05-01 10:22:45 650

原创 C++并发编程----原子类型(《C++ Concurrency in Action》 读书笔记)

文章目录std::atomic的相关操作本文为《C++ Concurrency in Action》 读书笔记,对其中的一些知识点进行总结。阅读这本书前建议先阅读《Effective C++》原子类型或者说是原子操作,在操作系统的学习中我们已经很熟悉了,原子操作可以保证一个操作的完整性,即要做完,要么不做,对于原子操作,其相应的操作顺序或者访问内存顺序一般是确定了的,因此一般原子操作不会引起数据竞争,C++中的原子操作有很多,还可以用模板将自定义的操作设置为原子操作。有的原子操作其实现方式用锁,而有的实

2021-04-28 20:41:07 766 1

原创 C++并发编程----同步操作(《C++ Concurrency in Action》 读书笔记)

文章目录使用同步操作简化代码使用“期望”的函数化编程本文为《C++ Concurrency in Action》 读书笔记,对其中的一些知识点进行总结。阅读这本书前建议先阅读《Effective C++》使用同步操作简化代码使用“期望”的函数化编程术语函数化编程(functional programming)引用于一种编程方式,这种方式中的函数结果只依 赖于传入函数的参数,并不依赖外部状态。快速排序 FP(函数化)模式版以下是对于快速排序的单线程实现方式:template<typena

2021-04-25 16:58:09 133 1

原创 C++并发编程----并发和同步(《C++ Concurrency in Action》 读书笔记)

文章目录条件变量构建线程安全队列std::future< > 、 std::shared_future< >本文为《C++ Concurrency in Action》 读书笔记,对其中的一些知识点进行总结。阅读这本书前建议先阅读《Effective C++》条件变量std::condition_variable 和 std::condition_variable_any 。这两个实现都包含 在 < condition_variable > 头文件的声明中。两者都

2021-04-25 15:31:07 182

原创 C++并发编程----共享数据(《C++ Concurrency in Action》 读书笔记)

学习过操作系统我们应该知道对于共享数据的访问,以及同步和异步数据的操作。在多线程的编程中,我们需要小心对共享数据的使用。

2021-04-24 14:41:18 228

原创 C++并发编程---线程的管理(《C++ Concurrency in Action》读书笔记)

《C++并发编程》(C++ Concurrency in Action)读书笔记这本书中用到很多的高级用法,如RAII等手法,因此,看这本书之前建议先阅读《Effective c++》1.线程的启动、等待、分离。启动C++中的线程的启动方式和Linux中的启动方式相似,但是启动参数减少了很多。仅需传入线程初始化函数(可调用对象),以及相应的参数即可。class background_task { public: void operator()() const { do_somethin

2021-04-22 17:18:55 146

原创 《More Effective C++》尽量提供默认构造函数

如果一个类没有默认构造函数那么他的使用将会有很多的限制,诸如不能使用动态数组存放其对象,以及很多的模板都将不能使用高该函数。这样一个函数,表示某个设备,他不能提供默认构造函数,因为每个设备都必须具有一个设备ID。class EquipmentPiece {pulic: EquipmentPiece(int IDNumber); ... };通常这样的类的对象将不能使用数组存放,因为,对于数组存放的对象可能会调用该类的默认构造函数。EquipmentPiece bestPieces[1

2021-04-16 16:11:10 86

原创 《More Effecttive C++》不要用多态来处理数组

一个二叉搜索树的例子:class BST { ... }; class BalancedBST: public BST{...};有这样一个函数,他能打印BST的对象:void printBSTArray(ostream& s, const BST array[], int numElements) { for (int i = 0; i < numElements; ) { s << array[i]; }//假设重载了<<运算符 }

2021-04-16 10:38:02 122

原创 GDB 调试笔记

1.使用方式1.编译的命令中加上 -g 选项gcc -o hello hello.c -gg++ -o hello hello.cpp -g2.GDB的启动方式gdb filename, 其中filename为要调试的目标文件gdb filename core, 当文件运行产生core dump时,可以同时调试程序和core文件,一般需执行ulimit -c unlimited将core 文件设置为无限大。gdb filename pid,指定运行程序的进程ID, 并调试它。

2021-04-15 22:02:00 201

原创 Linux UDP常用接口

1、UDP连接方式2.recvfrom和sendto函数例子服务器代码:#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <arpa/inet.h>int main(int argc, const

2021-04-15 15:43:43 169

原创 shutdown 函数的操作

2021-04-15 11:16:08 117

原创 Linux TCP连接常用接口

文章目录网络字节序接口1、网络字节序转换函数:2、字节操纵函数(初始化):3、inet_aton、inet_addr、inet_ntoa4、inet_pton、inet_ntopTCP套接字编程1、TCP连接过程2、socket接口3、connect 函数4、bind函数5、listen函数6、accept函数实例代码网络字节序接口1、网络字节序转换函数:-----------------------2、字节操纵函数(初始化):3、inet_aton、inet_addr、inet_ntoa

2021-04-13 16:38:03 139

原创 Linux网络编程 ---TCP的连接的建立

文章目录网络字节序接口1、网络字节序转换函数:2、字节操纵函数(初始化):3、inet_aton、inet_addr、inet_ntoa4、inet_pton、inet_ntopTCP套接字编程1、TCP连接过程2、socket接口3、connect 函数4、bind函数5、listen函数6、accept函数实例代码网络字节序接口1、网络字节序转换函数:-----------------------2、字节操纵函数(初始化):3、inet_aton、inet_addr、inet_ntoa

2021-04-13 16:30:14 178

原创 《Effective C++》条款46:需要类型转换时将模板定义为非成员函数

条款 24 中,我们说到对于一个类来说,我们如果想要使用隐式类型转换(利用非explicit构造函数),我们需要将相应的韩叔叔定义为非成员函数。但是如果现在我们将条款24中的例子模板化,那么这种隐式类型转换将不会成立。现在我们象条款24中的方式将两个实数进行乘法运算,这时我们的程序将会导致编译错误。因为当我们尝试进行隐式类型转换时,我们首先许需要知道参数的类型,但是我们们传入的参数为一个 int类型,而我们的模板函数接受 Ratianal<T>类型的参数,来推断T的类型,这时,传入的参数

2021-04-11 20:52:36 155 1

原创 《Effective C++》条款 45 成员函数模板接受所有兼容类型

智能指针能够很好的支持类型转换,以及多态的特性,那么智能指针是怎样做到和普通指针一样的功能的?答案是利用成员函数模板。如下代码:我们希望上述的代码能够通过编译,也就是说我们的智能指针类需要实现一个对应版本的拷贝构造函数以及复制运算符重载,但是我们的基类有很多,因此对于这样的要求,相应的拷贝构造函数和复制运算符都应该是模板函数。因此智能指针的基本结构应该如下:但是,我们的类型转换中并不允许将基类类的指针转换成为派生类,因此,我们应该有有效的机制防止这样转换发生 ,显然我们利用原始指针的转换关系就

2021-04-09 11:21:00 76

原创 《Effective C++》条款44 将与参数无关的代码抽离

模板编程可以节省时间和避免代码重复,但是有时候使用模板却有可能导致代码膨胀,也就是当完成编译后,目标代码可能会很大,即使我们自己敲打出的代码看起来非常的间接。所以在使用模板编程的时候应该小心,如何避免重复将会还能重要。如下代码,便是矩阵,同时求矩阵的逆,现在如下的使用方式:上述的sm1和sm2将会被编译器认为是两个不同的类,因此,将会调用两个不同的函数invet,然而,事实上两个invert函数只有5和10两个参数不同,其他部分完全相同,因此这也就导致了代码膨胀的问题。为了解决上述的代码膨胀的问

2021-04-08 11:33:32 144

原创 《Effective C++》条款43:处理模板化基类内的名称

模板化的类是可以作为基类的,但是当我们将一个模板化的类作为基类,那么当我们使用该基类的中的成员方法时,需要显示的说明传入的模板参数中含有一个相应的方法可供调用。现有一个程序,表示要将信息发送给不同类型的公司,传输方式可以是加密传输也可以是直接传输,对于传输公司的选定,我们可以用模板指定。现在,我们想要在每次传输信息前和传输信息完成后记录日志信息,然后我们这样写代码:上述的sendClear(info)是来自模板化基类的成员函数,但是这样将会是无法通过编译的,因为编译器在你给出具体模板参数的类型之前

2021-04-07 11:25:56 147

原创 《Effective C++》了解typename的双重意义

在模编程中,可以说关键字class和typename是等效的,但是typename还有其他的用法,typename可以用于指明模板内的为类类型。对于以下的函数模板,假如是这样做设计的。对于编程的人而言,我们清楚的知道```C::const_iterator *x`` 是一个指向迭代器的指针,但是对于编译器则不然,因为如果当C的类中有静态变量为const_iterator,或者有一个局部变量为X的变量,那么上述的语句将会理解为两个数相乘。对于依赖于模板参数的类类型参数,我们称为嵌套从属类,也就是形如`

2021-04-06 15:39:56 98

原创 《Effective C++》条款 37:绝不重新定义继承而来的缺省参数值

我们都知道虚函数的调用是动态绑定的,但是,对于虚函数中的默认参=参数的值确实静态绑定的,什么意思?见代码:一个表示形状的类,其中颜色可以是默认的参数也可以是自主选择的颜色。对于以下的继承体系而言考虑如下的多态使用方式:这时将会出现问题了,对于Retangle,我们对其虚函数draw指定的默认参数为Green,但是如果我们用多态的方式去调用draw函数。这时 draw() 函数将会调用基类中的默认参数,因为对于虚函数的默认参数是动态绑定的,这样可以提高编译期运行效率。所以我们对于虚函数的默认

2021-04-01 10:12:51 134

空空如也

空空如也

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

TA关注的人

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