随笔分类 - C++
摘要:Windows上 以CRT为例。Windows上的动态库版本的CRT库:ucrtbase.dll,其对应的导入库是 ucrt.lib。 在cl命令行或者cmake脚本时,都是写的ucrt。 即:对于windows上的动态库,在链接指令中实际要写的是导入库的名字!我会产生这个问题,是不是因为大多数时候
阅读全文
摘要:充分理解C/C++重要概念:运行时库 什么是运行时库 C/C++程序运行过程中,会需要链接实现标准库函数的库,以及和操作系统交互的库。这些库组成了运行时库。 运行时库的作用: 实现语言标准库(堆内存分配与回收、线程原语、静态对象的构造和析构、字符串、数学时间、输入输出、异常处理、虚函数RTTI等)
阅读全文
摘要:C++的3种继承方式 在 C++ 中,继承方式(public、protected、private)决定了基类成员在派生类中的访问权限,以及派生类对象对基类成员的访问权限。正确选择继承方式是实现封装、复用和多态的关键。以下是三种继承方式的适用场景及详细说明: 一、核心规则:继承方式对访问权限的影响 先
阅读全文
摘要:一个通过强制使用符号来避免链接器忽略符号的方法 虽然如果链接器在链接库时将符号忽略了一般是由于设置了 --as-needed 选项,或者编译时的优化太激进了,所以一般还是要去分析编译和链接过程来解决。 但如果确实不好解决,可以通过强制使用这些被忽略的符号的方式来让链接器不要忽略: // 对所有被忽略
阅读全文
摘要:记一次因对象构造顺序引发的踩内存问题 背景与现象 template<typename T> struct range_reader { range_reader(const T &low_bound, const T &upper_bound) : low_(low_bound) , high_(u
阅读全文
摘要:跨平台coredump生成器——breakpad 介绍 google/breakpad: Mirror of Google Breakpad project breakpad是google开发的一个跨平台C/C++ dump捕获开源库,崩溃文件使用微软的minidump格式存储,也支持发送这个dum
阅读全文
摘要:C语言一个内存分配引发的问题——指针长度截断 问题现象 #include <stdio.h> #include <string.h> int main() { char* str = NULL; str = (char*)calloc(1, 5); fprintf(stderr, str); ret
阅读全文
摘要:对象切割(Object Slicing)是 C++ 中的一个常见问题,发生在对象拷贝时,尤其是在涉及基类与派生类之间的赋值或传递时。其结果是派生类对象被转换为基类对象时,丢失了派生类中的特定信息或成员,导致派生类的行为不能被完整地保留。 何时会发生对象切割 对象切割通常在以下几种场景中发生: 值传递
阅读全文
摘要:C++轻量级RPC框架的设计与实现 https://github.com/Meha555/tinyrpc 项目概述 RPC是远程过程调用(Remote Procedure Call)的缩写,可以通过网络从远程服务器上请求服务(调用远端服务器上的函数并获取返回结果)。简单来说,客户端程序可以像调用本地
阅读全文
摘要:C++20 span 概念 std::span<T, Extent> 类模板就是一块连续内存的视图(类似于 std::string_view ),简化原本C风格的基制指针+长度的使用方式。 模板形参: T :元素类型;必须是完整对象类型且非抽象类 Extent :连续序列中的元素数,默认为动态长度(
阅读全文
摘要:g++链接报错:undefined reference to typeinfo of xxx 问题背景 在项目中遇到了这样一个问题:C++文件编译都OK,但链接的时候报错:undefined reference to typeinfo for xxx。 std::typeinfo 是C++中的RTT
阅读全文
摘要:C++ 返回值类型推导 前言 C++ 中获取函数签名可以很简单地用 decltype(函数名) 来获得,但是这样无法直接提取出返回值类型。 有时我们需要获取函数或可调用对象的返回值类型,以便进行后续的操作,在泛型编程中很常用,特别是当不同的参数集的结果类型不同时。 头文件 <type_traits>
阅读全文
摘要:C++对象析构顺序问题——由QObject::desroyed展开的思考 C++析构函数执行的顺序是最先执行继承链最末端的子类的,最后执行顶层的基类的。 而 QObject::destroyed(QObject* obj = nullptr) 信号在 Qt 文档中说是“在 obj 被完全析构时之前立
阅读全文
摘要:C++获取类型名称的技巧 在某些情况下,我们需要明确知道编译器推导出的类型,特别是复杂类型。这些类型信息对于调试、优化和确保代码正确性非常重要。 技巧1:在编译期确定类型 主要用于模板编程和泛型编程时。 在编译期间确定类型的一种方法是通过引发编译错误,查看编译器的错误信息。 示例:如何通过引发编译错
阅读全文
摘要:C++11 mem_fn成员指针包装器 介绍 函数模板 std::mem_fn 生成成员指针的包装器对象,用于存储、复制及调用成员指针。指向对象的引用和指针(包括智能指针)都可以在调用 std::mem_fn 时使用。 注意: std::mem_fn 只能包装 public 的成员指针,不能包装全局
阅读全文
摘要:提高C++编译速度 Build Performance Insights - Crascit 如何分析和提高大型项目(C/C++)的编译速度? - 知乎 (zhihu.com) 以上链接提供了提高编译速度的方案,以及如何检查是编译哪个文件花的时间最长。 实践下来,我采用的方案是直接换用 ninja
阅读全文
摘要:C++11 用户定义字面量 C++11引入了一项功能,称为用户自定义字面量(user-defined literals),它允许程序员定义自己的字面量后缀,以扩展现有的字面量语法。 内置字面量 C++ 自带4种字面量: 整形 123 浮点型 12.3 字符 '1' 字符串 "123" 字面量又可添加
阅读全文
摘要:C++ 命名空间 命名空间用于解决合作开发时的名字冲突问题。 1、namespace关键字 用于定义命名空间。 //定义命名空间 namespace name{ //variables, functions, classes } //使用命名空间内的成员 name::成员名; name是命名空间的名
阅读全文
摘要:C语言预处理和宏 C语言宏的定义和宏的使用方法(#define) (biancheng.net) C/C++ 宏编程的艺术 - 知乎 (zhihu.com) 预处理命令 预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处
阅读全文
摘要:C++模板——待决名 概念 参考官方文档: 待决名 - cppreference.com 为什么C++模板类的非限定名、待决名名字查找不考虑待决基类? - 知乎 (zhihu.com)【需要较多的前置知识】 简单来说: template<typename T> struct X { void f_x
阅读全文

浙公网安备 33010602011771号