自由技艺
资深AI算法和C++软件工程师,专注于下一代分布式AI系统,曾就职于华为、百度,北邮土著博士
请关注知乎同名账号
展开
-
C++ 段错误定位
4)./you_exe 运行程序, 假如出现段错误:Segmentation fault (core dumped ), 那么在当前执行该程序的目录就会产生默认名为"core"的文件。(3)gcc编译你的程序:gcc your_program.c -o you_exe -g, 一定要加“-g” 选项。(2)执行命令:ulimit -c 2048, 2048是你指定的core文件大小,可以根据自己的需要修改。(5)gdb --core=core 调试core。...原创 2022-08-03 17:15:56 · 668 阅读 · 0 评论 -
设定 CPU 核心运行指定线程
https://blog.csdn.net/qq_26697045/article/details/89457241原创 2022-03-29 18:59:35 · 630 阅读 · 0 评论 -
C++ 模板元编程系列专题 3:模板偏特化
1、模板 + 全特化模板,代表了一种泛化的语义。显然,既然有泛化语义,就应当有特化语义。特化,使得我们能为某些特定的类型专门提供一份特殊实现,以达到某些目的。特化分为全特化与偏特化。所谓全特化,即一个“披着空空如也的template <>的普通函数或类”#include <iostream>#include <iomanip>#include <string>#include <random>#include <chrono>原创 2022-03-29 18:25:35 · 458 阅读 · 0 评论 -
C++ 并发编程:std::promise/future、std::async、std:: packaged_task
1、std::promise 和 std::futurefuture 和 promise 的作用是在不同线程之间传递数据,而且支持泛型的操作,使用起来更加方便。使用 future 和 promise 在线程之间获取数据的机制又是什么呢?假设线程 1 需要线程 2 的数据,则:线程 1 初始化一个 promise 对象和一个 future 对象,promise 传递给线程2,相当于线程 2 对线程 1 的一个承诺;future 相当于一个接受一个承诺,用来获取未来线程 2 传递的值;线程 2 获取原创 2022-03-29 18:24:01 · 1386 阅读 · 0 评论 -
C++11 bind 和 placeholders 用法
bind 这个东西是很鸡肋的,因为已经有了 lambda 表达式了,但是在 C++ 11 中 lambda 无法处理类型多态,bind可以;lambda 也不支持移动语义,bind 可以。可喜的是,C++14 已经解决了上述两个问题,所以 bind 也就可以丢弃了。1、std::placeholders占位符 std::placeholders 是 C++ 11 的新特性,它一般和 bind 一起用。placeholders 定义如下:namespace placeholders { exter原创 2022-03-29 18:20:28 · 2041 阅读 · 0 评论 -
C++ std::function和函数指针相比有啥区别吗?
std::function 是一种通用、多态的函数封装,它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作,它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的),简而言之,std::function 就是函数的容器。配合上 bind 能够解决成员函数指针跟随类的弊端,比传统的函数指针更加强大。所以,写 C++ 代码的时候,不要再写什么函数指针了!先来看一个成员函数指针的例子:class Base;typedef void(Base::*Fu原创 2022-03-29 18:18:07 · 1549 阅读 · 0 评论 -
发布 - 订阅
#include <iostream>#include <vector>class ISubscriber;class IPublisher;class IBroker;// 订阅者的接口类class ISubscriber {public: // 向代理进行订阅 virtual void subscribeToBroker(IBroker * ptr, std::string topic) = 0; // 当代理收到发布者的通知,原创 2021-11-16 13:11:23 · 286 阅读 · 0 评论 -
c++ 二进制ip地址转为10进制ip地址
void getCharIpAddr(uint32_t ipAddress) { const int NBYTES = 4; uint8_t octet[NBYTES]; char ipAddressFinal[16]; for(int i = 0 ; i < NBYTES ; i++) { octet[i] = ipAddress >> (i * 8); } ...原创 2021-09-17 16:37:19 · 628 阅读 · 0 评论 -
CS 优质课程
http://cs241.cs.illinois.edu/coursebook/Synchronization#barriers原创 2021-09-07 13:39:27 · 292 阅读 · 0 评论 -
c++多线程
#include<thread>#include<mutex>std::thread t(func); //无参数函数std::thread t(func, parameter) //带参数函数std::thread t(&class::func, this, parameter) //类内函数新起线程 第一个参数类函数指针,第二个参数对象指针//如果要参数要被改变。采用std::reft.joinable();t.j原创 2021-07-20 14:53:21 · 139 阅读 · 0 评论 -
C 语言打印函数轨迹
#include "common.h"#include "module1.h"#include "module2.h"#include <stdio.h>#include <stdarg.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <pthread.h>#define PATH_MAX 256#define LINE_CHA原创 2020-09-09 15:39:18 · 201 阅读 · 0 评论 -
iCache 优化 - 重排函数代码段
#!/usr/bin/python# -*- coding: UTF-8 -*-import sysimport osimport refunc_real_addr = {}func_text_size = {}so_base_addr = {}def record_func(so_name, s_func, h_addr, size): global func_real_addr global func_text_size global so_base_add原创 2020-09-09 11:01:19 · 209 阅读 · 0 评论 -
extern inline!!!
本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了。所以inline关键字不应该出现在函数声明中,原创 2020-09-14 20:09:10 · 102 阅读 · 0 评论 -
Effective C++ 读书笔记(一):让自己习惯 C++
条款01:视 C++ 为一个语言联邦CObject-Oriented C++Template C++STL条款02:尽量以const,enum,inline替换 #define对于单纯常量,最好以 const 对象或 enums 替换 #defines对于形似函数的宏(macros),最好改用 inline 函数替换 #defines条款03:尽可能使用 const将某些东西声明为 const 可帮助编译器侦测出错误用法。const 可被施加于任何作用域内的对象、函数参数、函数原创 2020-06-30 16:23:31 · 175 阅读 · 0 评论 -
C++ 模板元编程
编程语言特性假如将模板当成一门全新的编程语言。一门编程语言最少应该具有什么特性呢?需要有基本的数据类型,比如数字、字符串、布尔值等。需要某种方法,将基础类型组合起来,表达更高级的概念。比如 C 语言中的 struct, 就是一种组合方法。数组和字典也是组合方法。需要流程控制。典型的是顺序、分支、循环。需要输入和输出。还需要什么语言特性呢?已经没有了,具备上述的特性,基本就可写出任何程序。下面按照这个顺序,描述一下模板元编程。基本数据类型数字数字可分为整数和小数。怎么用模板类型表示整数呢?原创 2020-06-30 16:09:42 · 595 阅读 · 0 评论 -
C++单例模式
只有类的对象才能调用非静态成员函数#include <iostream>#include <ostream>#include <string>class Singleton {private:public: int m_age; std::string m_name; static Singleton* m_single;public: Singleton(){} static Singleton* GetSingl原创 2021-03-25 22:56:00 · 94 阅读 · 0 评论 -
手写String类并解释拷贝构造函数
class String {private: char* m_Buffer; unsigned int m_Size;public: String(const char* string) { m_Size = strlen(string); m_Buffer = new char[m_Size + 1]; memcy(m_Buffer, string, m_Size + 1); m_Buffer[m_Siz原创 2021-03-25 10:02:26 · 167 阅读 · 0 评论 -
C++ unordered_map 一种初始化技巧
enum State { STATE_INITIAL, STATE_INT_SIGN, STATE_INTEGER, STATE_POINT, STATE_POINT_WITHOUT_INT, STATE_FRACTION, STATE_EXP, STATE_EXP_SIGN, STATE_EXP_NUMBER, STATE_END, ...原创 2020-09-02 10:03:48 · 1857 阅读 · 0 评论 -
你真的了解int* p 吗?
namespace {int a[] = {100, 200, 300, 400, 500};};int main(){ int *p = (int*) (&a + 1); cout << *(p - 1) << endl; // 500}原创 2020-05-21 10:19:52 · 146 阅读 · 0 评论 -
多态 + 默认函数参数
namespace {class A { public: virtual void f(int a = 100) { cout << "base " << a << endl; }};class B : public A { public: virtual void f(int a = 200) { cout << "derived " << a <原创 2020-05-21 09:57:51 · 281 阅读 · 0 评论 -
再品static
类的静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)静态成员为父类和子类共享。但为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响...原创 2020-05-13 17:43:35 · 122 阅读 · 0 评论 -
拷贝构造函数的几个细节
为什么拷贝构造函数必须是引用传递,不能是值传递?会引起无限循环。当类中数据成员有指针时,必须要用深拷贝什么情况下必须定义拷贝构造函数?当类的对象用于函数值传递时(值参数,返回类对象),拷贝构造函数会被调用。如果对象复制并非简单的值拷贝,那就必须定义拷贝构造函数。例如大的堆 栈数据拷贝。如果定义了拷贝构造函数,那也必须重载赋值操作符。以下函数哪个是拷贝构造函数?X::X(const X&); //拷贝构造函数X::X(X); X::X(X&, int a=1.原创 2020-05-13 15:23:58 · 195 阅读 · 0 评论 -
你真的了解namespace吗?
using 声明(using declaration)using std::cout;using 声明可以出现在全局、局部、类的作用域和名字空间中。在类作用域中using声明只能引用基类成员;using 指示(using directive)using namespace std;using 指示可以出现在全局、局部的作用域和名字空间中,不会出现在类的作用域中;...原创 2020-05-13 15:09:16 · 171 阅读 · 0 评论 -
C++ Lambda避免使用默认捕获模式
auto func(){int addend = 5;static int baseValue = 3;return [=]() { // 实际上只复制了addend++baseValue; // 修改会影响静态变量的值return baseValue + addend;};}auto func(){int addend = 5;static int baseValue = 3;return [addend, baseValue = baseValue]() mutable {原创 2020-05-12 20:09:46 · 1153 阅读 · 1 评论 -
C++模板别名
template class Tusing MyAllocatorVector = std::vector<T, MyAllocator<T>>;MyAllocatorVector<int> data;禁止使用std::move操作const对象void Func(int i){auto p = new int {7}; // 不好: 通过 new 初始化局部指针auto q = std::make_unique<int>(9); // 好:原创 2020-05-12 20:01:09 · 203 阅读 · 0 评论 -
C++/C语言中的未定义行为
什么是未定义行为简单地说,未定义行为是指C语言标准未做规定的行为。编译器可能不会报错,但是这些行为编译器会自行处理,所以不同的编译器会出现不同的结果,什么都有可能发生,这是一个极大的隐患,所以我们应该尽量避免这种情况的发生。特征包含多个不确定的副作用的代码的行为总是被认为未定义。(简单而言, “多个不确定副作用” 是指在同一个表达式中使用导致同一对象修改两次或修改以后又被引用的自增, 自减和赋值操作符的任何组合。这是一个粗略的定义)...原创 2020-05-12 19:42:50 · 756 阅读 · 0 评论 -
C++避免使用const_cast
const_cast用于移除对象的const和volatile性质,使用const_cast转换后的指针或引用来修改const对象,行为是未定义的。class Foo {public: voif Func() { }}const Foo f;Foo* p = const_cast<Foo*>(&f);p->Func(); // 未定义行为...原创 2020-05-12 19:27:42 · 636 阅读 · 0 评论 -
C++将派生类赋值给基类终结篇
向上转型后通过基类的对象、指针、引用只能访问从基类继承过去的成员(包括成员变量和成员函数),不能访问派生类新增的成员。基类指针指向派生类对象如果访问的是基类中的虚函数,且派生类中也实现了该函数,则访问的是派生类中的实现namespace {class Base {public: virtual void Display(const std::string &text = "Base!") { std::cout << text <<.原创 2020-05-12 18:29:44 · 619 阅读 · 0 评论 -
C++零散知识点汇总
静态成员函数不能直接访问类的非静态成员,但是可以通过外部传入对象指针来访问类的非静态成员。静态成员函数的调用可以通过类作用域,类的对象以及类对象指针的方式调用。static成员的所有者是类本身,但是多个对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化;静态成员不能在类定义里边初始化,只能在class body外初始化;静态成员仍然遵循public,private,pro...原创 2020-04-27 19:19:21 · 263 阅读 · 0 评论 -
C++ 内存之终结篇
bss段确实不占用可执行文件空间,但文件装载后在内存中还是会占用相应大小的空间的,这种处理方法就是为了减少可执行文件大小,避免不必要的开销。但严格地说,bss段也还是占用一些可执行文件空间的,比如在段表中有bss段的描述,在符号表中有bss段内相关变量的描述,但这里就不是同一个概念了。被const修饰的未初始化的全局变量和局部静态变量都会占用可执行文件空间。“__bss段在可执行文件中没有任...原创 2020-04-27 15:05:38 · 254 阅读 · 0 评论 -
C++ 类中数据成员初始化顺序
成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。类中const成员常量必须在构造函数初始化列表中初始化。类中static成员变量,只能在类内外初始化(同一类的所有实例共享静态成员变量)。初始化顺序基类的静态变量或全局变量派生类的静态变量或全局...原创 2020-04-26 14:55:01 · 426 阅读 · 0 评论 -
基类和派生类的构造函数,隐式调用与显式调用
通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种。所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数,这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式,就是在派生类的构造函数中指定要调用的基类的构造函数,并将派生类构造函数的部分参数值传递给基类构造函数。注:除非基类有默认的构造函数,否则必须采用显式调用方式class A{...转载 2020-04-26 14:37:20 · 1145 阅读 · 1 评论 -
拷贝构造函数和赋值函数区别和联系
拷贝构造函数和赋值运算符的行为比较相似,却产生不同的结果;拷贝构造函数使用已有的对象创建一个新的对象,赋值运算符是将一个对象的值复制给另一个已存在的对象。区分是调用拷贝构造函数还是赋值运算符,主要是否有新的对象产生;关于深拷贝和浅拷贝。当类有指针成员或有动态分配空间,都应实现自定义的拷贝构造函数。提供了拷贝构造函数,最后也实现赋值运算符;对象不存在,且没用别的对象来初始化,就是调用了...转载 2020-04-26 14:15:32 · 1498 阅读 · 0 评论 -
C++ 默认参数构造函数
定义了缺省参数的函数后(包括构造函数和成员函数、普通函数),就不能再定义结构类似的重载函数了。否则,会产生二义性,编译器会报错;好处: 即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。尤其在希望对每一个对象都有同样的初始化状况时用这种方法更为方便;...原创 2020-04-26 09:48:53 · 386 阅读 · 0 评论 -
C++操作符重载
设计运算符重载的原则只能重载C++语言中已有的运算符,不可臆造新的。不能改变原运算符的优先级和结合性。不能改变操作数个数。不可声明为类属性。要符合该运算符的使用习惯。重载运算符函数的参数必须至少含有一个类类型操作数,不可以全是基本类型。...原创 2020-04-24 09:56:36 · 223 阅读 · 0 评论 -
C++ 结构体、联合体内存大小
结构体1. 每个成员相对于这个结构体变量地址的偏移量正好是该成员类型所占字节的整数倍。为了对齐数据,可能必须在上一个数据结束和下一个数据开始的地方插入一些没有用处字节。2. 最终占用字节数为成员类型中最大占用字节数的整数倍。3. 一般的结构体成员按照默认对齐字节数递增或是递减的顺序排放,会使总的填充字节数最少。联合体联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足...原创 2020-04-23 20:08:31 · 792 阅读 · 0 评论 -
C++内存问题终结篇
C++内存分区栈区:函数参数及局部变量,由系统自动分配释放;堆区全局/静态区:全局变量 + 静态变量,程序结束后由系统释放;字符串常量区代码区:程序的二进制代码;const类型的存储跟一般的变量没有区别,在外部定义的存储在全局数据区,static的存储在静态数据区,在函数内部定义的存储在栈,const跟非const存储上没区别,只不过是read only的。程序加载时的内存分布...原创 2020-04-23 20:01:42 · 142 阅读 · 0 评论 -
static_cast, dynamic_cast, const_cast, reinpreter_cast的区别?
static_cast与dynamic_cast区别:cast发生的时间不同,一个是static编译时,一个是runtime运行时;static_cast是相当于C的强制类型转换,用起来可能有一点危险,不提供运行时的检查来确保转换的安全性;dynamic_cast用于转换指针和和引用,不能用来转换对象 ——主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行...原创 2020-04-23 19:34:30 · 273 阅读 · 1 评论 -
C++类中数据成员初始化顺序
1.成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。2.如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。3.类中const成员常量必须在构造函数初始化列表中初始化。4.类中static成员变量,只能在类内外初始化(同一类的所有实例共享静态成员变量)。初始化顺序:• 1) 基类的静态变量或全局变量...原创 2020-04-23 19:34:19 · 1318 阅读 · 0 评论 -
C++ override 和 final 关键字
override的作用就出来了,它指定了子类的这个虚函数是重写的父类的,如果你名字不小心打错了的话,编译器是不会编译通过的;当不希望某个类被继承,或不希望某个虚函数被重写,可以在类名和虚函数后添加final关键字,添加final关键字后被继承或重写,编译器会报错。...原创 2020-04-23 19:34:09 · 262 阅读 · 0 评论