1.提高程序運行效率
將大量的內存開銷的操作,放在判斷之後
2.共享內存環形隊列,判斷空\滿\size
3.gettimeofday
https://www.cnblogs.com/xiaojianliu/p/8477461.html
#include <assert.h>
#include <sys/time.h>
int main()
{
float time_use=0;
struct timeval start;
struct timeval end;
gettimeofday(&start,NULL);
printf("start.tv_sec:%dn",start.tv_sec);
printf("start.tv_usec:%dn",start.tv_usec);
fun();
time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);//微秒
printf("time_use is %fn us",time_use);
}
#define SECOND_MASK 1000000000LL
static uint64_t get_clock_ns ()
{
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) < 0)
{
gf_log (IOLOG_DOMAIN, GF_LOG_ERROR,
"clock_gettime err: %s", strerror(errno));
return 0;
}
return ts.tv_sec * SECOND_MASK + ts.tv_nsec;
// tv_sec 秒 tv_nsec 納秒
}
4.宏發生錯誤,使用goto語句
#define GF_OPTION_INIT(xxx, xxx, err_label) \
do{ \
int ret = 0; \
ret = func(); \
if(ret == -1) \
goto err_label; \
} while(0)
補充:宏定義中,\ 後面一定不要加空格,會報warning
5.緩衝區溢出
禁止使用strcpy、strcat、sprintf等危險函數
使用strncpy、strncat、snprintf等函數時,n爲緩衝區可接收的最大長度減一,而不是要拷貝長度
char buf[TMP_BUF_SIZE];
snprintf(buf, TMP_BUF_SIZE - 1, "/proc/%d/cmdline", pid); // n爲緩衝區可接收長度-1
char proc_name[TMP_BUF_SIZE];
strncpy(proc_name, &buf[i + 1], TMP_BUF_SIZE - 1); // // n爲緩衝區可接收長度-1
proc_name[TMP_BUF_SIZE - 1] = '\0';
6.string字符串轉number
不使用atoi, atol讀取數字,除非對輸入合法性沒有要求的場合。
通常情況下:
int–>strtol
unsigned int --> strtoul
浮點數 --> strtod
有符號的64位整數 --> strtoll
無符號的64位整數 --> strtoull
7.結構體(初始化)
// 定義函數指針類型
typedef int(*pFUNC)(int, int);
// 結構體類型的聲明
struct stu{
int age;
int sno;
pFUNC func_cbk; // 函數指針成員
};
int do_cbk(int age, int sno)
{
printf("age = %d, sno = %d\n", age, sno);
}
// 定義結構體類型的變量,並對成員初始化
struct stu = student {
.age = 25, // 注意:後面是逗號,不是分號
.sno = 89757,
func_cbk = do_cbk,
};