WEB开发网
开发学院软件开发C语言 FOREACH 宏之GCC实现 阅读

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实现(VC & GCC)

java中的foreach用法

这个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;\
        })\
    )

Tags:FOREACH GCC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接