首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

用宏定义仍是函数

2013-12-04 
用宏定义还是函数?一个类有30个成员函数,每个成员函数开头都是这段代码:if(count 0){int ret init()

用宏定义还是函数?
一个类有30个成员函数,每个成员函数开头都是这段代码:
if(count == 0)
{
    int ret = init();
    if(ret == fail)
    {
        return 1;
    }
}
if(count == 1)
{
    int ret = create();
    if(ret == fail)
    {
        return 1;
    }
}

为了简化代码,有两个方法
1、用宏,将上面的代码封起来。
2、写一个函数
 int check()
{
    if(count == 0)
    {
        int ret = init();
        if(ret == fail)
        {
            return 1;
        }
    }
    if(count == 1)
    {
        int ret = create();
        if(ret == fail)
        {
            return 1;
        }
    }
    return 0;
}

用宏可以简化,但是感觉很别扭,因为宏里有两个函数。一般宏只是定义个常值或者固定的运算,一般不带函数较好吧。
用函数的话,感觉效率会低一些

大家说说该怎么办比较好? C++ 宏
[解决办法]
inline function 效率没有问题的。
[解决办法]

引用:
调用的一个函数的代价都计较,你也太抠了。

在某些情况下,必须计较啊
[解决办法]
就老老实实写一个函数,代替如下:
inline int f(int count) {
  int ret = 0;
  if (count == 0) {
    ret = init();
  } else if (count == 1) {
    ret = create();
  }

  return ret == fail ? 1 : 0;
}


inline起不起作用编译器说了算
[解决办法]
你这都改变楼主原代码的语义了
引用:
虽然本身没有本质性的变化,但这样写可能更好看一点,效率的话inline应该没问题。

int ret= count==0?init():create();
return ret==fail?1:0;

[解决办法]
引用:
你这都改变楼主原代码的语义了
Quote: 引用:

虽然本身没有本质性的变化,但这样写可能更好看一点,效率的话inline应该没问题。

int ret= count==0?init():create();
return ret==fail?1:0;

好吧...count必须要为1和0,没注意
[解决办法]
不要纠结性能问题了,我敢打赌这里不会成为你整个程序的瓶颈。
现在计算密集型的程序已经很少了,都是IO bound,没有必要考虑这些琐屑无味的事情。
连这里都真的要考虑了,那你的程序应该是汇编写的啊。

引用:
Quote: 引用:

看看楼主写这个代码和他的设计,到了去考虑一个函数调用的代价的阶段了嘛,这简直南辕北辙,丢西瓜找芝麻。

Quote: 引用:

Quote: 引用:

调用的一个函数的代价都计较,你也太抠了。

在某些情况下,必须计较啊


代码规范问题你就别看了,我随便写的。设计也是没问题的,因为这个类是对外接口,有些东西必须由接口本身自己保证,所以那些重复代码是必须的。同时,接口调用是非常频繁的,对处理速度要求较高。

[解决办法]
我觉着编译器可能会拒绝,我以前听说过有if, while, for 语句的代码很可能不会被内联,不过我从来没有验证过,也没有看到权威的说辞。

引用:
Quote: 引用:

就老老实实写一个函数,代替如下:
inline int f(int count) {
  int ret = 0;
  if (count == 0) {
    ret = init();
  } else if (count == 1) {
    ret = create();
  }

  return ret == fail ? 1 : 0;
}


inline起不起作用编译器说了算


这个函数很短,而且已if判断来决定是否调用函数,编译器应该不会拒绝吧,总之inline也算一个较好的办法


[解决办法]

[解决办法]


我不是来吵架的,所以不想反驳你什么,我只说我是来这里向前辈们学习的,请教问题。

一个人说的话,做的事,无论看似多好,总会有人对你指指点点。当然,无论别人怎么说,无可厚非,关键是自己怎么去权衡其好坏。就像你刚才说的“我不是来吵架的”,其实别人也只是那么随口一说,不用那么在意的,是忠言逆耳,还是挖苦讽刺,也许并不那么重要。大家都是抱着一颗学习的心态来交流的,不是么?
[解决办法]
如果 init 和 create 代码量大的话 没必要考虑用 宏了
使用宏的场合,频繁调用的和 代码不复杂的
[解决办法]
楼主要优化自是要优化,至于需不需要优化是楼主要考虑的事情不是你们要给楼主的建议,
楼主要是问宝马夏利买哪个你们也会劝楼主不要买车吗?

没有必要使用宏,一定要内联的话.MSVC请使用__forceinline,GCC使用__attribute__((always_inline)),
加入这个东西,编译器必须inline当前函数,如果不能inline,将给出编译警告例如:"XXX函数内联失败".
不能inline一个forcedinline的情况非常非常少.GCC一般都会成功,MSVC在函数内部创建新对象的
时候有可能否决forceinline.但会给出提示.
[解决办法]
不如效率问题不是特别明显的话,建议用函数,
宏在预编译期就完成了的事情,所以很多错误会让人束手无策的!
[解决办法]

这完全可以提前验证一下。但是前提是楼主写的代码是最终形式,不然这种优化是没意义的。
所以一般不建议过早的优化程序。
[解决办法]


if (count<0 
[解决办法]
 1<count) return 0;
int *F[2](void)={init,creat};
if (fail == F[count]()) return 1;
//...


您这代码有问题吧?count为0的时候就返回0了?不是应该执行init的吗?另外如果像47楼说的那种情况,这个代码就达不到要求,无法顺序执行init和create,至少违背了楼主的原意。
[解决办法]
我觉得inline函数会好一点
[解决办法]



[解决办法]


[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

就老老实实写一个函数,代替如下:
inline int f(int count) {
  int ret = 0;
  if (count == 0) {
    ret = init();
  } else if (count == 1) {
    ret = create();
  }

  return ret == fail ? 1 : 0;
}


inline起不起作用编译器说了算


这代码改变楼主的本意了吧?0和1并不是if。。。else。。。的关系。可能init()处理完了之后count就变成1了。按照楼主以前的代码连着执行了init和create,但是这个代码就达不到楼主的要求了。

按照楼主提供的代码是完全可以的,这里一点都没有歪曲楼主的意思。


可能是这2种情况,1、楼主是随便写写的,所以没有加两个if之间的中间代码。2、楼主没有写成if-else形式。


我觉得是你的需求分析错了。如果init和create只执行一个就可以继续下面的代码了,那么有必要设计2个函数吗?

我都说了是根据楼主提供的代码了,你如何分析出init执行后count会变成1?如果保持不变,那么下面的代码就是无意义的多跑了一遍不是么?有问题么?
[解决办法]

等楼主回来再说吧,还是57楼说的对,就怕楼主去北京。他都跑了,我们在这里讨论的都是无根之水,没意义的用宏定义仍是函数
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

就老老实实写一个函数,代替如下:
inline int f(int count) {
  int ret = 0;
  if (count == 0) {
    ret = init();
  } else if (count == 1) {
    ret = create();
  }

  return ret == fail ? 1 : 0;
}


inline起不起作用编译器说了算


这代码改变楼主的本意了吧?0和1并不是if。。。else。。。的关系。可能init()处理完了之后count就变成1了。按照楼主以前的代码连着执行了init和create,但是这个代码就达不到楼主的要求了。

按照楼主提供的代码是完全可以的,这里一点都没有歪曲楼主的意思。

可能是这2种情况,1、楼主是随便写写的,所以没有加两个if之间的中间代码。2、楼主没有写成if-else形式。

我觉得是你的需求分析错了。如果init和create只执行一个就可以继续下面的代码了,那么有必要设计2个函数吗?


实际情况是:对于一种情况,执行init;对于另一种情况,执行create;对于第三种情况,执行后面的代码。
init和create可能执行其中一个,也可能都不执行,但是不会同时执行。设计两个函数完全是因为实际需求来的~

Sorry,我又错了。
[解决办法]
函数指针数组的效率在分支比较多时(比如10个以上时)通常比if-else语句高。
就象switch语句在case比较多时会被编译器优化为跳转表(即函数指针数组)一样。
[解决办法]
如果真的考虑性能的话,或许也不是从用宏或者函数开始, 而是怎么可以避免每次调用都进行检查。 如果每次调用进行检查这件事情完全可以接受,那宏或函数理论上也不应该值得纠结。

宏的缺点是不能提供很好的编译时类型检查,Debug时也不方便。我个人倾向于尽量不使用宏,使用const/typedef/template来取代。这当然有点过于保守,但人多了之后规矩越严格越好执行。 那种 XXX_BEGIN 配合 XXX_END 的宏更是大忌。我再次强调我比较保守,意见可能比较主观。

内联函数确实不能保证,用一些compiler specific的技术有时倒也可以接受。 但如果一个函数编译器决定无视inline(据说现代编译器都直接无视)不执行内联的话,说明内联所带来的效率提升确实微不足道。楼主这种情况,我肯定是用函数了。有些事情编译器作得通常比人好(比如楼上各位谈论的jump table,有时,编译器会拒绝使用jump table,因为它太慢了)。
[解决办法]
纠正上帖:
No programs run faster than no program.

热点排行