z****e 发帖数: 2024 | 1 Which of the following statements regarding the benefits of using template
functions over preprocessor #define macros are correct?
A. A preprocessor macro expansion cannot work when user-defined types are
passed to it as arguments.
B. Since the preprocessor does the macro expansion and not the compiler, the
build process takes a longer period of time.
C. While expanding #define macros, the preprocessor does no type checking on
the arguments to the macro.
D. A preprocessor macro expansion incurs a performance overhead at runtime.
E. It is simple to step into a template function code during the debugging
process.
多选。 | k**********g 发帖数: 989 | | z****e 发帖数: 2024 | 3 非常赞同。
但是B,我认为前半部分的陈述也是对的。后半部分build时间长短,如何比较?
【在 k**********g 的大作中提到】 : C and E
| t****t 发帖数: 6806 | 4 一样的, template就是带syntax check的macro.
【在 z****e 的大作中提到】 : 非常赞同。 : 但是B,我认为前半部分的陈述也是对的。后半部分build时间长短,如何比较?
| z****e 发帖数: 2024 | 5 macro 是 preprocessor 处理的,不是编译器处理的。preprocessor应该是编译环节最
先被调用的程序。可以说,macro的代码是完全和编译器无关的。
而tempalte 是不经过preprocessor的,直接被编译器处理的,可以说,template是只
和编译器有关的。
我不知道师傅你说的所谓的“一样”,是从何谈起的。
你说的“一样”,恐怕是说进入编译器以后,编译过程,对于template和macro当然是
一样的了。那我还能说,任何代码都“一样”的,因为要经过编译器。
macro不能类型检查,不能access成员变量,只是一个文字替换,本身不被编译器处理。
这么多不同,你还来个“一样”?
那我还说 main 和 int 一样呢,都是英文。
【在 t****t 的大作中提到】 : 一样的, template就是带syntax check的macro.
| t****t 发帖数: 6806 | 6 细节上当然有很多讲究, 比如template可以递归, 一般macro不能递归(如果用文件#
include的话, 也是可以递归的), template可以带调试信息, macro没有调试信息(
again, 如果用#include的话, 也不是完全没有), 等等.
但是本质上来说就是这样. 至于macro不能access成员变量, 那显然没有这回事. 除了
没有语法检查, 别的没什么大区别. 本质上来说, template是个语法糖, 当然这是个很
大块的糖, 大到整个STL都建立在上面的程度. 但是你看看boost就知道了, 以前
template没那么好使的时候(比如说VC6的版本), 一大堆本来应该用template做的东西
都是用macro模拟的.
至于int和main一样, 这个不好说. int是保留词, 没法一样. main和foo则区别不大.
理。
【在 z****e 的大作中提到】 : macro 是 preprocessor 处理的,不是编译器处理的。preprocessor应该是编译环节最 : 先被调用的程序。可以说,macro的代码是完全和编译器无关的。 : 而tempalte 是不经过preprocessor的,直接被编译器处理的,可以说,template是只 : 和编译器有关的。 : 我不知道师傅你说的所谓的“一样”,是从何谈起的。 : 你说的“一样”,恐怕是说进入编译器以后,编译过程,对于template和macro当然是 : 一样的了。那我还能说,任何代码都“一样”的,因为要经过编译器。 : macro不能类型检查,不能access成员变量,只是一个文字替换,本身不被编译器处理。 : 这么多不同,你还来个“一样”? : 那我还说 main 和 int 一样呢,都是英文。
| t****t 发帖数: 6806 | 7 另外, 我原文中说的"一样", 本来是专指build时间. 但是在我看来, 模板的本质就是
宏.
理。
【在 z****e 的大作中提到】 : macro 是 preprocessor 处理的,不是编译器处理的。preprocessor应该是编译环节最 : 先被调用的程序。可以说,macro的代码是完全和编译器无关的。 : 而tempalte 是不经过preprocessor的,直接被编译器处理的,可以说,template是只 : 和编译器有关的。 : 我不知道师傅你说的所谓的“一样”,是从何谈起的。 : 你说的“一样”,恐怕是说进入编译器以后,编译过程,对于template和macro当然是 : 一样的了。那我还能说,任何代码都“一样”的,因为要经过编译器。 : macro不能类型检查,不能access成员变量,只是一个文字替换,本身不被编译器处理。 : 这么多不同,你还来个“一样”? : 那我还说 main 和 int 一样呢,都是英文。
| z****e 发帖数: 2024 | 8 这个build的时间,是两个差不多,还是有一个会快?
【在 t****t 的大作中提到】 : 另外, 我原文中说的"一样", 本来是专指build时间. 但是在我看来, 模板的本质就是 : 宏. : : 理。
| t****t 发帖数: 6806 | 9 数量级上不会差.
【在 z****e 的大作中提到】 : 这个build的时间,是两个差不多,还是有一个会快?
| a****l 发帖数: 8211 | 10 这个快要看你怎么理解了.macro其实就是文本替换,所以你可能说定义了一个非常复杂
的函数或者过程写成foo(a,b,c),结果程序员就到处用foo(a,b,c),写起来非常方便,但
是实际的程序就是到处复制了替换后的foo(a,b,c),就是一段相同的程序被到处重复,这
样显然对编译的效率是不利的,对执行效率也可能会有影响.
【在 z****e 的大作中提到】 : 这个build的时间,是两个差不多,还是有一个会快?
|
|