C++
std::is_invocable只依据类型判断调用可行性,不关心实参值,需提供类型名或decltype表达式。检查引用和常量与易变限定需配合std::declval生成引用。返回类型和异常检查应分开,std::is_invocable_r不保证noexcept,需另用无抛出检查。与std::invoke组合可先检查后调用,确保安全,避免运行错误。
直接使用`==`比较double不可靠,因十进制小数无法精确存储。应使用绝对或相对误差阈值判断,并处理NaN。避免将浮点数作为哈希键或循环变量,金融场景建议用整数(如分)存储,防止精度损失。
C++20的std::source_location通过显式调用current()方法,能够可靠地获取函数名与行号信息,相比依赖__func__等宏更加可靠。旧标准使用__func__等预定义宏,但存在不能取地址、宏展开时返回定义处函数名等陷阱,使用时需注意编译器版本。推荐使用C++20新特性,规避宏陷阱。
C++中浮点数转字节数组,指针强转(如`reinterpret_cast`)存在未定义行为,编译器优化可能导致错误结果;`memcpy`是安全可靠的跨平台方案,不触发严格别名规则,适合序列化、二进制写入等场景,需注意对齐和大小端处理。
使用z_stream解压内存数据需手动管理缓冲区与状态:先清零结构体,正确设置窗口位宽参数,然后循环调用inflate()函数直至返回Z_STREAM_END,期间动态扩容输出缓冲区,最后调用inflateEnd()清理,否则容易导致崩溃或数据不完整。
关于懒汉模式,其实核心就一句话:"用到的时候才创建"。但偏偏这句看似简单的需求,在C++里实现起来有挺多坑。很多人第一反应就是裸指针加个if判断,结果多线程一跑,直接炸出未定义行为——因为构造可能被执行多次,而指针赋值又不是原子的。 怎么解决?C++11给出的标准答案是std::once_flag
absl::FunctionRef是轻量级、非拥有式的函数引用,大小固定16字节,避免std::function的堆分配与虚函数开销。适合高频回调等性能敏感场景,但不支持长期持有或跨作用域存储。C++26标准尚未纳入std::function_ref,需注意命名空间与生命周期管理。
C++标准库不支持直接读写单个位,需以binary|in|out模式打开文件,先读字节,修改特定位再写回。位索引对应字节索引=位索引/8,位偏移=位索引%8,置1掩码为1U左移位偏移量,置0掩码为其取反。
C++17的std::variant是带标签的联合体,解决传统union无类型记录和无法管理复杂类型的问题。它编译期锁定类型列表,运行时自动记录活跃类型。配合std::get、std::holds_alternative和std::visit安全访问,推荐使用std::visit处理所有分支,避免裸用std::get导致异常。
C++23的std::to_underlying是一个constexpr函数模板,用于将枚举值安全地转换为底层整数类型。使用时必须传入枚举值而非枚举类型,不进行范围检查,与static_cast等价。无法用于前向声明的枚举。与std::underlying_type_t分工明确,前者处理值,后者处理类型。
TGA图像数据解析关键在于文件头第17字节:值为2表示RLE压缩,0为未压缩,老版本可能为3。未压缩图像需处理每行32位对齐填充,RLE解码根据包头最高位区分重复包与原样包。需注意alpha通道提取及图像方向翻转(descriptor字节bit5决定原点)。
在C++中,__builtin_return_address返回的是返回地址而非调用者函数入口,受优化、内联和尾调用影响,结果不可靠。更推荐手动传入__func__或使用backtrace获取调用者信息,仅在底层开发且禁用优化时才适合使用该内建函数。
使用固定大小缓冲区的fstream循环读写实现大文件切片,避免加载全文到内存;切片文件名采用定宽数字序号以便合并时排序;合并后需校验SHA-256确保完整性,注意二进制模式标志及最后一块不补零;路径拼接推荐std::filesystem::path。
C++17标准库提供std::filesystem::remove_all用于递归删除非空文件夹。需先包含头文件,用try/catch捕获filesystem_error异常;调用前必须用is_directory检查路径是否为目录,否则未定义行为。对不存在的路径调用也会抛出异常,因此推荐先检查路径是否存在。编译时需链接相应库,如GCC/Clang加-lstd
C++20的std::format可直接格式化chrono类型,但需先将time_point转换为time_t并截断纳秒精度。C++11的std::put_time兼容性广泛,但必须使用线程安全函数(如localtime_s)替代std::localtime,以避免静态缓冲区覆盖和时区陷阱。此外,还需注意不同编译器对C++20的支持程度可能不尽相同。
手动循环展开适用于迭代次数固定、无分支副作用的性能瓶颈场景。展开时需避免索引越界与副作用顺序错误。Clang倾向忠实保留展开指令,GCC可能合并为SIMD指令。需注意数据对齐,栈上数组用alignas,堆上使用aligned_alloc,否则可能崩溃。
C++11前双重检查锁定因指令重排存在线程安全隐患;C++11起静态局部变量初始化由标准保证线程安全,成为实现线程安全单例的最佳方式。但需注意析构,可用std::call_once动态分配并控制生命周期,同时避免静态初始化顺序导致的依赖问题。
堆内存统计方法:在Linux系统中,通过读取/proc/self/status与maps文件,可获取堆分配总量和驻留量;在Windows系统中,通过HeapWalk函数可获得类似信息。若要跨平台精确统计,需借助LD_PRELOAD环境变量拦截内存分配,或使用MSVC调试钩子。不推荐使用mallinfo等接口,因为其返回的数据不准确且不稳定。
在类Unix系统上通过chmod系统调用并传递八进制掩码修改文件权限,Windows则使用SetFileAttributesA控制只读属性。两者语义不对等,跨平台时应分层处理,避免直接映射。需检查返回值并注意权限不足、文件占用及文件系统限制等常见失败原因。
C++中实现数组元素原位循环移动时,若std::rotate因自定义类型限制或STL未优化而失效,可手写环形置换法。通过gcd(n,k)确定循环组数,仅用三个指针和一个临时变量完成旋转,避免额外内存开销。
在C++中,字符串清洗采用std::unordered_set构建白名单,读写双指针原地过滤非法字符,检查与清洗分离以提前报错,高频调用时缓存白名单避免重复构造,兼顾效率与可维护性,实现高效、安全、可维护的字符串处理。
C++20协程实现异步I/O调度器的核心在于管理promise、awaiter、OSI/O句柄和调度队列的生命周期,需堆分配awaiter并确保handle有效。epoll配合无锁队列实现事件分发,promise_type需支持取消超时。Windows下IOCP需将协程句柄存入自定义OVERLAPPED派生结构体。
在C++中实现字符串位混淆时,需注意:按位取反必须强制转为unsignedchar类型以避免符号扩展;循环移位应使用std::rotate并取模确保范围正确;混淆与还原逻辑必须严格对称以保证正确恢复;空字符串和UTF-8多字节编码需特殊处理。
火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。






