用宏定义还是函数?

xdh0817 2013-12-01 08:15:48
一个类有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;
}

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

大家说说该怎么办比较好?
...全文
964 77 打赏 收藏 转发到动态 举报
写回复
用AI写文章
77 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdh0817 2013-12-05
  • 打赏
  • 举报
回复
引用 76 楼 zhao4zhong1 的回复:
是代码混淆吧。
恩,对。什么原理啊
赵4老师 2013-12-04
  • 打赏
  • 举报
回复
是代码混淆吧。
xdh0817 2013-12-04
  • 打赏
  • 举报
回复
引用 71 楼 zhao4zhong1 的回复:
No programs run fast than no program.
请教一下,代码扰乱是什么原理啊?
xdh0817 2013-12-03
  • 打赏
  • 举报
回复
引用 70 楼 u012908616 的回复:
如果真的考虑性能的话,或许也不是从用宏或者函数开始, 而是怎么可以避免每次调用都进行检查。 如果每次调用进行检查这件事情完全可以接受,那宏或函数理论上也不应该值得纠结。 宏的缺点是不能提供很好的编译时类型检查,Debug时也不方便。我个人倾向于尽量不使用宏,使用const/typedef/template来取代。这当然有点过于保守,但人多了之后规矩越严格越好执行。 那种 XXX_BEGIN 配合 XXX_END 的宏更是大忌。我再次强调我比较保守,意见可能比较主观。 内联函数确实不能保证,用一些compiler specific的技术有时倒也可以接受。 但如果一个函数编译器决定无视inline(据说现代编译器都直接无视)不执行内联的话,说明内联所带来的效率提升确实微不足道。楼主这种情况,我肯定是用函数了。有些事情编译器作得通常比人好(比如楼上各位谈论的jump table,有时,编译器会拒绝使用jump table,因为它太慢了)。
哦哦哦
xdh0817 2013-12-03
  • 打赏
  • 举报
回复
引用 72 楼 zhao4zhong1 的回复:
纠正上帖: No programs run faster than no program.
哈哈,这个是马甲?
赵4老师 2013-12-03
  • 打赏
  • 举报
回复
纠正上帖: No programs run faster than no program.
赵4老师 2013-12-03
  • 打赏
  • 举报
回复
No programs run fast than no program.
Todd_Pointer 2013-12-02
  • 打赏
  • 举报
回复
如果真的考虑性能的话,或许也不是从用宏或者函数开始, 而是怎么可以避免每次调用都进行检查。 如果每次调用进行检查这件事情完全可以接受,那宏或函数理论上也不应该值得纠结。 宏的缺点是不能提供很好的编译时类型检查,Debug时也不方便。我个人倾向于尽量不使用宏,使用const/typedef/template来取代。这当然有点过于保守,但人多了之后规矩越严格越好执行。 那种 XXX_BEGIN 配合 XXX_END 的宏更是大忌。我再次强调我比较保守,意见可能比较主观。 内联函数确实不能保证,用一些compiler specific的技术有时倒也可以接受。 但如果一个函数编译器决定无视inline(据说现代编译器都直接无视)不执行内联的话,说明内联所带来的效率提升确实微不足道。楼主这种情况,我肯定是用函数了。有些事情编译器作得通常比人好(比如楼上各位谈论的jump table,有时,编译器会拒绝使用jump table,因为它太慢了)。
tigertianx 2013-12-02
  • 打赏
  • 举报
回复
学习了,谢谢各位
xdh0817 2013-12-02
  • 打赏
  • 举报
回复
引用 34 楼 max_min_ 的回复:
不如效率问题不是特别明显的话,建议用函数, 宏在预编译期就完成了的事情,所以很多错误会让人束手无策的!
恩。
xdh0817 2013-12-02
  • 打赏
  • 举报
回复
引用 33 楼 menzi11 的回复:
楼主要优化自是要优化,至于需不需要优化是楼主要考虑的事情不是你们要给楼主的建议, 楼主要是问宝马夏利买哪个你们也会劝楼主不要买车吗? 没有必要使用宏,一定要内联的话.MSVC请使用__forceinline,GCC使用__attribute__((always_inline)), 加入这个东西,编译器必须inline当前函数,如果不能inline,将给出编译警告例如:"XXX函数内联失败". 不能inline一个forcedinline的情况非常非常少.GCC一般都会成功,MSVC在函数内部创建新对象的 时候有可能否决forceinline.但会给出提示.
呵呵,说得对。直接用G++也是这样的吧?
cjbs10086 2013-12-02
  • 打赏
  • 举报
回复
引用 67 楼 zhao4zhong1 的回复:
函数指针数组的效率在分支比较多时(比如10个以上时)通常比if-else语句高。 就象switch语句在case比较多时会被编译器优化为跳转表(即函数指针数组)一样。
原来还有这好处,学习了
max_min_ 2013-12-02
  • 打赏
  • 举报
回复
不如效率问题不是特别明显的话,建议用函数, 宏在预编译期就完成了的事情,所以很多错误会让人束手无策的!
xdh0817 2013-12-02
  • 打赏
  • 举报
回复
引用 67 楼 zhao4zhong1 的回复:
函数指针数组的效率在分支比较多时(比如10个以上时)通常比if-else语句高。 就象switch语句在case比较多时会被编译器优化为跳转表(即函数指针数组)一样。
哦哦。以前不太喜欢用函数指针,原来有这好处啊~
赵4老师 2013-12-02
  • 打赏
  • 举报
回复
函数指针数组的效率在分支比较多时(比如10个以上时)通常比if-else语句高。 就象switch语句在case比较多时会被编译器优化为跳转表(即函数指针数组)一样。
xdh0817 2013-12-02
  • 打赏
  • 举报
回复
引用 64 楼 bijiaoben 的回复:
我错了,跪求大家原谅。我以前看到过类似代码。。。
呵呵
xdh0817 2013-12-02
  • 打赏
  • 举报
回复
引用 57 楼 zhao4zhong1 的回复:
条条大路通罗马。 就怕帖主去北京!
呵呵,我就在北京呢
大奶兔白糖 2013-12-02
  • 打赏
  • 举报
回复
我错了,跪求大家原谅。我以前看到过类似代码。。。
大奶兔白糖 2013-12-02
  • 打赏
  • 举报
回复
引用 60 楼 xdh0817 的回复:
[quote=引用 54 楼 bijiaoben 的回复:] [quote=引用 50 楼 Adol1111 的回复:] [quote=引用 47 楼 bijiaoben 的回复:] [quote=引用 7 楼 mougaidong 的回复:] 就老老实实写一个函数,代替如下:
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,但是这个代码就达不到楼主的要求了。[/quote] 按照楼主提供的代码是完全可以的,这里一点都没有歪曲楼主的意思。 可能是这2种情况,1、楼主是随便写写的,所以没有加两个if之间的中间代码。2、楼主没有写成if-else形式。[/quote] 我觉得是你的需求分析错了。如果init和create只执行一个就可以继续下面的代码了,那么有必要设计2个函数吗?[/quote] 实际情况是:对于一种情况,执行init;对于另一种情况,执行create;对于第三种情况,执行后面的代码。 init和create可能执行其中一个,也可能都不执行,但是不会同时执行。设计两个函数完全是因为实际需求来的~[/quote] Sorry,我又错了。
xdh0817 2013-12-02
  • 打赏
  • 举报
回复
引用 59 楼 Adol1111 的回复:
[quote=引用 54 楼 bijiaoben 的回复:] [quote=引用 50 楼 Adol1111 的回复:] [quote=引用 47 楼 bijiaoben 的回复:] [quote=引用 7 楼 mougaidong 的回复:] 就老老实实写一个函数,代替如下:
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,但是这个代码就达不到楼主的要求了。[/quote] 按照楼主提供的代码是完全可以的,这里一点都没有歪曲楼主的意思。 可能是这2种情况,1、楼主是随便写写的,所以没有加两个if之间的中间代码。2、楼主没有写成if-else形式。[/quote] 我觉得是你的需求分析错了。如果init和create只执行一个就可以继续下面的代码了,那么有必要设计2个函数吗?[/quote] 我都说了是根据楼主提供的代码了,你如何分析出init执行后count会变成1?如果保持不变,那么下面的代码就是无意义的多跑了一遍不是么?有问题么?[/quote] 他这个inline函数式对的
加载更多回复(56)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧