開發過程中的小知識總結

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,
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章