随笔分类 - C/C++
摘要:DRAFT 梳理下我的技能树,要学的太多,学无止境
阅读全文
摘要:最近需要开发一个 Java 的代码生成器,周末看了 2 天廖雪峰的 Java 教程,就能直接上手写 Java。说下自己最明显的感受,用的不多,理解不一定对: 【编译/解释】Java 编译+解释,运行在 JVM,跨平台移植方便,但执行速度/效率比 C++ 低 【编程范式】Java 纯面向对象,除了几个
阅读全文
摘要:单例模式有很多种实现: 懒汉/饿汉 非线程安全 线程安全 每次判空加锁(效率不高) DCL:Double-check lock(繁琐,C++11 之前的最佳实现) Meyers’ singleton:静态变量(简洁,C++11 之后的最佳实践) C++11 规范保证了局部 static 对象的线程安
阅读全文
摘要:考察点 返回值类型 MyClass&,可以连续赋值 参数类型:(const MyClass& rhs) 或者 (MyClass rhs) 值传递(copy-swap) 自赋值安全 无内存泄漏,旧值需要析构 异常安全 参考实现 copy-swap 惯用法 BennyHuo class MyString
阅读全文
摘要:验证局部静态变量 static int cnt 在无锁情况下的 data race: 测试 C 源码: #include <stdio.h> #include <pthread.h> #include <stdlib.h> void* foo(void* args) { static int cnt
阅读全文
摘要:原帖地址:https://stackoverflow.com/questions/10195343/copy-a-file-in-a-sane-safe-and-efficient-way 这是我在 StackOverflow 上见过的非常高质量的提问了:作者自己提出了很多种解法,并且做了性能测试。
阅读全文
摘要:《C++高级编程》第4版 18.2节 可以指向任何可调用对象:函数、函数对象、或 lambda 表达式;被称为多态函数包装器,可以当成函数指针使用,还用作实现回调函数的参数。function 真正有用的场合是将回调函数作为类的成员变量。 必须用 std::function<> 而不能用指针 如果 p
阅读全文
摘要:建议先阅读 C++ 之父的 A tour of C++ 中相关章节 现代 C++ 对多线程/并发的支持 A Tour of C++(上) 现代 C++ 对多线程/并发的支持 A Tour of C++(下) 35 优先选用基于任务而非基于线程的程序设计 以异步方式运行函数 int doWork(),
阅读全文
摘要:总结自《Effective Modern C++》条款 11 常见场景 单例模式删除复制构造、复制赋值运算符重载 理由 未定义的调用在连接阶段才暴露 =delete 可以支持任何函数的生成,包括非成员函数 =delete 可以阻止模版针对特定类型的实例化 ⚠️ 习惯上,=delete 都是 publ
阅读全文
摘要:总结自《Effective Modern C++》第 4 章 裸指针七宗罪 裸指针无法说明指向的是单个对象还是一个数组 裸指针无法说明使用完指针是否需要析构,即从声明中看不出来指针是否拥有所指向的对象 即使知道需要析构,也不知道应该用 delete 还是调用某个类似 deinit(p) 的函数 即使
阅读全文
摘要:本文承接上文,总结自《Effective Modern C++》条款 17:理解特种成员函数的生成机制 特种成员函数 C++98 四种:默认构造、析构、复制构造、复制赋值运算符 C++11增加两种:移动构造、移动赋值运算符 合成机制 只有用到了才合成 没有显式声明任何构造的时候才会合成默认构造 合成
阅读全文
摘要:一小段代码足以说明问题 核心测试代码 int main() { cout << "1."; Foo a1; // 默认构造 cout << "2."; Foo a2(a1); // 拷贝构造(直接初始化) cout << "3."; Foo a3 = a1; // 拷贝构造(拷贝初始化) cout
阅读全文
摘要:CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 构造并发程序的方法 现代操作系统提供了 3 种基本的构造并发程序的方法: 进程:每个逻辑控制流都是
阅读全文
摘要:描述 请实现一个函数,将一个字符串s中的每个空格替换成“%20”。 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 数据范围 0<=len(s)<=1000。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。 解法 0 - 书中 C
阅读全文
摘要:本文承接前文 现代 C++ 对多线程/并发的支持(上),翻译自 C++ 之父 Bjarne Stroustrup 的 C++ 之旅(A Tour of C++)一书的第 13 章 Concurrency。本文将继续介绍 C++ 并发中的 future/promise,packaged_task 以及
阅读全文
摘要:本文翻译自 C++ 之父 Bjarne Stroustrup 的 C++ 之旅(A Tour of C++)一书的第 13 章 Concurrency。作者用短短数十页,带你一窥现代 C++ 对并发/多线程的支持。原文地址:现代 C++ 对多线程/并发的支持(上) -- 节选自 C++ 之父的 《A
阅读全文
摘要:初学者在刚开始读 C++ Primer 的时候,总是容易被书中各种初始化搞得头大:默认初始化、列表初始化、值初始化、类内初始值、构造函数初始值列表、new int 和 new int() 的区别... 本文把书中这些概念集中总结如下,大括号【】内为原书中文版第 5 版的相应页码。 列表初始化(lis
阅读全文
摘要:正则表达式零宽断言 适用场景:匹配/提取/查找/替换以 xxx 开头,或以 xxx 结尾,但不包括 xxx 的字符串。 零宽断言 用法 含义 (?=exp) 零宽度正预测先行断言 lookahead exp1(?=exp2) exp1 之后必须匹配 exp2,但匹配结果不含 exp2 (?!exp)
阅读全文
摘要:一种比较简洁的实现:通过 fstream 和 stringstream 的 rdbuf() 实现。 #include <fstream> #include <string> std::string readFileIntoString(const std::string &filename) { s
阅读全文
摘要:问题描述 帮同事 debug 时,看到如下的 C 代码:用中括号里的数值,指定元素在数组中的次序。第一次见这种用法,验证一下。 #include <stdio.h> int main(int argc, char* argv[]) { int arr[10] = { [9] = 9, [3] = 3
阅读全文