前期开发心得总结

15.7.24

memset中第一个参数为目的地址,如果memset(&a+1,…..),那么实际操作地址并不是a的地址向后偏移1个字节,而是a的地址向后偏移1个a的变量长度。例如如果a为int型,则操作地址为a的地址+4,正确做法应为memset((char*)&a)+1,这样访问的就是a的地址+1了。

struct里注意字节的对齐,如果struct都是char,那么最小存储空间为1个字节,如果struct中有n个char和1个int,则最小存储空间为4个字节(32位操作系统下),即如果int前的char变量地址不是4n-1,则char变量后面不立即跟int,该变量在内存中占用的地址空间也不止1个字节。

c语言for循环里不能申明变量,如for(int i=0;i<10;i++)是错误的,i应该在前面申明。

15.8.25

c语言里如果结构体里含有指针变量,那么在结构体复制的时候得注意,不能简单的memcpy,因为memcpy后指针变量仍指向原来的结构体内存,而不是复制后的结构体内存,需要编写相关的复制方法.

15.10.1
如果周期性的执行同一个线程,且周期极短,那么在执行线程时需对线程加锁,以防止下一个线程执行时原线程尚未执行完,从而对某些全局变量的访问和修改会导致错误。

高并发socket接收发送时需周期性地执行垃圾清理线程,对用户表或监听的socket进行垃圾判定,即判断该socket是否有效,若无效,则将其清理,避免占用有效资源

递归算法若调用层数太多可能会导致系统分配的栈空间溢出,程序异常中止,解决方法有两种1.增大系统默认分配的栈空间或线程分配的站空间。2.将递归程序改写为栈操作程序,即通过push和pop操作实现遍历。推荐第二种方法。

15.10.10
linux下使用qt发布程序,32位操作系统发布的只能在32位操作系统上运行,64位亦然。发布方法:
1.使用release编译程序,生成可执行文件
2.对可执行文件执行 ldd 操作,获取该文件依赖的动态链接库
3.将所有依赖的库文件和可执行文件放到同一个文件夹下
4.在该文件夹下新建与可执行文件同名的.sh脚本文件
5.脚本文件中写入如下代码:

#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" !="/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"

6.完成程序发布,若客户端需使用该程序,将该文件夹拷贝至linux系统上,对可执行文件和同名脚本文件设置可执行权限(u+x),然后执行脚本文件即可运行程序。

16.1.13
C语言中临时变量如果只申明而不赋值,那么在运行时是不会占用内存空间的,但是只要对后续用到了该变量,无论是否是对该变量赋值,那么在运行时便会占用内存空间,该变量的值如果未赋值,那么用的时候是随机数.

16.2.25
读写锁bug排除:
i_ServeUserTable_copy方法中实现源表到目的表的复制,原有程序在复制时先保存目的表中读写锁的值,复制完成后再恢复目的表中读写锁的值,这样导致了一个bug的产生,即目的表中原来是加上写锁的,将源表复制给目的表时改变了目的表读写锁的值,若源表读写锁未加锁而目的表已加锁则在复制的那一刻目的表解锁了,从而导致该锁被其他线程占用.
更改方法为表复制时分别复制锁前和锁后内容,复制过程不能更改目的表锁的值.

修改情况如下:
原有程序中表复制方法的实现:

pthread_rwlock_t l_temp_lock=l_dest_table->m_rwlock;
memcpy(l_dest_table,l_source_table,sizeof(i_ServeUserTable_TCP));
l_dest_table->m_rwlock=l_temp_lock;

修改后表复制方法的实现:

memcpy(l_dest_table,l_source_table,8);  //先复制读写锁前8个字节(32位与64位读写锁前均为8个字节)
        memcpy(((char*)l_dest_table+SERVE_USER_TABLE_OFFSET),((char*)l_source_table+SERVE_USER_TABLE_OFFSET),
               (sizeof(i_ServeUserTable_TCP)-SERVE_USER_TABLE_OFFSET)); //再复制读写锁后面的所有字节
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值