468,463 Members | 2,053 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,463 developers. It's quick & easy.

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

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

Sep 24 '06 #1
11 15086
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.

--

Frederick Gotham
Sep 24 '06 #2
es*****@googlemail.com wrote :
Presumably then this test is done at compile time?
Yes.
>
Sep 24 '06 #3
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

es*****@googlemail.com wrote:
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
Sep 24 '06 #4
es*****@googlemail.com schrieb:
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
Read this interesting article:
http://www.flounder.com/optimization.htm

--
Thomas
http://www.netmeister.org/news/learn2quote.html
Sep 24 '06 #5
Frederick Gotham wrote:
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.

--
Salu2
Sep 24 '06 #6
Julián Albo wrote:
Frederick Gotham wrote:
>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.
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.
Sep 24 '06 #7
es*****@googlemail.com wrote:
>
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.
Sep 24 '06 #8
Pete Becker wrote:
>>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.

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".

--
Salu2
Sep 24 '06 #9
Julián Albo wrote:
Pete Becker wrote:
>>>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.
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".
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.
Sep 24 '06 #10
Pete Becker wrote:
>>>>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
(...)
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?

--
Salu2
Sep 24 '06 #11
Julián Albo wrote:
Pete Becker wrote:
>>>>>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
(...)
>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?
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.
Sep 24 '06 #12

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

7 posts views Thread by buds | last post: by
2 posts views Thread by Alexander Stippler | last post: by
11 posts views Thread by Scott Brady Drummonds | last post: by
9 posts views Thread by news.ir.com.au | last post: by
26 posts views Thread by Steven T. Hatton | last post: by
24 posts views Thread by Rahul | last post: by
9 posts views Thread by Vincent RICHOMME | last post: by
4 posts views Thread by subramanian100in | last post: by
reply views Thread by kmladenovski | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.