赞
踩
Github链接:https://github.com/Kongsjish/redis4.0-analyze
就是在结构体声明当中,加上__attribute__ ((packed))关键字,它可以做到让我们的结构体,按照紧凑排列的方式,占用内存。
参考链接:https://blog.csdn.net/weixin_39533180/article/details/76207099
1、属性作用不同
#if是条件编译,条件编译是根据 宏条件 选择性地编译语句;而if是条件语句,条件语句是根据条件表达式选择性地执行语句。
2、执行时期不同
#if是编译器在编译代码时完成的,if是在程序运行时进行的在程序运行时执行。
3、使用不同
#if后面不能写变量,if后面可以写变量。
1、什么是consistency check ?
一致性校验是磁盘阵列控制器的一种高级维护功能。它可以预先检查阵列上的数据,以保证它们的一致性,即数据是正确的、没有被破坏。
对于有奇偶校验值的阵列(RAID-5),一致性校验通过数据的奇偶校验,并且和存校验值的盘上的校验值进行比较,确定并纠正数据的一致性。
对于镜像盘,一致性校验比较RAID-1上2块硬盘的数据是否完全一致。不一致的需要进行同步处理。对于剩余空间的磁盘介质consistency check一样会进行读校验。
2、为什么要进行一致性校验?
系统崩溃、意外断电或者硬盘出现坏道,都可能导致阵列上的数据被破坏或不一致。根据硬盘的原厂家的数据,
平均每进行1,000,000,000,000,000次的比特位(bit)数据传输,就会产生一个不可恢复的数据错误。以36GB硬盘为例,平均每进行3000次的全盘读操作,
就会产生1个错误字节(byte)。如果在阵列不一致的状态时,发生硬盘故障,RAID控制器就无法通过奇偶校验计算出正确的数据,阵列将无法rebuild成功。
参考链接:https://blog.csdn.net/xeh_blog/article/details/70229210
一.定义宏,实现局部作用域。
防止“#define”的简单替换
二.替代goto。
由于goto不符合软件工程的结构化,而且有可能使得代码难懂,所以很多人都不倡导使用,那这个时候就可以用do{}while(0)来进行统一的管理。
学习链接:https://blog.csdn.net/majianfei1023/article/details/45246865
1、概念
optimization_level 应该是编译器的优化程度。
比较早期的时候,硬件资源是比较缺乏的。为了提高性能,开发编译器的大师们,都会对编译器(从c到汇编的编译过程)加上一定的优化策略。
优化后的代码效率比较高,但是可读性比较差,且编译时间更长。
优化是指编译器一级的措施,与机器指令比较接近,所以很可能会导致硬件不兼容,进而产生了你目前遇到的软件装不上的问题。
2、可以设置代码的优化等级
None:不优化。[-O0]与此设置,编译器的目标是降低成本的编译和调试产生预期的结果。
语句是独立的:如果你停止程序语句之间有一个断点,然后您可以指定一个新值的任何变量或任何其他声明改变程序计数器的功能和得到你期望的结果从源代码。
Fast:优化编译需要更多的时间,和更多的内存大的功能。[-O,O1]与此设置,编译器试图减少代码大小和执行时间,没有执行任何优化,需要大量的编译时间。在苹果的编译器,严格的混叠,阻挡重新排序,并内嵌调度优化时默认是禁用的。
Faster:编译器执行几乎所有支持优化,不涉及space-speed权衡。[-O2]与此设置,编译器不执行循环展开或内联函数,或寄存器重命名。相比“快速”的设置,该设置增加编译时间和生成的代码的性能。
Fastest:打开“更快”指定的优化设置,也取决于函数内联和寄存器重命名选项。此设置可能会导致一个更大的二进制。
Fastest [-O3],最小的优化尺寸。这个设置允许所有“更快”的优化通常不增加代码大小。它还旨在减少代码的大小进行进一步的优化。
参考链接:https://blog.csdn.net/baidu_34159638/article/details/53114146
参考链接 https://www.cnblogs.com/shaozhuyong/p/5959760.html
https://www.cnblogs.com/fnlingnzb-learner/p/6423917.html
http://www.cnblogs.com/thrillerz/p/5208579.html
1.errno
头文件:include<errno.h>
errno用于Linux下的错误捕获,在运行creat(),open(),write()之类的函数时有些时候会调用失败返回-1,这时候若在程序中include<errno.h>这个头文件,每次发生错误时,系统会自动用错误代码填充errno这个全局变量。这对于调试程序有很大帮助。
errno的错误定义:
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory /
#define ESRCH 3 / No such process /
#define EINTR 4 / Interrupted system call /
#define EIO 5 / I/O error /
#define ENXIO 6 / No such device or address /
#define E2BIG 7 / Argument list too long /
#define ENOEXEC 8 / Exec format error /
#define EBADF 9 / Bad file number /
#define ECHILD 10 / No child processes /
#define EAGAIN 11 / Try again /
#define ENOMEM 12 / Out of memory /
#define EACCES 13 / Permission denied /
#define EFAULT 14 / Bad address /
#define ENOTBLK 15 / Block device required /
#define EBUSY 16 / Device or resource busy /
#define EEXIST 17 / File exists /
#define EXDEV 18 / Cross-device link /
#define ENODEV 19 / No such device /
#define ENOTDIR 20 / Not a directory /
#define EISDIR 21 / Is a directory /
#define EINVAL 22 / Invalid argument /
#define ENFILE 23 / File table overflow /
#define EMFILE 24 / Too many open files /
#define ENOTTY 25 / Not a typewriter /
#define ETXTBSY 26 / Text file busy /
#define EFBIG 27 / File too large /
#define ENOSPC 28 / No space left on device /
#define ESPIPE 29 / Illegal seek /
#define EROFS 30 / Read-only file system /
#define EMLINK 31 / Too many links /
#define EPIPE 32 / Broken pipe /
#define EDOM 33 / Math argument out of domain of func /
#define ERANGE 34 / Math result not representable /
#define EDEADLK 35 / Resource deadlock would occur /
#define ENAMETOOLONG 36 / File name too long /
#define ENOLCK 37 / No record locks available /
#define ENOSYS 38 / Function not implemented /
#define ENOTEMPTY 39 / Directory not empty /
#define ELOOP 40 / Too many symbolic links encountered /
#define EWOULDBLOCK EAGAIN / Operation would block /
#define ENOMSG 42 / No message of desired type /
#define EIDRM 43 / Identifier removed /
#define ECHRNG 44 / Channel number out of range /
#define EL2NSYNC 45 / Level 2 not synchronized /
#define EL3HLT 46 / Level 3 halted /
#define EL3RST 47 / Level 3 reset /
#define ELNRNG 48 / Link number out of range /
#define EUNATCH 49 / Protocol driver not attached /
#define ENOCSI 50 / No CSI structure available /
#define EL2HLT 51 / Level 2 halted /
#define EBADE 52 / Invalid exchange /
#define EBADR 53 / Invalid request descriptor /
#define EXFULL 54 / Exchange full /
#define ENOANO 55 / No anode /
#define EBADRQC 56 / Invalid request code /
#define EBADSLT 57 / Invalid slot /
#define EDEADLOCK EDEADLK
#define EBFONT 59 / Bad font file format /
#define ENOSTR 60 / Device not a stream /
#define ENODATA 61 / No data available /
#define ETIME 62 / Timer expired /
#define ENOSR 63 / Out of streams resources /
#define ENONET 64 / Machine is not on the network /
#define ENOPKG 65 / Package not installed /
#define EREMOTE 66 / Object is remote /
#define ENOLINK 67 / Link has been severed /
#define EADV 68 / Advertise error /
#define ESRMNT 69 / Srmount error /
#define ECOMM 70 / Communication error on send /
#define EPROTO 71 / Protocol error /
#define EMULTIHOP 72 / Multihop attempted /
#define EDOTDOT 73 / RFS specific error /
#define EBADMSG 74 / Not a data message /
#define EOVERFLOW 75 / Value too large for defined data type /
#define ENOTUNIQ 76 / Name not unique on network /
#define EBADFD 77 / File descriptor in bad state /
#define EREMCHG 78 / Remote address changed /
#define ELIBACC 79 / Can not access a needed shared library /
#define ELIBBAD 80 / Accessing a corrupted shared library /
#define ELIBSCN 81 / .lib section in a.out corrupted /
#define ELIBMAX 82 / Attempting to link in too many shared libraries /
#define ELIBEXEC 83 / Cannot exec a shared library directly /
#define EILSEQ 84 / Illegal byte sequence /
#define ERESTART 85 / Interrupted system call should be restarted /
#define ESTRPIPE 86 / Streams pipe error /
#define EUSERS 87 / Too many users /
#define ENOTSOCK 88 / Socket operation on non-socket /
#define EDESTADDRREQ 89 / Destination address required /
#define EMSGSIZE 90 / Message too long /
#define EPROTOTYPE 91 / Protocol wrong type for socket /
#define ENOPROTOOPT 92 / Protocol not available /
#define EPROTONOSUPPORT 93 / Protocol not supported /
#define ESOCKTNOSUPPORT 94 / Socket type not supported /
#define EOPNOTSUPP 95 / Operation not supported on transport endpoint /
#define EPFNOSUPPORT 96 / Protocol family not supported /
#define EAFNOSUPPORT 97 / Address family not supported by protocol /
#define EADDRINUSE 98 / Address already in use /
#define EADDRNOTAVAIL 99 / Cannot assign requested address /
#define ENETDOWN 100 / Network is down /
#define ENETUNREACH 101 / Network is unreachable /
#define ENETRESET 102 / Network dropped connection because of reset /
#define ECONNABORTED 103 / Software caused connection abort /
#define ECONNRESET 104 / Connection reset by peer /
#define ENOBUFS 105 / No buffer space available /
#define EISCONN 106 / Transport endpoint is already connected /
#define ENOTCONN 107 / Transport endpoint is not connected /
#define ESHUTDOWN 108 / Cannot send after transport endpoint shutdown /
#define ETOOMANYREFS 109 / Too many references: cannot splice /
#define ETIMEDOUT 110 / Connection timed out /
#define ECONNREFUSED 111 / Connection refused /
#define EHOSTDOWN 112 / Host is down /
#define EHOSTUNREACH 113 / No route to host /
#define EALREADY 114 / Operation already in progress /
#define EINPROGRESS 115 / Operation now in progress /
#define ESTALE 116 / Stale NFS file handle /
#define EUCLEAN 117 / Structure needs cleaning /
#define ENOTNAM 118 / Not a XENIX named type file /
#define ENAVAIL 119 / No XENIX semaphores available /
#define EISNAM 120 / Is a named type file /
#define ENOKEY 126 / Required key not available /
#define EKEYEXPIRED 127 / Key has expired /
#define EKEYREVOKED 128 / Key has been revoked /
#define EKEYREJECTED 129 / Key was rejected by service /
#define EOWNERDEAD 130 / Owner died /
#define ENOTRECOVERABLE 131 / State not recoverable /
#define ERFKILL 132 / Operation not possible due to RF-kill /
#define EHWPOISON 133 / Memory page has hardware error */
2.strerror
头文件:include<string.h>
函数原型:
char *strerror(int errnum);
char *_strerror(const char *strErrMsg);
wchar_t *_wcserror(int errnum);
wchar_t *__wcserror(const wchar_t *strErrMsg)
通过标准错误的编号,获得错误的描述字符串,方便用户查找,返回值是指向错误信息的指针。
学习链接:https://blog.csdn.net/yiyi__baby/article/details/45557679
一、奇偶校验和
根据被传输的一组二进制代码中“1”的个数是奇数或偶数来进行校验。
使用:通常专门设置一个奇偶校验位,存放代码中“1”的个数为奇数还是偶数。若用奇校验,则奇偶校验位为奇数,表示数据正确。若用偶校验,则奇偶校验位为偶数,表示数据正确。
二、CRC校验(循环冗余校验码)
CRC校验是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
三、LRC校验
LRC校验用于ModBus协定的ASCII模式,这各校验比较简单,通讯速率较慢,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。它仅仅是把每一个需要传输的数据字节迭加后取反加1即可。
四、格雷码校验
格雷码是一种无权码,也是一种循环码。是指任意两组相邻的代码之间只有一位不同,其余为都相同。
如:5的二进制为0101 6的二进制为0110
5的格雷码为0111 6的二进制为0101
五、校验和
校验一组数据项的和是否正确。通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255。
eg. 数据01020304的校验和为a。
六、异或校验
BCC校验其实是奇偶校验的一种,但也是经常使用并且效率较高的一种。所谓BCC校验法,就是在发送前和发送后分别把BCC以前包括ETX字符的所有字符按位异或后,按要求变换(增加或去除一个固定的值)后所得到的字符进行比较。相等即认为通信无错误,不相等则认为通信出错。
七、MD5校验
MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被篡改。
学习链接:https://blog.csdn.net/Chen_xiaobao/article/details/85340431
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。