C++
无名_1989
1、每天坚持读书1小时;2、坚持提升专业,成为单位专业权威;3、战胜两个坏毛病——拖延与抱怨;4、先从形象上改变,提升你的自信;5、时常反省自己,但不诋毁自己;6、向优秀的人学习;7、坚持早睡早起;8、坚持体育锻炼;9、保持微笑;10、帮助他人
展开
-
前置声明
1原创 2020-11-25 07:04:55 · 741 阅读 · 1 评论 -
将文件间的编译依存关系将至最低
#include "date.h"#include "address.h" class Person{ ... private: Date theBirt原创 2018-02-07 11:15:01 · 220 阅读 · 0 评论 -
inline内联函数总结
inline只是对编译器的一个申请,不是强制命令。优点:1,比宏的坑少,而且减少函数调用所招致的额外开销。缺点:1,有可能使目标代码增加,减少了高速缓存的命中率(如果编译器针对“函数本身”所产出的码可能比针对“函数调用”所产出的码更小。果真如此,将函数inlining确实可能导致较小的目标码和较高的缓存装置命中率)。2,调试时,比较难跟踪。3,inline函数更改,其他包含原创 2018-02-07 10:50:19 · 182 阅读 · 0 评论 -
访问类的私有变量
#include <vector>#include <iostream>using namespace std;class A {public: A(int i):a(i){}private: void print() {cout<<"A"<<endl;} int a;};class B {public:...原创 2018-02-26 18:07:35 · 269 阅读 · 0 评论 -
void *指针加法
#include <iostream>#include <stdio.h>#include <stdint.h>using namespace std;int main(int argc, char **argv){ uint32_t arr[3] = {0x01020304,1,2}; void *p = arr; voi...原创 2018-03-14 18:03:16 · 3287 阅读 · 0 评论 -
static关键字
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的s...转载 2018-03-15 09:57:41 · 98 阅读 · 0 评论 -
程序中两个!!作用
两个!是为了把 非0值 转换成1,而0值还是0。因为C语言中,所有 非0值 都表示真。所以!非0值 = 0,而!0 = 1。 所以!!非0值 = 1,而!!0 = 0。转载 2018-08-08 16:59:29 · 393 阅读 · 0 评论 -
共享内存在每个进程里的映射地址是不同的
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列...转载 2018-06-15 10:29:09 · 3058 阅读 · 0 评论 -
手写C++的String类
class String{public: String(const char* str=NULL);//普通的构造函数 String(const String& other); //拷贝构造函数 ~String(); String& operate = (const String& other);//复制构造private: char* m_data;//...转载 2018-05-14 10:10:27 · 623 阅读 · 0 评论 -
C++中const修饰二级指针(从类型'int**'到类型'const int**'的转换无效)
先上代码:void func(const int ** arg){}int main(int argc, char **argv){ int **p; func(p); return 0;}这个代码用gcc编译会出现这样的错误:main.cpp: 在函数‘int main(int, char**)’中:main.cpp:8:8: 错误: 从类型‘int**’到...转载 2018-05-04 11:54:01 · 2305 阅读 · 0 评论 -
C++的大端口和小端口
int main(int argc, char **argv){ short int x; char x0,x1; x=0x1122; x0=((char*)&x)[0]; //低地址单元 x1=((char*)&x)[1]; //高地址单元 cout<<hex<<(int)x0<<...原创 2018-03-16 19:11:08 · 736 阅读 · 0 评论 -
const_cast
const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。用法:const_cast<type>(expression)通过const_cast运算符,也只能将const type*转换为type*,将const ty...转载 2018-03-15 10:24:55 · 102 阅读 · 0 评论 -
程序中用sleep和select阻塞休眠的区别
在看公司项目中发现超时控制中使用select替代sleep就行阻塞,循环检查任务是否超时,在网上找了很多资料说了select的各种好处:1:sleep不准确,只能精确到秒(这个我感觉可以使用usleep代替,不是个很好理由)。2:sleep容易受到系统信号,例如SIGALRM影响,各个系统版本实现不一,sleep是个glic库函数,不是内核调用。3:更高级的说话是,sleep浪费CPU原创 2018-01-04 11:16:11 · 9315 阅读 · 1 评论 -
__builtin_popcountll指令
#include #include #include typedef unsigned long long u64;typedef unsigned int u32;inline u32 popcount64_1(u64 x) { return __builtin_popcountll(x); }inline u32 popcount64_2(u64 x){转载 2018-01-03 10:16:42 · 3662 阅读 · 0 评论 -
多线程伪共享(false sharing)问题分析
#include #include #include #include#include#includeusing namespace std;#define NMAX 4096 * 10 #define NUM_CORE 4 int g_iBuff[NMAX];int main(){ int alignPos = 0; for (int i = 0原创 2018-01-02 16:33:58 · 516 阅读 · 0 评论 -
C++ 成员变量为引用类型和const类型,如何赋值
成员变量是引用类型 不能有默认构造函数必须提供构造函数 构造函数的形参必须为引用类型 初始化必须在成员初始化链表内完成转载 2017-12-04 20:48:38 · 713 阅读 · 0 评论 -
重载,覆盖,隐藏区别
重载:相同的范围(在同一个类中) 函数名字相同 参数不同 virtual关键字可有可无原创 2017-12-12 12:06:16 · 158 阅读 · 0 评论 -
继承父类私有成员是否可以修改
#includeusing namespace std;class Base {public: void print() { a = 1; cout<<a<<endl; } private : int a;};class Derived : public Base{ void Print()原创 2017-12-12 11:39:25 · 1714 阅读 · 0 评论 -
C++字节对齐
系统让程序中的变量按字节对齐的目的:访问高效!原创 2017-10-18 18:16:13 · 190 阅读 · 0 评论 -
abstract class 应定义virtual析构函数
由于abstract 类总是定义为基类,而又由于base class应该有个virtual析构函数,并且由于pure virtual函数导致抽象class,因此解法很简单:为你希望它成为抽象的那个class声明一个pure virtual析构函数,并实现。class AWOV{public:virtual ~AWOV() = 0;}AWOV::~AWOV() { }...原创 2018-02-09 10:16:10 · 188 阅读 · 0 评论 -
通过外部指针可以访问类的私有成员
class PrivateMemberFuncPtr{public: void bind();private: void print() { printf("success\n"); }};void (PrivateMemberFuncPtr::*ptr)();void PrivateMemberFuncPtr::bind(){ ptr=&Priva...原创 2018-02-09 11:01:45 · 1058 阅读 · 0 评论 -
了解typename的双重意义
1,声明template参数时,前缀关键字class和typename可互换。2,请使用关键字typename表示嵌套从属类型名称;但不得在base class lists(基类列)或member initialization list(成员初值列)内以它作为base class修饰符。...原创 2018-02-10 16:50:53 · 125 阅读 · 0 评论 -
了解隐式接口和编译期多态
1,classes和templates都支持接口和多态。2,对classes而言接口是显示的,以函数签名为中心。多态则是通过virtual函数发生于运行期。3,对template参数而言,接口是隐式的,奠基于有效表达式。多态则是template具现化和函数重载解析发生于编译期。...原创 2018-02-10 16:26:20 · 202 阅读 · 0 评论 -
明智而审慎地使用多重继承
1,多重继承比单一继承复杂。它可能导致新的歧义性,以及对virtual继承的需要。2,virtual继承会增加大小,速度,初始化(以及赋值)复杂度等成本。如果virtual base classes不带任何数据,将是最具有实用价值的情况。3,多重继承的确有正当用途。其中一个情节涉及"public继承某个Interface classes"和"private继承某个协助实现的class"的两组组合。...原创 2018-02-10 10:53:50 · 226 阅读 · 0 评论 -
C++ 绝不要重新定义继承而来的缺省参数值
原因:虚函数是动态绑定的,但缺省参数是静态绑定的。这意味着你最终可能调用的是一个定义在派生类,但使用基类中的缺省参数值的虚函数。原创 2018-02-10 09:49:53 · 213 阅读 · 0 评论 -
复制构造函数调用私有成员
class String{ private: char *m_data; int length;public: String(con原创 2017-05-25 19:46:55 · 659 阅读 · 0 评论