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 11 16467
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
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
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
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. 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.
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
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.
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
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. 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
|
5 posts
views
Thread by jason.cipriani |
last post: by
| | | | | | | | | | |