随笔分类 - C/C++
摘要:浮点数不是完美精确的表示,尤其是在涉及到舍入误差和不同数值规模时。 一般实现: fabs(a - b) < epsilon 这种通过比较差的绝对值来判断浮点数是否相等的方法,存在一些潜在的问题: 误差累积:在连续的浮点数运算中,误差可能会逐步累积。这会导致最后的结果偏离真实值,这样用差值来比较就可能
阅读全文
摘要:源码 #pragma once #include <list> #include <unordered_map> using namespace std; class LRUCache { public: LRUCache(int capacity) : cap(capacity) { m.rese
阅读全文
摘要:https://www.cnblogs.com/pandamohist/p/13852197.html 互斥量 std::mutex:解决多个线程对共享数据的访问问题。 条件变量 std::condition_variable:是一种线程间的通讯机制,解决线程的执行问题。 #pragma once
阅读全文
摘要:使用汇编代码,不引入libc库。 代码: // no_main.c char str[] = "Hello world!\n"; void my_print() { asm( "movl 0,%%ebx \n\t
阅读全文
摘要:| | 语法 | 优势 | 劣势 | | | | | | | 静态编译 | gcc -static main.c -o main_static | 1. 符号冲突编译器可以发现2. 程序启动和运行速度略快3. 没有版本兼容问题 | 1. 更新子模块需要重新编译主程序2. 程序体积较大(磁盘上和内存中
阅读全文
摘要:用法:const_cast(expression) 通过const_cast运算符,只能将const type转换为type,将const type&转换为type&。 例子1: void f(int *p){} int main() { const int a=1; const int* cons
阅读全文
摘要:string类有2个函数获取字符串的长度。length、size。长度不包括'\0'。 这两个函数都是的实现是相同的,没有任何区别。 length是按照c语言的方式最开始就引入了。 size是STL引入的,保证容器类获取元素个数的接口统一。 建议:业务上层用length,STL内部使用size。
阅读全文
摘要:int i = 0; 00071ABE mov dword ptr [i],0 ++i; 00071AC5 mov eax,dword ptr [i] 00071AC8 add eax,1 00071ACB mov dword ptr [i],eax i++; 00071ACE mov eax,dw
阅读全文
摘要:锁的本质:操作的序列化、队列化 虽然不同的语言可能会提供不同的锁接口,但是底层调用的都是操作系统的提供的锁。 不同的高级语言只是在操作系统的锁机制基础上进行了些封装而已 硬件 原子操作是指不可被中断的一个或者一组操作。 硬件提供原子指令,支持基本类型。 总线锁 在cpu芯片上有一个HLOCK Pin
阅读全文
摘要:使用位运算的注意事项: 位操作只能用于整形数据,对float和double类型进行位操作编译器会报错。 位操作符的运算优先级比较低,尽量使用括号来确保运算顺序。 注意:一般运算不一定比位运算慢。编译器已经做的很好了,会把一般运算优化为位运算。 某些自作聪明的优化反而会误导编译器,使得编译器不进行更棒
阅读全文
摘要:查表法 unsigned char reverse8(unsigned char c) { static unsigned char sta[16] = {//不多不少的静态数据 0x00,0x08,0x04,0x0C,0x02,0x0A,0x06,0x0E,0x01,0x09,0x05,0x0D,
阅读全文
摘要:直接看源码:endl是一个模板函数,接收一个ostream输出流参数。 endl:换行+刷新缓冲区。把缓冲区数据写入 ends:空字符(’\0’)标记结束。不同的操作系统对’\0’处理的方式也不同,有的输出一个空格,有的什么都没有。 flush:刷新缓冲区 template <class _Elem
阅读全文
摘要:C++11新加了两个关键字:auto和decltype。 用于在编译期推导出变量或表达式的类型,方便开发者简化代码。 auto 编译期推导变量类型。 例:auto x = 1; 推导规则 必须初始化。 在一行定义多个变量时,不能有二义性。 无法推导出模板参数。 不能定义数组 不能用于函数参数 cv推
阅读全文
摘要:需求:禁止基类指针指向子类 方法:将继承方式改为protected、private 原因:对象只能访问类的public权限的成员
阅读全文
摘要:做单元测试的时候,为了验证类的私有方法或变量,需要将访问权限都改为public。 为了不改动源代码,可以在编译时,添加宏定义替换权限 CPPFLAGS=-Dprotected=public -Dprivate=public 绝大部分情况下是不会出现问题的。 注意到C++的默认规则,默认权限是priv
阅读全文
摘要:call_once是c++11中引入的新特性,用于保证某个函数只调用一次,即使是多线程环境下,它也可以可靠地完成一次函数调用。一般配合once_flag变量。 特别适用于多线程时某个初始化只执行一次的场景。 若调用call_once一切顺利,将会翻转once_flag变量的内部状态,再次调用该函数时
阅读全文
摘要:noexcept关键字是c++11之后新增的。 该关键字会告诉编译器,被修饰的函数不会发生异常,有利于编译器对程序做更多的优化。 编译器做代码生成时,胡加一些额外的代码包裹原始代码,当出现异常时可以抛出一些相关的堆栈错误信息,包含:错误位置、错误原因、调用顺序和层级路径等信息。 当使用noexcep
阅读全文
摘要:C++11新增的关键字thread_local,表示对象的生命周期属于线程存储期。 线程局部存储(Thread Local Storage,TLS)是一种存储期(storage duration),对象的存储是在线程开始时分配,线程结束时回收,每个线程有该对象自己的实例 如果类的成员函数内定义了 t
阅读全文
摘要:分派/派发 dispatch 变量被声明时的类型叫做变量的静态类型(Static Type)。 变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type)。 根据对象的类型而对方法进行的选择,就是分派(Dispatch)。 分派时期 根据分派生的时期,可以将分派分为两种,静态分派和动态
阅读全文
摘要:只能在堆上分配 class A { public: A() {} void destory() { delete this; } private: ~A() {} }; 编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。 若是类的
阅读全文