Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493761
  • 博文数量: 41
  • 博客积分: 4007
  • 博客等级: 中校
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 15:43
文章分类

全部博文(41)

文章存档

2011年(13)

2010年(14)

2009年(2)

2008年(12)

分类: C/C++

2009-09-30 12:14:43

从本帖开始,我将把在阅读《OReilly.Understanding.MySQL.Internals.Apr.2007》的笔记以及我自己的一些理解进行连载,本贴介绍编写MySQL代码时的注意事项。
 
编写MySQL代码需注意的地方
稳定性要求:
下面的几条是在MySQL添加代码时,为了保持代码的健壮和稳定,所需要遵守的。
1) 永远都要记住,你的代码是运行在一个线程中的,所以必须遵守线程安全规则;
2) 绝大多数全局变量都有一个相对应的互斥锁,在线程中访问这些全局变量之前都会先去获取这个锁。搞清楚所有这些与全局变量相关的锁,并在访问全局变量时获取对应的锁;
3) 要注意,可用的栈空间是非常小的,大于100字节的内存空间需要使用sql_alloc()或my_malloc()申请;
4) 如果可能,在申请小空间时,尽量使用sql_alloc()进行分配,而不是my_malloc()。sql_alloc()是从会话连接的线程池中分配内存的,而my_malloc()仅仅是对标准malloc()的包装,sql_alloc()可以在do_command()内调用的函数中任意位置使用。sql_alloc()分配的内存只持续到查询结束,如果想要获取永久内存块,则需要my_malloc()进行分配;
5) 使用my_malloc()分配大内存,并且要尽快的使用my_free()释放掉;
6) 不要释放sql_alloc()分配的内存,内存池在查询结束时会一次释放完毕;
7) 如果指针指向的内存是使用my_malloc()分配的,则需要用my_free()释放;
8) 不要使用异常,代码在编译时都会禁止异常;
9) 不要使用STL、iostream或其他任何C++扩展库,即不要连接libstdc++库;
10) 不要引入依赖额外的外部库;
11) 尽量重用MySQL的代码。
可移植性要求:
1) 不要直接使用libc,而使用mysql的封装mysys和strings,通常情况,mysys中的包裹函数去掉my_前缀后与libc中的名字相同,例如,my_open(),my_close(),my_malloc(),my_free()。
2) 要注意在不同系统上字节序的不同。使用类似int4store()、int4korr()的宏将需要在不同系统间共享或传递的数据进行存储。
3) 注意对齐,不要将一个整型变量直接赋值给一块内存空间:*((char *)p+1)=n,而使用memcpy((char *)p+1, &n, 4),或使用机器相关的字节序宏:int4store((char *)p+1, n)。
4) 当引进一种新的系统或编译器相关的优化措施,保证相关的代码用$ifdef括起来,并且提供当这种优化不可用时使用的代码。
5) 不要将C++风格的注释放到C源文件中,即使一些C编译器支持这么做。
6) 如果要使用字节大小的变量,使用include/my_global.h中预定义的类型(eg., uint8, uint32)。
编码风格:
1) 遵循internals.html中的规定;
2) 不要格式化不是你写的代码;
3) 函数中,返回0表示成功,非0表示失败;
4) 如果可能,使用下面的语法来调用几个函数,利用短路效应:if (a()||b()||c()) go err;;
5) 使用TRUE和FALSE而不是true和false;
6) 在C文件中使用my_bool,C++中使用bool;
7) 在C++文件中使用指针而不是引用;
8) 写优化了的代码,即使该段代码对运行性能要求不高。
阅读(1949) | 评论(0) | 转发(0) |
0

上一篇:工作两年总结

下一篇:工作三年总结

给主人留下些什么吧!~~