473,320 Members | 1,900 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,320 software developers and data experts.

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 18053
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

7
by: buds | last post by:
Hi all, Following is the assigment operator of a derived class Derived& Derived::operator=(const Derived& inDerived) { //to assign to the base class object the following statement ...
2
by: Alexander Stippler | last post by:
In some situations I can apply a C-style cast, but no static_cast. I'm not quite sure about the differences in such places. A little example: template <typename T> class Dummy { public:...
11
by: Scott Brady Drummonds | last post by:
Hi, everyone, I've checked a couple of on-line resources and am unable to determine how reinterpret_cast<> is different from static_cast<>. They both seem to perform a compile-time casting of...
9
by: news.ir.com.au | last post by:
Hi, In the following code I get the compiler error: error C2243: 'static_cast' : conversion from 'class B *' to 'class A *' exists, but is inaccessible I understand why I get this error and...
26
by: Steven T. Hatton | last post by:
The code shown below is an example from the Coin3D documentation. I believe the use of the C-style cast is safe under the circumstances, but from what I've been exposed to (TC++PL(SE)), I would...
24
by: Rahul | last post by:
Hi, I have a class A : public B {...member functions......data members}; and am doing the following A *p=new A(); void *p=static_cast<void *>(p); factory_instance->process(p);
9
by: Vincent RICHOMME | last post by:
Is there any reason to use static_cast instead of old C syntax ? Let's say I declare GLfloat test = static_cast<GLfloat>(x); or GLfloat test = (GLfloat) x;
4
by: subramanian100in | last post by:
when are the use of static_cast and const_cast essential ? Stroustrup, in his book TC++PL(3rd edition) in page number 139 (in Section 6.5 Advice - ), has advised "Avoid explicit type...
5
by: jason.cipriani | last post by:
There have been some recent threads about casting pointers to and from void* that have me rethinking some of my usual practices. I have a couple of questions. 1. What is the purpose of C++'s...
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: ryjfgjl | last post by:
ExcelToDatabase: batch import excel into database automatically...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: Vimpel783 | last post by:
Hello! Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
0
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
0
by: Shćllîpôpď 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.