diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1999-01-04 11:56:18 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1999-01-04 06:56:18 -0500 |
commit | 0ded1f18fa844dd763d2fec27a320c40e64dbed3 (patch) | |
tree | 16b990cc0b6153e74f5107fa291e71cfedf48cb9 | |
parent | 02275c91e6770dee4d1e354a050fef86d901dcc9 (diff) | |
download | gcc-0ded1f18fa844dd763d2fec27a320c40e64dbed3.zip gcc-0ded1f18fa844dd763d2fec27a320c40e64dbed3.tar.gz gcc-0ded1f18fa844dd763d2fec27a320c40e64dbed3.tar.bz2 |
* extend.texi (Bound member functions): Document.
From-SVN: r24483
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/extend.texi | 39 |
2 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9388cbb..45306aa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +Mon Jan 4 11:55:51 1999 Jason Merrill <jason@yorick.cygnus.com> + + * extend.texi (Bound member functions): Document. + Mon Jan 4 11:01:48 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * mips-tdump.c (st_to_string, sc_to_string, glevel_to_string, diff --git a/gcc/extend.texi b/gcc/extend.texi index ff51b1d..88f4588 100644 --- a/gcc/extend.texi +++ b/gcc/extend.texi @@ -1,4 +1,4 @@ -@c Copyright (C) 1988,89,92,93,94,96 Free Software Foundation, Inc. +@c Copyright (C) 1988,89,92,93,94,96,99 Free Software Foundation, Inc. @c This is part of the GCC manual. @c For copying conditions, see the file gcc.texi. @@ -3015,8 +3015,11 @@ Predefined Macros,cpp.info,The C Preprocessor}). declarations and definitions. * Template Instantiation:: Methods for ensuring that exactly one copy of each needed template instantiation is emitted. +* Bound member functions:: You can extract a function pointer to the + method denoted by a @samp{->*} or @samp{.*} expression. * C++ Signatures:: You can specify abstract types to get subtype polymorphism independent from inheritance. + @end menu @node Naming Results @@ -3476,6 +3479,40 @@ be the same in all translation units, or things are likely to break. more discussion of these pragmas. @end enumerate +@node Bound member functions +@section Extracting the function pointer from a bound pointer to member function + +@cindex pmf +@cindex pointer to member function +@cindex bound pointer to member function + +In C++, pointer to member functions (PMFs) are implemented using a wide +pointer of sorts to handle all the possible call mechanisms; the PMF +needs to store information about how to adjust the @samp{this} pointer, +and if the function pointed to is virtual, where to find the vtable, and +where in the vtable to look for the member function. If you are using +PMFs in an inner loop, you should really reconsider that decision. If +that is not an option, you can extract the pointer to the function that +would be called for a given object/PMF pair and call it directly inside +the inner loop, to save a bit of time. + +Note that you will still be paying the penalty for the call through a +function pointer; on most modern architectures, such a call defeats the +branch prediction features of the CPU. This is also true of normal +virtual function calls. + +The syntax for this extension is + +@example +extern A a; +extern int (A::*fp)(); +typedef int (*fptr)(A *); + +fptr p = (fptr)(a.*fp); +@end example + +You must specify @samp{-Wno-pmf-conversions} to use this extension. + @node C++ Signatures @section Type Abstraction using Signatures |