
C++进阶
文章平均质量分 68
风贰中
这个作者很懒,什么都没留下…
展开
-
C++ 线程池
线程池(Thread Pool)是一种预先创建并维护若干线程的并发编程模型,所有任务提交后由池内线程处理,避免频繁创建销毁线程带来的系统开销。资源复用:复用固定数量的线程处理大量短时任务控制并发:防止线程数无控制增长导致内存耗尽或CPU调度崩溃任务排队:合理调度和管理任务执行顺序。原创 2025-04-18 01:07:25 · 478 阅读 · 0 评论 -
C++ 链接过程中如何使用符号表
符号表是编译器和链接器用于记录和查找程序中各种符号信息的数据结构。一个符号可能表示变量、函数、全局数据、常量、段等内容。符号名类型(如函数、变量、段等)存储类别(本地、全局、弱符号等)符号的地址或偏移量所属段(如.text.data.bss定义或引用状态在使用 ELF 格式的系统(如 Linux)中,每个目标文件通常会包含一个.symtab段,保存该目标文件中所有符号的详细信息。程序编译后会生成一个或多个目标文件(Object Files)。这些目标文件可能包含对其他文件中符号的引用。原创 2025-04-18 01:04:46 · 285 阅读 · 0 评论 -
c++中cpu-绑核
在C++程序中进行CPU核心绑定(也称为CPU亲和性设置),指的是将程序的线程或进程绑定到特定的CPU核心上运行。这种做法可以带来一系列的好处,是实现提高cpu缓冲命中率,减少上下文切换开销重要解决方案。这是 Linux 系统上最常用的绑核方法。二、使用 taskset命令行工具(linux)在启动程序时通过taskset绑定核心。三、特别说明。原创 2025-04-18 00:40:20 · 244 阅读 · 0 评论 -
c++ 模板函数对性能优化
中,如果T是基本数据类型,编译器可能会完全展开这个函数,直接在调用处插入相应的机器指令,避免了函数调用的开销。当使用模板实现泛型算法时(例如标准库中的std::sort、std::find等),编译器可以根据具体的类型进行优化。由于模板通常被设计为内联函数(虽然这不是强制性的),这为编译器提供了更多的机会来执行内联优化,从而消除函数调用开销,并允许进一步的优化如常量折叠、死代码消除等。对于一个整数数组和浮点数数组,使用同一个排序算法模板,编译器会为每种类型生成专门的代码,可能利用该类型的特性进行优化。原创 2025-04-18 00:37:32 · 220 阅读 · 0 评论 -
C++中的CRTP
自定义类继承自模板类std::enable_shared_from_this,便可以在自定义类中使用模板类中的shared_from_this() 方法。注意需要自定义本身调用了shared_ptr的构造函数后,方可调用shared_from_this() 方法。回归CRTP,自定义类需要将自身作为模板参数传递给 std::enable_shared_from_this,在派生类中才可以使用 std::enable_shared_from_this 提供的 shared_from_this() 方法。原创 2025-04-18 00:32:16 · 391 阅读 · 0 评论 -
构造函数中调用虚函数的错误
这种设计虽然稍显“繁琐”,但可以清晰地把构造逻辑和初始化逻辑分离,避免在半初始化状态下调用子类代码。如果你在虚函数中调用外部接口、注册回调、访问依赖类状态,很可能由于对象未完全构造而。尤其是团队开发中,别人看到你调用了虚函数,很可能在子类中做了你意想不到的事情。时,虚函数分发机制根据当前的“构造阶段”判断调用哪个版本,而此时只认。表面上看,它只是调用了“错误的版本”,但在真实项目中,后果可能非常严重。,即便你“知道”自己调用的是某个子类的方法,也不要这么做。,对象通过内部的虚函数表指针来动态分发函数调用。原创 2025-04-18 00:28:46 · 390 阅读 · 0 评论 -
std::string转换成std::wstring
的大小因平台而异:在Windows上通常为2字节(UTF-16编码),在Linux上多为4字节(UTF-32编码)。转换过程涉及UTF-8的变长编码规则:1字节表示ASCII字符,2-4字节表示其他Unicode字符。是一个转换facet,负责将UTF-8的多字节序列解码为宽字符。它支持UTF-8到宽字符的转换,代码简洁且安全。使用标准化的UTF-8解码算法,跨平台一致性好,性能稳定。采用的编码,2字节表示大部分字符,4字节表示增补平面字符。可变长编码,1字节表示ASCII,中文字符通常为3字节。原创 2025-04-18 00:23:57 · 944 阅读 · 0 评论 -
C++实现二进制码流和字符串码流互转
废话不多说上代码#include <iostream>#include <vector>#include <string>void SecToStr(const std::string strSrc, std::string& strDst){ for (size_t j = 0; j < strSrc.size(); j = j+8) { std::string strTmp = strSrc.substr(原创 2021-04-21 00:21:41 · 1026 阅读 · 0 评论 -
关于std::function,几个行之有效的扩展小技巧
开发中,若你的项目稍微具有点扩展性和灵活性,那便少不了会用到std::function。std::function可以容纳任何形式的可调用体,比如普通函数,成员函数,Lambda 函数。因此,可以借其来实现两个重要的功能:接口分离和时间分离。接口分离指的是调用者和被调用者之间彼此分离,以降低二者的依存性。具体来说,你可以将任何可调用体保存到std::function中,可调用体不知道std::function的存在,反之亦如此。于是,可以做什么呢?将具体的处理方式等到用的时候再进行指定,调用者通原创 2021-04-12 00:32:27 · 705 阅读 · 0 评论