天使的白骨
给我一个EMACS,我不需要操作系统
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(16)
给我留言
查看公开留言
查看私人留言
随笔分类
(49)
C++ lisp perl ruby python(15)
(rss)
EMACS,飞(1)
(rss)
linux(6)
(rss)
QNX(2)
(rss)
server(2)
(rss)
技术简历
(rss)
开源项目(8)
(rss)
量子计算机(1)
(rss)
设计模式(14)
(rss)
随笔档案
(61)
2018年12月 (1)
2017年7月 (1)
2017年4月 (1)
2017年3月 (1)
2017年1月 (1)
2016年7月 (2)
2016年3月 (1)
2015年10月 (1)
2015年6月 (1)
2015年4月 (2)
2015年1月 (2)
2014年11月 (1)
2014年10月 (2)
2014年9月 (1)
2014年8月 (2)
2014年7月 (1)
2014年6月 (4)
2014年5月 (1)
2014年4月 (1)
2014年1月 (9)
2013年12月 (8)
2013年10月 (2)
2013年9月 (1)
2013年7月 (1)
2013年5月 (1)
2013年4月 (1)
2013年3月 (1)
2012年9月 (1)
2012年3月 (2)
2012年2月 (2)
2011年11月 (1)
2011年9月 (2)
2011年7月 (1)
2010年5月 (1)
文章分类
(18)
algorithm and structure(2)
(rss)
Linux(13)
(rss)
软件工程与架构(1)
(rss)
正则表达式(2)
(rss)
文章档案
(34)
2018年12月 (1)
2016年9月 (1)
2015年1月 (1)
2014年7月 (1)
2014年6月 (1)
2014年5月 (1)
2013年9月 (2)
2013年6月 (1)
2013年4月 (3)
2013年3月 (2)
2012年12月 (2)
2012年10月 (2)
2012年9月 (1)
2012年8月 (2)
2012年3月 (2)
2012年1月 (1)
2011年11月 (1)
2011年9月 (1)
2011年7月 (1)
2011年6月 (3)
2011年4月 (1)
2010年11月 (2)
2010年9月 (1)
嵌入式
媒体播放器的三大底层架构
101条计算机经典语录
ajax教程
ajax向服务器发送请求
Biologically Motivated Programming Technology for Robust Systems
Chrome的进程间通信
chrome多进程架构
emacs cscope配置
emacser cedet
GStreamer 简化 Linux 多媒体开发
gstreamer插件开发指南
iptable配置
pyQt
pyQt examples
python官方学习手册
slime--common lisp与emacs的集成开发
stackoverflow
UNIX技术网
VI使用手册
vlc hacker guide
vlc播放器官方地址
非常优秀的书:开源软件的架构
开源中国
嵌入式的一些关键点,这个作者的文章不错
清除svn保存的username用户名和paasword密码(windows和linux)
使用emacs开发iPhone应用程序
心理学
软件工程
项目延时的主要原因
描述了项目延时的几个重大可能因素
算法
MapReduce----google核心并行图算法
搜索
最新评论
1. re: UINavigationController的使用,隐藏,定制
不错
--臂化羽
2. re: 谈谈MVVM和MVC,使用swift集成RFP框架(ReactiveCocoa)
嗯,我后来就没怎么用。rac。现在开始用了。把作者写的那个struct直接拷贝过来了。再一次为作者点赞!
--言十年
3. re: 谈谈MVVM和MVC,使用swift集成RFP框架(ReactiveCocoa)[未登录]
@laznrbfe
@猴子
@言十年
我已经更过github上的代码了
--何清龙
4. re: 谈谈MVVM和MVC,使用swift集成RFP框架(ReactiveCocoa)
Swift2.0的分享失效了。
我的QQ:912692610.
希望得到你的帮助。
--laznrbfe
5. re: 谈谈MVVM和MVC,使用swift集成RFP框架(ReactiveCocoa)
@言十年
希望得到2.0的代码进行学习.十分感谢.214449165@qq.com
--猴子
6. re: 谈谈MVVM和MVC,使用swift集成RFP框架(ReactiveCocoa)
评论内容较长,点击标题查看
--言十年
7. re: json自动生成代码(object-c、java、 C#、C++)[未登录]
大叔大婶
--111
8. re: UINavigationController的使用,隐藏,定制[未登录]
@Keater
我没有两者一起用过,我们的滑动返回由其他人做成全局的了,统一在UINavigationController的子类中处理
--何清龙
9. re: UINavigationController的使用,隐藏,定制
评论内容较长,点击标题查看
--Keater
10. re: EMACS配置(.emacs)
评论内容较长,点击标题查看
--何清龙
11. re: EMACS配置(.emacs)
@马前进
可以交流,我试过,但是有点忘了
--何清龙
12. re: EMACS配置(.emacs)
我想使用emacs进入交叉调试,能指导下吗。使用的gdb是针对arm平台的。
--马前进
13. re: 不分配动态内存翻转单向链表
@落单的毛毛虫
你的代码更简洁,原理还是一样的
--何清龙
14. re: 不分配动态内存翻转单向链表
评论内容较长,点击标题查看
--落单的毛毛虫
15. re: 不分配动态内存翻转单向链表[未登录]
冒泡排序的思想?
--kk
16. re: 苹果新语言swift的通盘整理
@mybios
比object-c好一点,说实话,可读性不行,写起来倒是挺快的,他有函数编程能力,这点不错,其他的可有可无,模板做得烂。
--何清龙
17. re: 苹果新语言swift的通盘整理[未登录]
又一个苹果出的新版反人类语言。
--mybios
18. re: 苹果新语言swift的通盘整理
thx`
--java论坛
19. re: 苹果新语言swift的通盘整理
@java论坛
这个语言刚出来几天
--何清龙
20. re: 苹果新语言swift的通盘整理
swift?
你写的是什么语言,我怎么看不懂
http://www.itqx.net
--java论坛
评论排行榜
1. 年底了,说说我退出创业后的感想(12)
2. chrome代码里面发现的好东西,很有意思。想了好久,目前也只有这个解释了--为了更安全(11)
3. 近期计划(8)
4. QT相框,发布点代码,有兴趣的随便研究(7)
5. 苹果新语言swift的通盘整理(7)
Powered by:
博客园
模板提供:
沪江博客
C++博客
|
首页
|
发新随笔
|
发新文章
|
联系
| |
管理
chrome代码里面发现的好东西,很有意思。想了好久,目前也只有这个解释了--为了更安全
先请各位看看代码,思考一下,这里的代码是做什么的?
template
<
typename T, size_t N
>
char
(
&
ArraySizeHelper(T (
&
array)[N]))[N];
//
没有定义,只做了声明
//
That gcc wants both of these prototypes seems mysterious. VC, for
//
its part, can't decide which to use (another mystery). Matching of
//
template overloads: the final frontier.
#ifndef _MSC_VER
template
<
typename T, size_t N
>
char
(
&
ArraySizeHelper(
const
T (
&
array)[N]))[N];
#endif
#define
arraysize(array) (sizeof(ArraySizeHelper(array)))
int
a[
10
]
int
size
=
arraysize(a);
//
这里能够求出a的大小
这个代码比普通的sizeof(a)/sizeof(int)更安全,它避免了我们做这样的操作:
int
a[
10
]
int
*
p
=
a;
int
size
=
arraysize(p);
//
不可行
size
=
arraysize(a);
//
可行
利用模板获得一个数组的引用,返回对应的char类型的数组引用再对char类型的数组求大小,不用求sizeof(T),代替了了除法运算和两次求值sizeof(),不知道这个会不会影响编译时的效率
根
template
<
typename T, size_t N
>
char
(
*
ArraySizeHelper(
const
T (
&
array)[N]))[N];
#define
arraysize(array) (sizeof(*ArraySizeHelper(array)))
据waiting4you的评论,也可以这样做:
对于老的编译器,不允许返回数组的引用,但是返回指针数组应该是没有问题的,入口参数传递数组的引用也没有问题
发表于 2011-09-22 10:51
何清龙
阅读(2793)
评论(11)
编辑
收藏
引用
所属分类:
开源项目
评论
#
re: chrome里面发现的好东西,很有意思。使用模板技术来优化编译器编译期的时间
回复
更多评论
很有趣,学习了!
#
re: chrome里面发现的好东西,很有意思。使用模板技术来优化编译器编译期的时间
回复
更多评论
是编译器更快还是运行期更快? 模版对编译器来说快不了的.
这个用法在 <<Imperfect C++>> 中有说明, 并不是什么新东西. 也不是为了提高速度, 而是为了更安全, 对于重载了 operator[] 的自定义对象, 退化成指针的数组这些, sizeof(a)/sizeof(a[0]) 可能产生错误的结果. 详见 <<Imperfect C++>> 第 14 章 2, 3 节.
并且, Imperfect C++ 中并不推荐这种用法, 而是由另外的方法, 因为这种用法对编译器的兼容性不好, 原文如下:
I should point out there's a slightly shorter (albeit harder to decipher) way to implement dimensionof(), as follows:
template<typename T, int N>
byte_t (&byte_array_of_same_dimension_as(T (&)[N]))[N];
#define dimensionof(x) sizeof(byte_array_of_same_dimension_as((x)));
Unfortunately this is recognized by fewer compilers[6] so I recommend the first form.
#
re: chrome里面发现的好东西,很有意思。使用模板技术来优化编译器编译期的时间
回复
更多评论
是的,这个并不能提升编译速度,而且编译速度一般来说并没有太大的意义
这个的关键是类型安全
#
re: chrome里面发现的好东西,很有意思。使用模板技术来优化编译器编译期的时间
回复
更多评论
@adie
原本我也认为他对指针可以求出数组自身的大小,但是原理上似乎行不通,因为即使拿到一个引用,也是引用了指向数组的指针的引用,并没有引用到数组本身。编译器的sizeof是在编译期求的。你说的第二点应该是它的目的之一
#
re: chrome里面发现的好东西,很有意思。使用模板技术来优化运行时间
回复
更多评论
性能无关。都是编译器的事情。
#
re: chrome里面发现的好东西,很有意思。使用模板技术来优化运行时间
回复
更多评论
编译期间的事情。运行期代价一致。
#
re: chrome里面发现的好东西,很有意思。哈哈,被各位老大搅晕了,不知道这个代码到底有什么好处
回复
更多评论
sizeof(a)/sizeof(int)也同样是编译时 的东西。
#
re: chrome里面发现的好东西,很有意思。哈哈,被各位老大搅晕了,不知道这个代码到底有什么好处[未登录]
回复
更多评论
有点儿晕乎
#
re: chrome里面发现的好东西,很有意思。想了好久,也只有这个就是了--为了更安全
回复
更多评论
如下形式使用时编译不过:
int a[10];
int* p = a;
int size = arraysize(a);
所以sizeof的形式安全一些,sizeof(p)/sizeof(p[0])得到的是一个错误的结果。
另外敲起代码来会快那么一点点
#
re: chrome里面发现的好东西,很有意思。想了好久,目前也只有这个解释了--为了更安全,在传递指向数组的指针时,会报错。
回复
更多评论
这个不是传说中的ARRAYSIZE吗?winnt.h的定义是这样的,与楼主一起学习:
//
// RtlpNumberOf is a function that takes a reference to an array of N Ts.
//
// typedef T array_of_T[N];
// typedef array_of_T &reference_to_array_of_T;
//
// RtlpNumberOf returns a pointer to an array of N chars.
// We could return a reference instead of a pointer but older compilers do not accept that.
//
// typedef char array_of_char[N];
// typedef array_of_char *pointer_to_array_of_char;
//
// sizeof(array_of_char) == N
// sizeof(*pointer_to_array_of_char) == N
//
// pointer_to_array_of_char RtlpNumberOf(reference_to_array_of_T);
//
// We never even call RtlpNumberOf, we just take the size of dereferencing its return type.
// We do not even implement RtlpNumberOf, we just decare it.
//
// Attempts to pass pointers instead of arrays to this macro result in compile time errors.
// That is the point.
//
extern "C++" // templates cannot be declared to have 'C' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];
#define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A)))
...
#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A)
...
#define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)
#
re: chrome里面发现的好东西,很有意思。想了好久,目前也只有这个解释了--为了更安全
回复
更多评论
@waiting4you
恩,看了你的评论,又增长了一些知识
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
人工智能分类笔记 《哥德尔-埃舍尔-巴赫》
solve crosse language of object-c & swift UIScrollViewDelegate/UITableViewDelegate rac_signalForSelector("scrollViewDidEndDragging:willDecelerate:") crash
谈谈MVVM和MVC,使用swift集成RFP框架(ReactiveCocoa)
jsonRPC的curl命令行使用,python使用,object-c使用
ios上opencv的图像特征点检测,核心代码。如果你做的更完善了,希望能反馈给我
移植QT到QNX
VLC播放器架构剖析
chrome代码里面发现的好东西,很有意思。想了好久,目前也只有这个解释了--为了更安全
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理