jiyeqian/jiyeqian.github.io

C/C++

jiyeqian opened this issue · 0 comments

準則

        64位系統(字節) 32位系統(字節)
char 1 1
short 2
int 4
long 8 (Unix) / 4 (Windows) 4
long long 8 8
float 4 4
double 8 8
long double 16 12
size_t 8 4
指針 8 4
結構體對齊 8 4

結構體對齊示例
結構體定義:

//by www.datahf.net zhangyu
typedef struct T { 
    char c; //本身长度1字节 
    __int64 d;  //本身长度8字节
    int e;  //本身长度4字节
    short f;  //本身长度2字节
    char g;  //本身长度1字节
    short h;  //本身长度2字节
}; 

對齊方式(注意e、f和g的對齊方式):
004003168

調整和恢復結構體對齊的指令:

#pragma pack ( n )
// some code 
#pragma pack (  )

編碼風格

本文讨论了几种在使用动态内存分配时可以避免的陷阱。要避免内存相关的问题,良好的实践是:

  • 始终结合使用 memset 和 malloc,或始终使用 calloc。
  • 每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。
  • 在对指针赋值前,要确保没有内存位置会变为孤立的。
  • 每当释放结构化的元素(而该元素又包含指向动态分配的内存位置的指针)时,都应首先遍历子内存位置并从那里开始释放,然后再遍历回父节点。
  • 始终正确处理返回动态分配的内存引用的函数返回值。
  • 每个 malloc 都要有一个对应的 free。
  • 确保您不是在访问空指针。

技巧算法

當i < 0時,factor = −1, 當 i > 0時 factor = 1(關鍵:明確參與位運算變量的字長)

short i =199;
short mask = 0x8000;
int factor = ( ( i & mask ) >> 14 ) + 1;

由於確定0x8000字長有問題,如下方式不可行:

factor = ( ( i & 0x8000 ) >> 14 ) + 1;

判斷兩個數異號(判断最高的符号位)

( a & b ) ^ 0x80000000 == TRUE // a和b为int型

參考文獻

關於結構體對齊方式:
http://zhangyu.blog.51cto.com/197148/673792
http://www.cppblog.com/range/archive/2011/07/15/151094.html

內存分配:
http://www.cnblogs.com/JCSU/articles/1051579.html

編程風格:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

其它:
http://www.cnblogs.com/pmer/