e******d 发帖数: 310 | 1 I have two C/C++ questions ,
1. If we want to call C function in C++ program, we need to use extern
"C". My question is what will happen to the compiler after we use "
extern "C" ".
2. For hierarchy classes with virtual functions, dynamic binding is used
when we use pointers/references to call virtual functions. The question is
if calling virtual functions degrades performance.
Please explain in detail.
Thank you a lot. |
t****t 发帖数: 6806 | 2 1. the usual practice is simply disable the name mangling for the function.
2. yes, virtual function is not as fast as non-virtual functions. but the
difference is mostly negligible.
【在 e******d 的大作中提到】 : I have two C/C++ questions , : 1. If we want to call C function in C++ program, we need to use extern : "C". My question is what will happen to the compiler after we use " : extern "C" ". : 2. For hierarchy classes with virtual functions, dynamic binding is used : when we use pointers/references to call virtual functions. The question is : if calling virtual functions degrades performance. : Please explain in detail. : Thank you a lot.
|
e*u 发帖数: 99 | 3 For 2., this is from the "Advanced C++":
"Even if no advantage is ever taken of their run time properties, the
run time overhead cost is negligible: Making a function virtual
typically adds about 15 percent to the cost of a function call. If
function calls constitute 10 percent of a program's execution
profile, the ubiquitous use of virtual functions will cause about a 2
percent performance drop. However, virtual functions need to be
compared to what the alternative implementations would be with
【在 e******d 的大作中提到】 : I have two C/C++ questions , : 1. If we want to call C function in C++ program, we need to use extern : "C". My question is what will happen to the compiler after we use " : extern "C" ". : 2. For hierarchy classes with virtual functions, dynamic binding is used : when we use pointers/references to call virtual functions. The question is : if calling virtual functions degrades performance. : Please explain in detail. : Thank you a lot.
|
z****e 发帖数: 2024 | 4 master shifu,
virtual根本就不会影响效率,我的答案是彻底不会影响。
这个问题我的理解是这样的。
其实virtual function,就是把本来程序员要作的事情,也就是基于类型的函数调用,给编译器作了,程序员解放了。但是代价就是有vritual table查询。
可是这并不是代价,因为如果不用多态,我们也要手动进行基于类型的判断(或者类似判断),这个比virtual还浪费。所以,只要是程序设计的时候,要有基于类型的函数调用,那么vritual是最高效的。如果想彻底提高程序效率,就要避免这种函数调用,这是程序设计理念的问题,不是virtual本身的问题。
综上,virtual是解决基于类型的操作的最高效方案。根本不影响效率。
师傅们给说说吧。
【在 t****t 的大作中提到】 : 1. the usual practice is simply disable the name mangling for the function. : 2. yes, virtual function is not as fast as non-virtual functions. but the : difference is mostly negligible.
|
p******r 发帖数: 2999 | 5 runtime performance 肯定有影响,你也承认了
你不要扩大话题
,给编译器作了,程序员解放了。但是代价就是有vritual table查询。
似判断),这个比virtual还浪费。所以,只要是程序设计的时候,要有基于类型的函
数调用,那么vritual是最高效的。如果想彻底提高程序效率,就要避免这种函数调用
,这是程序设计理念的问题,
【在 z****e 的大作中提到】 : master shifu, : virtual根本就不会影响效率,我的答案是彻底不会影响。 : 这个问题我的理解是这样的。 : 其实virtual function,就是把本来程序员要作的事情,也就是基于类型的函数调用,给编译器作了,程序员解放了。但是代价就是有vritual table查询。 : 可是这并不是代价,因为如果不用多态,我们也要手动进行基于类型的判断(或者类似判断),这个比virtual还浪费。所以,只要是程序设计的时候,要有基于类型的函数调用,那么vritual是最高效的。如果想彻底提高程序效率,就要避免这种函数调用,这是程序设计理念的问题,不是virtual本身的问题。 : 综上,virtual是解决基于类型的操作的最高效方案。根本不影响效率。 : 师傅们给说说吧。
|
t****t 发帖数: 6806 | 6 they question is virtual call vs non-virtual call. the question is not
virtual call vs "manual dynamic-binding" call.
,给编译器作了,程序员解放了。但是代价就是有vritual table查询。
似判断),这个比virtual还浪费。所以,只要是程序设计的时候,要有基于类型的函
数调用,那么vritual是最高效的。如果想彻底提高程序效率,就要避免这种函数调用
,这是程序设计理念的问题,
【在 z****e 的大作中提到】 : master shifu, : virtual根本就不会影响效率,我的答案是彻底不会影响。 : 这个问题我的理解是这样的。 : 其实virtual function,就是把本来程序员要作的事情,也就是基于类型的函数调用,给编译器作了,程序员解放了。但是代价就是有vritual table查询。 : 可是这并不是代价,因为如果不用多态,我们也要手动进行基于类型的判断(或者类似判断),这个比virtual还浪费。所以,只要是程序设计的时候,要有基于类型的函数调用,那么vritual是最高效的。如果想彻底提高程序效率,就要避免这种函数调用,这是程序设计理念的问题,不是virtual本身的问题。 : 综上,virtual是解决基于类型的操作的最高效方案。根本不影响效率。 : 师傅们给说说吧。
|
D*******a 发帖数: 3688 | 7 其实写成asm就是CALL vs CALL PTR []的区别吧,现代cpu上最多差一个
时钟周期
【在 t****t 的大作中提到】 : 1. the usual practice is simply disable the name mangling for the function. : 2. yes, virtual function is not as fast as non-virtual functions. but the : difference is mostly negligible.
|
t****t 发帖数: 6806 | 8 不对. 或许古代的CPU上最多差一个周期. 现代的CPU流水线长, 根据这指令的上下文,
很可能差好多周期.
【在 D*******a 的大作中提到】 : 其实写成asm就是CALL vs CALL PTR []的区别吧,现代cpu上最多差一个 : 时钟周期
|
r********3 发帖数: 2998 | 9 这两个问题出得很好!!!
【在 e******d 的大作中提到】 : I have two C/C++ questions , : 1. If we want to call C function in C++ program, we need to use extern : "C". My question is what will happen to the compiler after we use " : extern "C" ". : 2. For hierarchy classes with virtual functions, dynamic binding is used : when we use pointers/references to call virtual functions. The question is : if calling virtual functions degrades performance. : Please explain in detail. : Thank you a lot.
|
e*l 发帖数: 37 | 10 没这么简单,至少要两步,先从对象中取出虚表指针,再调用
movl (this->vtbl) %eax ;;对象只有在runtime时才能确定
call (%eax, idx, 4) ;;查表调用
也就是说只有第一个指令执行后才能知道call的时候往哪跳转,这个就阻碍了cpu对指令
流的优化,比如指令预取(cache).这个花销虽然不大,但是也没你预计的这样小.
还有一个就是virtual函数在虚调用时无法inline,这个对性能有很大影响,所以很多数
值计算库采用template技术,避免runtime dynamic(vritual function),而是尽量使用
static dynamic.
【在 D*******a 的大作中提到】 : 其实写成asm就是CALL vs CALL PTR []的区别吧,现代cpu上最多差一个 : 时钟周期
|