随笔分类 - B.1.1-C/C++ 基础
学习C/C++过程中整理的一些知识点。
摘要:在 Snowflake 算法中,通常包含以下几个部分来构造一个唯一的 ID: 时间戳(Timestamp):占据了 64 位 ID 中的高 41 位,用来表示生成 ID 的时间。通过时间戳的递增,保证了生成的 ID 是递增且唯一的。 数据中心 ID(Data Center ID):用于标识不同的数据
阅读全文
摘要:在C++中实现单例模式可以使用模板和C++11的特性来达到目的。下面是一个简单的示例代码: #include <iostream> template <typename T> class Singleton { public: static T& getInstance() { static T i
阅读全文
摘要:在CentOS 7上安装MariaDB,可以按照以下步骤进行: 配置MariaDB的yum源。可以选择使用MariaDB的官方yum源,这样可以方便地安装和更新MariaDB。根据所使用的Linux发行版和想安装的MariaDB的版本,选择合适的yum源地址。 安装MariaDB。使用yum命令进行
阅读全文
摘要:以下内容由 豆包 大语言模型生成,内容仅供参考: C++20 引入了一个新的标准库头文件 <barrier>,其中包含了对屏障(barrier)的支持。屏障是一种用于同步多个线程的同步原语,它允许线程在某个点上等待,直到所有线程都到达该点。 C++20 的 <barrier> 头文件提供了一个 st
阅读全文
摘要:在 C++ 中,system 是一个函数,通常定义在 <cstdlib> 库中,它允许程序调用操作系统的命令行解释器(如 Unix/Linux 中的 shell)来执行指定的命令。在 CentOS 7(一个基于 Linux 的操作系统)中,使用 system 函数可以执行几乎任何可以在命令行中运行的
阅读全文
摘要:使用valgrind 检查内存 --tool=memcheck 我们的可执行文件是 ./bin/thread_13,它有内存泄漏的问题,需要valgrind来检查分析。 将日志输出到 t13_memcheck.log 2>&1 是一个特殊的重定向,它会把标准错误(stderr,通常是错误消息)重定向
阅读全文
摘要:列表初始化(List Initialization)是C++11引入的一种新的初始化方式,它使用大括号 {} 来包围初始化器的值。这种初始化方式提供了更高的灵活性和安全性,特别是在处理聚合类型(如数组、结构体和类)以及在某些需要避免函数声明歧义的情况下。 下面我将详细讲解列表初始化的几个关键方面,并
阅读全文
摘要:不可以将 std::atomic<int> atomicInt(0); 改为 std::atomic<int> atomicInt = 0;。原因如下: 在C++中,对象的初始化与赋值是两个不同的操作,它们有不同的语义和用途。 初始化 (std::atomic<int> atomicInt(0);)
阅读全文
摘要:gprof:这是一个GNU的性能分析工具,主要用于分析程序的函数调用关系,以及每个函数的运行时间等。 Valgrind:这是一个用于内存调试、内存泄漏检测以及性能分析的开源工具集。其中,Valgrind的Callgrind工具可以收集程序运行时的函数调用信息,用于性能分析。 perf:这是Linux
阅读全文
摘要:这是一个base16 编码/解码 的方法。而且支持中文的编码和解码。 代码由chatgpt-3.5生成: #include <iostream> #include <string> const std::string base16 = "0123456789ABCDEF"; void Base16E
阅读全文
摘要:在这个单例模式的实现中,使用了静态局部变量来确保只有一个实例。 静态局部变量只会在第一次调用函数时初始化,并且在程序的整个生命周期内保持其值不变。 这意味着,无论多少次调用 getInstance() 方法,都只会在第一次调用时创建一个实例,后续的调用会返回同一个实例。 具体来说,在 getInst
阅读全文
摘要:template< class... Args >void emplace_back( Args&&... args ); (C++11 起)(C++17 前) template< class... Args >reference emplace_back( Args&&... args ); (C
阅读全文
摘要:`strcpy`和`memcpy`都是用于内存复制的函数,但它们之间有几个关键的区别: 1. **复制的对象**: - `strcpy`主要用于复制字符串,它将从源字符串的起始位置开始复制字符,直到遇到源字符串的空字符('\0'),然后将空字符也复制到目标字符串中,表示字符串的结束。 - `memc
阅读全文
摘要:在C++中,std::priority_queue 默认实现的是一个大顶堆(Max-Heap), 其中每个父节点的值都大于或等于其子节点的值。 然而,通过指定第三个模板参数为比较函数或函数对象,可以改变这一默认行为。 std::priority_queue<int, std::vector<int>
阅读全文
摘要:#include <iostream> #include <memory> class MyClass { public: MyClass() { std::cout << "MyClass constructed" << std::endl; } ~MyClass() { std::cout <<
阅读全文
摘要:std::ref() 是C++标准库 <functional> 头文件中的函数模板,用于将一个对象包装成一个引用包装器(reference wrapper)。引用包装器允许你在使用函数模板时传递对象的引用而不是拷贝对象本身。 下面是 std::ref() 的基本用法和解释: #include <io
阅读全文
摘要:获取当前时间戳 #include <iostream> #include <sys/time.h> int main(){ struct timeval tv; gettimeofday(&tv, NULL); auto count = tv.tv_sec * 1000ul + tv.tv_usec
阅读全文
摘要:在 C++ 中,仿函数是一种可以像函数一样调用的对象。 通过实现 operator(),你可以创建一个类或结构体,然后像函数一样使用它,这就是仿函数的概念。 当我们谈到仿函数时,通常是指定义了函数调用运算符 operator() 的类或结构体。 以下是两个简单的 C++ 仿函数示例,一个用于比较整数
阅读全文
摘要:记录一次异常的排查 // 这是yam-cpp源代码里面,YAML::LoadFile的方法 Node LoadFile(const std::string& filename) { std::ifstream fin(filename); if (!fin) { throw BadFile(file
阅读全文
摘要:C++编译的时候,遇到了这个错误。 翻译这个错误就是,将一个 引用类型,绑定到了一个 常量类型上面。这个是不允许的。 In file included from /home/henry/workspace/henry-sylar/tests/test_config.cpp:1: /home/henr
阅读全文