Is static_cast really as fast as C/C++ style casts?

E

esuvs81

Hi all. In short, is there any performance difference between:

float f = 10.0f;
int i = static_cast<int>(f);

and

float f = 10.0f;
int i = int(f);

I've been meaning to ask this for a while but just how fast is
static_cast? I had always assumed (without proof) that static_cast is
implemented as a template which just wraps a C/C++ style cast.But then
it the Josuttis book it says:

"The conversion is allowed only if a type conversion is defined"

Presumably then this test is done at compile time?

Also, if static_cast is just a wrapper around C/C++ casts then how does
it differ from reinterpret_cast? Maybe these things are compiler
dependant but any info is useful.

Thanks,

David
 
F

Frederick Gotham

Hi all. In short, is there any performance difference between:

float f = 10.0f;
int i = static_cast<int>(f);

and

float f = 10.0f;
int i = int(f);


No, because a "cast" is a compile-time concept -- not a runtime concept.
Both should produce identical machine code.

I've been meaning to ask this for a while but just how fast is
static_cast?


It doesn't have a speed.

I had always assumed (without proof) that static_cast is implemented as
a template which just wraps a C/C++ style cast.But then it the Josuttis
book it says:

"The conversion is allowed only if a type conversion is defined"

Presumably then this test is done at compile time?


Yes it is. Test it with a conforming compiler:

char *p = 0;

long i = static_cast<long>(p);

You should get a compiler error.
Also, if static_cast is just a wrapper around C/C++ casts then how does
it differ from reinterpret_cast? Maybe these things are compiler
dependant but any info is useful.


In the way I showed you above. There's a list of things which static_cast
WILL let you do, and others which it WON'T let you do. For the things it
won't let you do, you must use reinterpret_cast.
 
E

esuvs81

Ok, thanks for the input. I'm keen to write correct code but don't want
to sacrifice speed if possible. Seems like I'm ok here :-D
 
?

=?ISO-8859-15?Q?Juli=E1n?= Albo

Frederick said:
No, because a "cast" is a compile-time concept -- not a runtime concept.

Not always, think about dynamic_cast. Someone can debate if is the same
concept of casting that the others cast, but his name in C++ is clear.
 
P

Pete Becker

Julián Albo said:
Not always, think about dynamic_cast. Someone can debate if is the same
concept of casting that the others cast, but his name in C++ is clear.

A cast is something that exists in source code to tell the compiler to
do a conversion. Some conversions can be done implicitly, and others
will only be done if you tell the compiler with a cast. Some conversions
require runtime code, but that's independent of whether the conversion
requires a cast. In some circumstances, dynamic_cast does not require
modifying the pointer value. In some circumstances, static_cast does. In
some circumstances, initializing a pointer to base from a pointer to
derived (without a cast) modifies the pointer value; in some it does not.

--

-- Pete

Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." For more information about this book, see
www.petebecker.com/tr1book.
 
P

Pete Becker

I've been meaning to ask this for a while but just how fast is
static_cast? I had always assumed (without proof) that static_cast is
implemented as a template which just wraps a C/C++ style cast.

static_cast is not a template. It's a keyword, and the compiler
generates whatever code is appropriate. The difference between
static_cast and a C-style cast is that there are some conversions that
you can do with a C-style cast that you can't do with a static_cast.

--

-- Pete

Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." For more information about this book, see
www.petebecker.com/tr1book.
 
?

=?ISO-8859-15?Q?Juli=E1n?= Albo

Pete said:
A cast is something that exists in source code to tell the compiler to
do a conversion. Some conversions can be done implicitly, and others
will only be done if you tell the compiler with a cast. Some conversions
require runtime code, but that's independent of whether the conversion
requires a cast. In some circumstances, dynamic_cast does not require
modifying the pointer value. In some circumstances, static_cast does. In

But the runtime nature of dynamic_cast is more relevant. With other casts
you essentially say "I know the conversion is valid". With dynamic_cast you
say "check at runtime if the conversion is possible".
 
P

Pete Becker

Julián Albo said:
But the runtime nature of dynamic_cast is more relevant. With other casts
you essentially say "I know the conversion is valid". With dynamic_cast you
say "check at runtime if the conversion is possible".

I just re-read what I wrote, and, unfortunately, left out something
important: sometimes a dynamic_cast does not require any runtime check.
Converting a pointer to T into a pointer to T, for a silly example. But
you can also use a dynamic_cast to convert a pointer to derived into a
pointer to base, and that needs only a compile-time check.

--

-- Pete

Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." For more information about this book, see
www.petebecker.com/tr1book.
 
?

=?ISO-8859-15?Q?Juli=E1n?= Albo

Pete said:
(...)
important: sometimes a dynamic_cast does not require any runtime check.
Converting a pointer to T into a pointer to T, for a silly example. But
you can also use a dynamic_cast to convert a pointer to derived into a
pointer to base, and that needs only a compile-time check.

Yes, but the point in discussion was that a cast in C++ is not always a
compile time concept, and the facts you mention does not contradict it.
Maybe I loose some topic change?
 
P

Pete Becker

Julián Albo said:
Yes, but the point in discussion was that a cast in C++ is not always a
compile time concept, and the facts you mention does not contradict it.
Maybe I loose some topic change?

A cast is something you write in your source code. A conversion is what
the compiler does in response, as well as in many situations where a
cast is not required. Conversions sometimes have runtime consequences,
regardless of whether they result from casts. Conflating "cast" with
"conversion" muddles things.

--

-- Pete

Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." For more information about this book, see
www.petebecker.com/tr1book.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,997
Messages
2,570,239
Members
46,827
Latest member
DMUK_Beginner

Latest Threads

Top