某个函数的重载无效
有可能是函数没有写对,建议像其它语言一样,在派生类的重载函数后面写上override关键字,确保正确重载。如:
#include <iostream> class A { public: virtual void func1(){std::cout << "A";} }; class B : public A { public: void func2() override {std::cout << "B";} }; int main() { B* b = new B; A* a = b; a->func1(); }
上述代码中class B的重载函数不小心把func1()写成了func2(),由于有override关键字,在编译阶段就会报错。虽然没有override关键字也可以正确重载,但发生上述写错或后期修改了class A的func()之后会导致重载无效,从而出现不想要的结果。
某个库某函数运行多次时间明显不一致、不线性
该函数中有静态对象或单例对象,第一次用的时候创建多花了时间。
例如:1次执行时间为100ms,而2次执行时间为110ms,10次执行时间为192ms。那很可能第一次花90ms创建了一个东西。
位运算左移错误
for(int i=0; i < 64;i++) { unsigned long long a = 1 << i; std::cout << a << std::endl; }
上述代码用unsigned long long去存a,看起来没有任何问题,但问题就在于这个1默认就是int,即不是unsigned更不是long long。
类大小(sizeof)的影响因素
成员变量是最主要的,当然,要考虑一下对齐的问题。
我们知道静态变量和函数是不影响的。
但如果类有虚函数是有个虚函数表的,这个要占8个字节大小。这8个字节应该是表的地址,因此不管有几个虚函数都是8个字节。另外考虑到对齐的问题,大小至少是8个字节的部数。
没有类型检查导致的严重BUG
#include <iostream> #include <bitset> #include <functional> const int n = 64; std::hash<std::bitset<n>> hash_fn; void func(std::bitset<n> a){std::cout << a.to_string() << std::endl;} int main() { std::bitset<n> a(0x8888); auto hash = hash_fn(a); func(hash);// 这一行错把hash当参数放进去了,但居然能编过,并且没有运行时错误,造成了难及发现的bug }
慎用减法
for(int i=0; i < 64;i++) { unsigned long long a = 1 << i; std::cout << a << std::endl; } unsigned long long a = 10, b = 100; for(unsigned long long i=0;i<1000;i++) { if(i - a > b) // 0ull-10ull > 100ull break; }