FOREACH 宏之GCC实现
2010-11-20 16:37:08 来源:WEB开发网核心提示:最简单的foreach实现(VC & GCC)java中的foreach用法这个FOREACH使用了GCC的扩展特性typeof和({}),所以只保证能在linux下玩哦,FOREACH 宏之GCC实现,源程序 foreach.h #ifndef _MACRO_FOREACH_H_#define _MACRO_FORE
这个FOREACH使用了GCC的扩展特性typeof和({}),所以只保证能在linux下玩哦。
源程序 foreach.h
#ifndef _MACRO_FOREACH_H_
#define _MACRO_FOREACH_H_
#define FOREACH_USE_ITERATOR(each_var, it_begin, it_end) \
for(typeof(it_begin) it = it_begin, iend = it_end; it!=iend; ++it)\
for(typeof(*it) each_var = *it; 1; __extension__({break;}) )
#define FOREACH_USE_STL_CONTAINER(each_var, container) \
FOREACH_USE_ITERATOR(each_var, container.begin(), container.end())
#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
#define ARRAY_BEGIN(array) (array+0)
#define ARRAY_END(array) (array+ARRAY_SIZE(array))
#define EACH_ARRAY(each_var, array)\
FOREACH_USE_ITERATOR(each_var, ARRAY_BEGIN(array), ARRAY_BEGIN(array))
#define FOR FOREACH_USE_ITERATOR
#define FOREACH FOREACH_USE_STL_CONTAINER
#define foreach FOREACH
#endif //_MACRO_FOREACH_H_
测试代码 foreach.test.cpp
#include <map>
#include "foreach.h"
using namespace std;
void test1(int);
void test2(int);
map<int, int> c;
int main(int argc, char **argv) {
if(argc<4) {
printf("too less param, input 3 params!\n");
return 0;
}
int sel = atoi(argv[1]);
void (*test)(int) = NULL;
switch(sel) {
case 1:
test = test1;
break;
case 2:
test = test2;
break;
}
int num = atoi(argv[2]);
for(int i =0; i<num; ++i) {
c[i]=i;
}
int len = atoi(argv[3]);
for(int i =0; i<len; ++i) {
test(num);
}
}
void test1(int num){
int s = 0;
foreach(const & a, c)
{
s+=(a.first+a.second);
}
}
void test2(int num){
int s = 0;
map<int, int>::iterator it = c.begin(), iend = c.end();
for(;it!=iend; ++it)
{
pair<int, int> const &a = *it;
s+=(it->first + it->second);
}
}
编译
g++ -O2 ./foreach.test.cpp -o foreach
测试
foreach宏: time ./foreach 1 10000 50000
real 0m5.288s
user 0m5.241s
sys 0m0.015s
标准for循环: time ./foreach 2 10000 50000
real 0m5.600s
user 0m5.533s
sys 0m0.031s
测试结果很让人吃惊,竟然宏版本还更快。 有时间要用 IDA看一下反汇编代码了。
早期实现
一开始不知道gcc 的 __extension__ 关键字,FOREACH_USE_ITERATOR实现的方式如下:
#define FOREACH_USE_ITERATOR(each_var, it_begin, it_end) \
typeof(it_begin) FOREACH_VAR(it) = it_begin;\
typeof(it_end) FOREACH_VAR(iend) = it_end; \
if(likely(FOREACH_VAR(it)!=FOREACH_VAR(iend))){ \
goto FOREACH_LABLE( into ); \
}else {\
goto FOREACH_LABLE( exit );\
}\
FOREACH_LABLE( exit ) :\
if(0)\
FOREACH_LABLE( into ) :\
for(typeof(*FOREACH_VAR(it)) each_var = *FOREACH_VAR(it);\
1;\
({\
++FOREACH_VAR(it);\
if(likely(FOREACH_VAR(it) != FOREACH_VAR(iend))){ \
goto FOREACH_LABLE( into );\
}else {\
goto FOREACH_LABLE( exit );\
}; 1;\
})\
)
- ››gcc内置的for each
- ››FOREACH 宏之GCC实现
- ››宏博CMS教程:添加文章的时候,如何给上传的图片加...
- ››宏博CMS教程:如何查看会员的数字ID?
- ››宏博CMS教程:如何添加广告代码?自定义标记中的“...
- ››宏博CMS教程:自定义标记适合放哪些广告代码?
- ››宏博CMS教程:阅读文章无权限的提示,如何设置个性...
- ››宏博CMS教程:何给首页添加幻灯片(图片翻滚特效)...
- ››宏博CMS教程:什么是远程链接seo?有什么作用?
- ››宏博CMS教程:如何上传flash文件在网页中播放
- ››宏博CMS教程:文章采集到了HBCMS后,还需要做什么...
- ››宏博CMS教程:服务器负载说明和对应的HBcms操作指...
更多精彩
赞助商链接
