size
size_t_梁斌_新浪博客size_t_梁斌_新浪博客
size_tposted on 2013-01-01 10:57 lexus 阅读( ...) 评论( ...) 编辑 收藏
(2012-10-10 19:12:39)
转载▼
标签:
杂谈
今天我来讲讲size_t,借此来说明我的一些代码风格。
我们都知道size_t这个是为移植性服务的,32位系统是32位无符号整形,64位系统是64位无符号整形。比如我举个例子
A:
size_t add_32_t(unsigned int op1, unsigned int op2)
{
return op1 + op2;
}
B:
uint64_t add_32_t(uint32_t op1, uint32_t op2)
{
return op1 + op2;
}
再比如一个数据结构
A:
struct XXX //这个XXX可以看作是一个可变长度的块的块头
{
char name[NAME_SIZE];
size_t record_cnt //record_cnt记录了record数组的大小
YYY record[0]
}
B:
struct XXX //这个XXX可以看作是一个可变长度的块的块头
{
char name[NAME_SIZE];
uint32_t record_cnt //record_cnt记录了record数组的大小
YYY record[0]
}
哪一种代码好呢?我喜欢带数字的整形类型的(stdint.h)中定义的,因为这个不用思考,我在编码的时候看到的是uint32_t,那么写这个代码的当事人就考虑了全部可能的溢出,size等问题。如果是size_t,那么这个头部的大小是不确定的(在不同系统中),而且溢出的情况也是不确定的。
大家可以用facebook开源的folly代码,grep size_t *.h *.cpp 在grep一下 uint32_t 和 uint64_t就能体会出区别。
有的人一天写30行代码,有的人一天写300行代码,如果你写得多,一定用一些简单,可靠的方法来保证尽可能的少犯错误,不要为什麽移植性来考虑,这个都是库函数程序员考虑的问题,我编码这么多年,要说遇到代码有移植性的这个需求的,也非常罕见,有几个人会把32位下的代码移植到64位上来,或者64位的移植到32位上,起码,我绝少遇到。
最后在举个例子
比如我在64位程序下写了这么个函数
bool XXX(uint32_t xxx,uint32_t yyy){}
那么这个函数移植到32位系统,其工作的结果也是你可以预期的,和64位一样
但如果
bool XXX(size_t xxx, size_t yyy){}
这个函数移植到32位系统,运行结果也是可以预期的嘛?
所以,同志们,我建议用确定的东西,不要用不确定的东西。不过你们也要独立思考,不要被我忽悠,我只是分享我的一些经验,也许是错误的,不合适的,但这个确实是合适我的,起码我放心。
转载于:.html
size
size_t_梁斌_新浪博客size_t_梁斌_新浪博客
size_tposted on 2013-01-01 10:57 lexus 阅读( ...) 评论( ...) 编辑 收藏
(2012-10-10 19:12:39)
转载▼
标签:
杂谈
今天我来讲讲size_t,借此来说明我的一些代码风格。
我们都知道size_t这个是为移植性服务的,32位系统是32位无符号整形,64位系统是64位无符号整形。比如我举个例子
A:
size_t add_32_t(unsigned int op1, unsigned int op2)
{
return op1 + op2;
}
B:
uint64_t add_32_t(uint32_t op1, uint32_t op2)
{
return op1 + op2;
}
再比如一个数据结构
A:
struct XXX //这个XXX可以看作是一个可变长度的块的块头
{
char name[NAME_SIZE];
size_t record_cnt //record_cnt记录了record数组的大小
YYY record[0]
}
B:
struct XXX //这个XXX可以看作是一个可变长度的块的块头
{
char name[NAME_SIZE];
uint32_t record_cnt //record_cnt记录了record数组的大小
YYY record[0]
}
哪一种代码好呢?我喜欢带数字的整形类型的(stdint.h)中定义的,因为这个不用思考,我在编码的时候看到的是uint32_t,那么写这个代码的当事人就考虑了全部可能的溢出,size等问题。如果是size_t,那么这个头部的大小是不确定的(在不同系统中),而且溢出的情况也是不确定的。
大家可以用facebook开源的folly代码,grep size_t *.h *.cpp 在grep一下 uint32_t 和 uint64_t就能体会出区别。
有的人一天写30行代码,有的人一天写300行代码,如果你写得多,一定用一些简单,可靠的方法来保证尽可能的少犯错误,不要为什麽移植性来考虑,这个都是库函数程序员考虑的问题,我编码这么多年,要说遇到代码有移植性的这个需求的,也非常罕见,有几个人会把32位下的代码移植到64位上来,或者64位的移植到32位上,起码,我绝少遇到。
最后在举个例子
比如我在64位程序下写了这么个函数
bool XXX(uint32_t xxx,uint32_t yyy){}
那么这个函数移植到32位系统,其工作的结果也是你可以预期的,和64位一样
但如果
bool XXX(size_t xxx, size_t yyy){}
这个函数移植到32位系统,运行结果也是可以预期的嘛?
所以,同志们,我建议用确定的东西,不要用不确定的东西。不过你们也要独立思考,不要被我忽悠,我只是分享我的一些经验,也许是错误的,不合适的,但这个确实是合适我的,起码我放心。
转载于:.html