737 lines
43 KiB
Plaintext
737 lines
43 KiB
Plaintext
[library Boost.Lexical_Cast
|
|
[quickbook 1.5]
|
|
[version 1.0]
|
|
[copyright 2000-2005 Kevlin Henney]
|
|
[copyright 2006-2010 Alexander Nasonov]
|
|
[copyright 2011-2019 Antony Polukhin]
|
|
[category String and text processing]
|
|
[category Miscellaneous]
|
|
[license
|
|
Distributed under the Boost Software License, Version 1.0.
|
|
(See accompanying file LICENSE_1_0.txt or copy at
|
|
[@http://www.boost.org/LICENSE_1_0.txt])
|
|
]
|
|
]
|
|
|
|
[def __numericcast__ [@boost:libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html `boost::numeric_cast`]]
|
|
[def __proposallong__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1973.html Lexical Conversion Library Proposal for TR2, N1973 by Kevlin Henney and Beman Dawes]]
|
|
[def __proposalshort__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1973.html Lexical Conversion Library Proposal for TR2, N1973]]
|
|
|
|
[section Motivation]
|
|
Sometimes a value must be converted to a literal text form, such as an [c++] `int` represented as a `std::string`, or vice-versa, when a `std::string` is interpreted as an `int`. Such examples are common when converting between data types internal to a program and representation external to a program, such as windows and configuration files.
|
|
|
|
The standard C and C++ libraries offer a number of facilities for performing such conversions. However, they vary with their ease of use, extensibility, and safety.
|
|
|
|
For instance, there are a number of limitations with the family of standard C functions typified by `atoi`:
|
|
|
|
* Conversion is supported in one direction only: from text to internal data type. Converting the other way using the C library requires either the inconvenience and compromised safety of the `sprintf` function, or the loss of portability associated with non-standard functions such as `itoa`.
|
|
* The range of types supported is only a subset of the built-in numeric types, namely `int`, `long`, and `double`.
|
|
* The range of types cannot be extended in a uniform manner. For instance, conversion from string representation to complex or rational.
|
|
|
|
The standard C functions typified by `strtol` have the same basic limitations, but offer finer control over the conversion process. However, for the common case such control is often either not required or not used. The `scanf` family of functions offer even greater control, but also lack safety and ease of use.
|
|
|
|
The standard C++ library offers `stringstream` for the kind of in-core formatting being discussed. It offers a great deal of control over the formatting and conversion of I/O to and from arbitrary types through text. However, for simple conversions direct use of `stringstream` can be either clumsy (with the introduction of extra local variables and the loss of infix-expression convenience) or obscure (where `stringstream` objects are created as temporary objects in an expression). Facets provide a comprehensive concept and facility for controlling textual representation, but their perceived complexity and high entry level requires an extreme degree of involvement for simple conversions, and excludes all but a few programmers.
|
|
|
|
The `lexical_cast` function template offers a convenient and consistent form for supporting common conversions to and from arbitrary types when they are represented as text. The simplification it offers is in expression-level convenience for such conversions. For more involved conversions, such as where precision or formatting need tighter control than is offered by the default behavior of `lexical_cast`, the conventional `std::stringstream` approach is recommended. Where the conversions are numeric to numeric, __numericcast__ may offer more reasonable behavior than `lexical_cast`.
|
|
|
|
For a good discussion of the options and issues involved in string-based formatting, including comparison of `stringstream`, `lexical_cast`, and others, see Herb Sutter's article, [@http://www.gotw.ca/publications/mill19.htm The String Formatters of Manor Farm]. Also, take a look at the [link boost_lexical_cast.performance Performance] section.
|
|
[endsect]
|
|
|
|
[section Examples]
|
|
|
|
[import ../example/args_to_numbers.cpp]
|
|
|
|
[section Strings to numbers conversion] [lexical_cast_args_example] [endsect]
|
|
|
|
[import ../example/small_examples.cpp]
|
|
[section Numbers to strings conversion] [lexical_cast_log_errno] [endsect]
|
|
[section Converting to string without dynamic memory allocation] [lexical_cast_fixed_buffer] [endsect]
|
|
[section Converting part of the string] [lexical_cast_substring_conversion] [endsect]
|
|
|
|
[import ../example/generic_stringize.cpp]
|
|
[section Generic programming (Boost.Fusion)] [lexical_cast_stringize] [endsect]
|
|
|
|
[import ../example/variant_to_long_double.cpp]
|
|
[section Generic programming (Boost.Variant)] [lexical_cast_variant_to_long_double] [endsect]
|
|
|
|
[endsect]
|
|
|
|
[section Synopsis]
|
|
Library features defined in [@boost:boost/lexical_cast.hpp boost/lexical_cast.hpp]:
|
|
``
|
|
namespace boost
|
|
{
|
|
class bad_lexical_cast;
|
|
|
|
template<typename Target, typename Source>
|
|
Target lexical_cast(const Source& arg);
|
|
|
|
template <typename Target>
|
|
Target lexical_cast(const AnyCharacterType* chars, std::size_t count);
|
|
|
|
namespace conversion
|
|
{
|
|
template<typename Target, typename Source>
|
|
bool try_lexical_convert(const Source& arg, Target& result);
|
|
|
|
template <typename AnyCharacterType, typename Target>
|
|
bool try_lexical_convert(const AnyCharacterType* chars, std::size_t count, Target& result);
|
|
|
|
} // namespace conversion
|
|
} // namespace boost
|
|
``
|
|
|
|
[section lexical_cast]
|
|
``
|
|
template<typename Target, typename Source>
|
|
Target lexical_cast(const Source& arg);
|
|
``
|
|
Returns the result of streaming arg into a standard library string-based stream and then out as a Target object. Where Target is either `std::string` or `std::wstring`, stream extraction takes the whole content of the string, including spaces, rather than relying on the default `operator>>` behavior. If the conversion is unsuccessful, a `bad_lexical_cast` exception is thrown.
|
|
|
|
``
|
|
template <typename Target>
|
|
Target lexical_cast(const AnyCharacterType* chars, std::size_t count);
|
|
``
|
|
Takes an array of `count` characters as input parameter and streams them out as a Target object. If the conversion is unsuccessful, a `bad_lexical_cast` exception is thrown. This call may be useful for processing nonzero terminated array of characters or processing just some part of character array.
|
|
|
|
The requirements on the argument and result types for both functions are:
|
|
|
|
* Source is OutputStreamable, meaning that an `operator<<` is defined that takes a `std::ostream` or `std::wostream` object on the left hand side and an instance of the argument type on the right.
|
|
* Target is InputStreamable, meaning that an `operator>>` is defined that takes a `std::istream` or `std::wistream` object on the left hand side and an instance of the result type on the right.
|
|
* Target is CopyConstructible [20.1.3].
|
|
* Target is DefaultConstructible, meaning that it is possible to default-initialize an object of that type [8.5, 20.1.4].
|
|
|
|
The character type of the underlying stream is assumed to be `char` unless either the `Source` or the `Target` requires wide-character streaming, in which case the underlying stream uses `wchar_t`. Following types also can use `char16_t` or `char32_t` for wide-character streaming:
|
|
|
|
* Single character: `char16_t`, `char32_t`
|
|
* Arrays of characters: `char16_t *`, `char32_t *`, `const char16_t *`, `const char32_t *`
|
|
* Strings: `std::basic_string`, `boost::containers::basic_string`
|
|
* `boost::iterator_range<WideCharPtr>`, where `WideCharPtr` is a pointer to wide-character or pointer to const wide-character
|
|
* `boost::array<CharT, N>` and `std::array<CharT, N>`, `boost::array<const CharT, N>` and `std::array<const CharT, N>`
|
|
|
|
[important Many compilers and runtime libraries fail to make conversions using new Unicode characters. Make sure that the following code compiles and outputs nonzero values, before using new types:
|
|
``
|
|
std::cout
|
|
<< boost::lexical_cast<std::u32string>(1.0).size()
|
|
<< " "
|
|
<< boost::lexical_cast<std::u16string>(1.0).size();
|
|
``
|
|
]
|
|
|
|
Where a higher degree of control is required over conversions, `std::stringstream` and `std::wstringstream` offer a more appropriate path. Where non-stream-based conversions are required, `lexical_cast` is the wrong tool for the job and is not special-cased for such scenarios.
|
|
[endsect]
|
|
|
|
[section bad_lexical_cast]
|
|
``
|
|
class bad_lexical_cast : public std::bad_cast
|
|
{
|
|
public:
|
|
... // same member function interface as std::exception
|
|
};
|
|
``
|
|
Exception used to indicate runtime lexical_cast failure.
|
|
[endsect]
|
|
|
|
[section try_lexical_convert]
|
|
`boost::lexical_cast` remains the main interface for lexical conversions. It must be used by default in most cases. However
|
|
some developers wish to make their own conversion functions, reusing all the optimizations of the `boost::lexical_cast`.
|
|
That's where the `boost::conversion::try_lexical_convert` function steps in.
|
|
|
|
`try_lexical_convert` returns `true` if conversion succeeded, otherwise returns `false`. If conversion
|
|
failed and `false` was returned, state of `result` output variable is undefined.
|
|
|
|
Actually, `boost::lexical_cast` is implemented using `try_lexical_convert`:
|
|
``
|
|
template <typename Target, typename Source>
|
|
inline Target lexical_cast(const Source &arg)
|
|
{
|
|
Target result;
|
|
|
|
if (!conversion::try_lexical_convert(arg, result))
|
|
throw bad_lexical_cast();
|
|
|
|
return result;
|
|
}
|
|
``
|
|
|
|
`try_lexical_convert` relaxes the CopyConstructible and DefaultConstructible requirements for `Target` type.
|
|
Following requirements for `Target` and `Source` remain:
|
|
|
|
* Source must be OutputStreamable, meaning that an `operator<<` is defined that takes a `std::ostream` or `std::wostream` object on the left hand side and an instance of the argument type on the right.
|
|
* Target must be InputStreamable, meaning that an `operator>>` is defined that takes a `std::istream` or `std::wistream` object on the left hand side and an instance of the result type on the right.
|
|
|
|
[endsect]
|
|
|
|
|
|
[endsect]
|
|
|
|
[section Frequently Asked Questions]
|
|
|
|
* [*Question:] Why does `lexical_cast<int8_t>("127")` throw `bad_lexical_cast`?
|
|
* [*Answer:] The type `int8_t` is a `typedef` to `char` or `signed char`. Lexical conversion to these types is simply reading a byte from source but since the source has more than one byte, the exception is thrown.
|
|
Please use other integer types such as `int` or `short int`. If bounds checking is important, you can also
|
|
call __numericcast__:
|
|
`numeric_cast<int8_t>(lexical_cast<int>("127"));`
|
|
|
|
[pre
|
|
]
|
|
|
|
* [*Question:] Why does `lexical_cast<unsigned char>("127")` throw `bad_lexical_cast`?
|
|
* [*Answer:] Lexical conversion to any char type is simply reading a byte from source. But since the source has more than one byte, the exception is thrown.
|
|
Please use other integer types such as `int` or `short int`. If bounds checking is important, you can also
|
|
call __numericcast__:
|
|
`numeric_cast<unsigned char>(lexical_cast<int>("127"));`
|
|
|
|
[pre
|
|
]
|
|
|
|
* [*Question:] What does `lexical_cast<std::string>` of an `int8_t` or `uint8_t` not do what I expect?
|
|
* [*Answer:] As above, note that int8_t and uint8_t are actually chars and are formatted as such. To avoid
|
|
this, cast to an integer type first: `lexical_cast<std::string>(static_cast<int>(n));`
|
|
|
|
[pre
|
|
]
|
|
|
|
* [*Question:] The implementation always resets the `ios_base::skipws` flag of an underlying stream object.
|
|
It breaks my `operator>>` that works only in presence of this flag. Can you remove code that resets the flag?
|
|
* [*Answer:] May be in a future version. There is no requirement in
|
|
__proposallong__ to reset the flag but
|
|
remember that __proposalshort__ is not yet accepted by the committee. By the way, it's a great opportunity to
|
|
make your `operator>>` more general.
|
|
Read a good C++ book, study `std::sentry` and [@boost:libs/io/doc/ios_state.html `ios_state_saver`].
|
|
|
|
[pre
|
|
]
|
|
|
|
* [*Question:] Why `std::cout << boost::lexical_cast<unsigned int>("-1");` does not throw, but outputs 4294967295?
|
|
* [*Answer:] `boost::lexical_cast` has the behavior of `std::stringstream`, which uses `num_get` functions of
|
|
`std::locale` to convert numbers. If we look at the Programming languages — C++, we'll see, that `num_get` uses
|
|
the rules of `scanf` for conversions. And in the C99 standard for unsigned input value minus sign is optional, so
|
|
if a negative number is read, no errors will arise and the result will be the two's complement.
|
|
|
|
[pre
|
|
]
|
|
|
|
* [*Question:] Why `boost::lexical_cast<int>(L'A');` outputs 65 and `boost::lexical_cast<wchar_t>(L"65");` does not throw?
|
|
* [*Answer:] If you are using an old version of Visual Studio or compile code with /Zc:wchar_t- flag,
|
|
`boost::lexical_cast` sees single `wchar_t` character as `unsigned short`. It is not a `boost::lexical_cast` mistake, but a
|
|
limitation of compiler options that you use.
|
|
|
|
[pre
|
|
]
|
|
|
|
* [*Question:] Why `boost::lexical_cast<double>("-1.#IND");` throws `boost::bad_lexical_cast`?
|
|
* [*Answer:] `"-1.#IND"` is a compiler extension, that violates standard. You shall input `"-nan"`, `"nan"`, `"inf"`
|
|
, `"-inf"` (case insensitive) strings to get NaN and Inf values. `boost::lexical_cast<string>` outputs `"-nan"`, `"nan"`,
|
|
`"inf"`, `"-inf"` strings, when has NaN or Inf input values.
|
|
|
|
[pre
|
|
]
|
|
|
|
* [*Question:] What is the fastest way to convert a non zero terminated string or a substring using `boost::lexical_cast`?
|
|
* [*Answer:] Use `boost::iterator_range` for conversion or `lexical_cast` overload with two parameters. For example, if you whant to convert to `int` two characters from a string `str`, you shall write `lexical_cast<int>(make_iterator_range(str.data(), str.data() + 2));` or `lexical_cast<int>(str.data(), 2);`.
|
|
|
|
[endsect]
|
|
|
|
[section Changes]
|
|
|
|
* [*boost 1.56.0 :]
|
|
|
|
* Added `boost::conversion::try_lexical_convert` functions.
|
|
|
|
* [*boost 1.54.0 :]
|
|
|
|
* Fix some issues with `boost::int128_type` and `boost::uint128_type` conversions. Notify user at compile time
|
|
if the `std::numeric_limits` are not specialized for 128bit types and `boost::lexical_cast` can not make conversions.
|
|
|
|
* [*boost 1.54.0 :]
|
|
|
|
* Added code to convert `boost::int128_type` and `boost::uint128_type` types (requires GCC 4.7 or higher).
|
|
* Conversions to pointers will now fail to compile, instead of throwing at runtime.
|
|
* Restored ability to get pointers to `lexical_cast` function (was broken in 1.53.0).
|
|
|
|
* [*boost 1.53.0 :]
|
|
|
|
* Much better input and output streams detection for user defined types.
|
|
|
|
* [*boost 1.52.0 :]
|
|
|
|
* Restored compilation on MSVC-2003 (was broken in 1.51.0).
|
|
* Added `lexical_cast(const CharType* chars, std::size_t count)` function overload.
|
|
|
|
* [*boost 1.51.0 :]
|
|
|
|
* Better performance, less memory usage for `boost::array<character_type, N>` and `std::array<character_type, N>` conversions.
|
|
|
|
* [*boost 1.50.0 :]
|
|
|
|
* `boost::bad_lexical_cast` exception is now globaly visible and can be catched even if code is compiled with -fvisibility=hidden.
|
|
* Now it is possible to compile library with disabled exceptions.
|
|
* Better performance, less memory usage and bugfixes for `boost::iterator_range<character_type*>` conversions.
|
|
|
|
* [*boost 1.49.0 :]
|
|
|
|
* Restored work with typedefed wchar_t (compilation flag /Zc:wchar_t- for Visual Studio).
|
|
* Better performance and less memory usage for `boost::container::basic_string` conversions.
|
|
|
|
* [*boost 1.48.0 :]
|
|
|
|
* Added code to work with Inf and NaN on any platform.
|
|
* Better performance and less memory usage for conversions to float type (and to double type, if `sizeof(double) < sizeof(long double)`).
|
|
|
|
* [*boost 1.47.0 :]
|
|
|
|
* Optimizations for "C" and other locales without number grouping.
|
|
* Better performance and less memory usage for unsigned char and signed char conversions.
|
|
* Better performance and less memory usage for conversions to arithmetic types.
|
|
* Better performance and less memory usage for conversions from arithmetic type to arithmetic type.
|
|
* Directly construct Target from Source on some conversions (like conversions from string to string, from char array to string, from char to char and others).
|
|
|
|
* [*boost 1.34.0 :]
|
|
|
|
* Better performance for many combinations of Source and Target types. For more details refer to Alexander Nasonovs article [@http://accu.org/index.php/journals/1375 Fine Tuning for lexical_cast, Overload #74, August 2006] [@http://www.accu.org/var/uploads/journals/overload74.pdf (PDF)].
|
|
|
|
* [*boost 1.33.0 :]
|
|
|
|
* Call-by-const reference for the parameters. This requires partial specialization of class templates, so it doesn't work for MSVC 6, and it uses the original pass by value there.
|
|
* The MSVC 6 support is deprecated, and will be removed in a future Boost version.
|
|
|
|
* [*Earlier :]
|
|
|
|
* The previous version of lexical_cast used the default stream precision for reading and writing floating-point numbers. For numerics that have a corresponding specialization of `std::numeric_limits`, the current version now chooses a precision to match.
|
|
* The previous version of lexical_cast did not support conversion to or from any wide-character-based types. For compilers with full language and library support for wide characters, `lexical_cast` now supports conversions from `wchar_t`, `wchar_t *`, and `std::wstring` and to `wchar_t` and `std::wstring`.
|
|
* The previous version of `lexical_cast` assumed that the conventional stream extractor operators were sufficient for reading values. However, string I/O is asymmetric, with the result that spaces play the role of I/O separators rather than string content. The current version fixes this error for `std::string` and, where supported, `std::wstring`: `lexical_cast<std::string>("Hello, World")` succeeds instead of failing with a `bad_lexical_cast` exception.
|
|
* The previous version of `lexical_cast` allowed unsafe and meaningless conversions to pointers. The current version now throws a `bad_lexical_cast` for conversions to pointers: `lexical_cast<char *>("Goodbye, World")` now throws an exception instead of causing undefined behavior.
|
|
|
|
[endsect]
|
|
|
|
[section Performance]
|
|
|
|
In most cases `boost::lexical_cast` is faster than `scanf`, `printf`, `std::stringstream`. For more detailed info you can look at the tables below.
|
|
|
|
[section Tests description]
|
|
All the tests measure execution speed in milliseconds for 10000 iterations of the following code blocks:
|
|
[table:legend Tests source code
|
|
[[Test name] [Code]]
|
|
[[lexical_cast]
|
|
[``
|
|
_out = boost::lexical_cast<OUTTYPE>(_in);
|
|
``]
|
|
]
|
|
[[std::stringstream with construction]
|
|
[``
|
|
std::stringstream ss;
|
|
ss << _in;
|
|
if (ss.fail()) throw std::logic_error(descr);
|
|
ss >> _out;
|
|
if (ss.fail()) throw std::logic_error(descr);
|
|
``]
|
|
]
|
|
[[std::stringstream without construction]
|
|
[``
|
|
ss << _in; // ss is an instance of std::stringstream
|
|
if (ss.fail()) throw std::logic_error(descr);
|
|
ss >> _out;
|
|
if (ss.fail()) throw std::logic_error(descr);
|
|
/* reseting std::stringstream to use it again */
|
|
ss.str(std::string());
|
|
ss.clear();
|
|
``]
|
|
]
|
|
[[scanf/printf]
|
|
[``
|
|
typename OUTTYPE::value_type buffer[500];
|
|
sprintf( (char*)buffer, conv, _in);
|
|
_out = buffer;
|
|
``]
|
|
]
|
|
]
|
|
Fastest results are highlitened with "!!! *x* !!!".
|
|
Do not use this results to compare compilers, because tests were taken on different hardware.
|
|
|
|
[endsect]
|
|
|
|
[/ BEGIN of section, generated by performance measuring program ]
|
|
|
|
|
|
[section GNU C++ version 6.1.1 20160511]
|
|
[table:id Performance Table ( GNU C++ version 6.1.1 20160511)
|
|
[[From->To] [lexical_cast] [std::stringstream with construction] [std::stringstream without construction][scanf/printf]]
|
|
[[ string->char ][ !!! *<1* !!! ][ 59 ][ 4 ][ 4 ]]
|
|
[[ string->signed char ][ !!! *<1* !!! ][ 52 ][ 4 ][ 5 ]]
|
|
[[ string->unsigned char ][ !!! *<1* !!! ][ 54 ][ 4 ][ 5 ]]
|
|
[[ string->int ][ !!! *4* !!! ][ 61 ][ 19 ][ 12 ]]
|
|
[[ string->short ][ !!! *4* !!! ][ 59 ][ 11 ][ 8 ]]
|
|
[[ string->long int ][ !!! *4* !!! ][ 59 ][ 9 ][ 8 ]]
|
|
[[ string->long long ][ !!! *6* !!! ][ 61 ][ 10 ][ 10 ]]
|
|
[[ string->unsigned int ][ !!! *4* !!! ][ 59 ][ 9 ][ 9 ]]
|
|
[[ string->unsigned short ][ !!! *4* !!! ][ 60 ][ 9 ][ 8 ]]
|
|
[[ string->unsigned long int ][ !!! *4* !!! ][ 60 ][ 9 ][ 8 ]]
|
|
[[ string->unsigned long long ][ !!! *4* !!! ][ 70 ][ 21 ][ 21 ]]
|
|
[[ string->float ][ 91 ][ 152 ][ 59 ][ !!! *40* !!! ]]
|
|
[[ string->double ][ 86 ][ 140 ][ 58 ][ !!! *28* !!! ]]
|
|
[[ string->long double ][ 48 ][ 90 ][ 34 ][ !!! *22* !!! ]]
|
|
[[ string->array<char, 50> ][ !!! *<1* !!! ][ 59 ][ 9 ][ 10 ]]
|
|
[[ string->string ][ !!! *2* !!! ][ 129 ][ 29 ][ --- ]]
|
|
[[ string->container::string ][ !!! *1* !!! ][ 70 ][ 11 ][ --- ]]
|
|
[[ string->char ][ !!! *4* !!! ][ 99 ][ 27 ][ 20 ]]
|
|
[[ string->signed char ][ !!! *9* !!! ][ 101 ][ 13 ][ 12 ]]
|
|
[[ string->unsigned char ][ !!! *4* !!! ][ 86 ][ 27 ][ 27 ]]
|
|
[[ int->string ][ !!! *9* !!! ][ 89 ][ 17 ][ 14 ]]
|
|
[[ short->string ][ !!! *7* !!! ][ 71 ][ 17 ][ 15 ]]
|
|
[[ long int->string ][ !!! *7* !!! ][ 71 ][ 18 ][ 19 ]]
|
|
[[ long long->string ][ !!! *13* !!! ][ 127 ][ 34 ][ 25 ]]
|
|
[[ unsigned int->string ][ 16 ][ 117 ][ 17 ][ !!! *12* !!! ]]
|
|
[[ unsigned short->string ][ !!! *8* !!! ][ 71 ][ 16 ][ 12 ]]
|
|
[[ unsigned long int->string ][ !!! *12* !!! ][ 100 ][ 36 ][ 26 ]]
|
|
[[ unsigned long long->string ][ !!! *14* !!! ][ 97 ][ 21 ][ 17 ]]
|
|
[[ float->string ][ 70 ][ 97 ][ 43 ][ !!! *25* !!! ]]
|
|
[[ double->string ][ 130 ][ 155 ][ 51 ][ !!! *25* !!! ]]
|
|
[[ long double->string ][ 104 ][ 160 ][ !!! *47* !!! ][ 57 ]]
|
|
[[ char*->char ][ !!! *<1* !!! ][ 95 ][ 4 ][ 4 ]]
|
|
[[ char*->signed char ][ !!! *<1* !!! ][ 52 ][ 7 ][ 13 ]]
|
|
[[ char*->unsigned char ][ !!! *<1* !!! ][ 106 ][ 11 ][ 13 ]]
|
|
[[ char*->int ][ !!! *6* !!! ][ 118 ][ 22 ][ 21 ]]
|
|
[[ char*->short ][ !!! *7* !!! ][ 104 ][ 10 ][ 19 ]]
|
|
[[ char*->long int ][ !!! *8* !!! ][ 112 ][ 24 ][ 14 ]]
|
|
[[ char*->long long ][ !!! *4* !!! ][ 90 ][ 17 ][ 9 ]]
|
|
[[ char*->unsigned int ][ !!! *4* !!! ][ 103 ][ 23 ][ 22 ]]
|
|
[[ char*->unsigned short ][ !!! *7* !!! ][ 82 ][ 9 ][ 8 ]]
|
|
[[ char*->unsigned long int ][ !!! *5* !!! ][ 58 ][ 20 ][ 8 ]]
|
|
[[ char*->unsigned long long ][ !!! *4* !!! ][ 60 ][ 10 ][ 11 ]]
|
|
[[ char*->float ][ 58 ][ 103 ][ !!! *32* !!! ][ 37 ]]
|
|
[[ char*->double ][ 52 ][ 155 ][ 32 ][ !!! *27* !!! ]]
|
|
[[ char*->long double ][ 72 ][ 135 ][ 51 ][ !!! *30* !!! ]]
|
|
[[ char*->array<char, 50> ][ !!! *<1* !!! ][ 80 ][ 23 ][ 17 ]]
|
|
[[ char*->string ][ !!! *10* !!! ][ 150 ][ 18 ][ --- ]]
|
|
[[ char*->container::string ][ !!! *<1* !!! ][ 64 ][ 11 ][ --- ]]
|
|
[[ unsigned char*->char ][ !!! *<1* !!! ][ 52 ][ 4 ][ 4 ]]
|
|
[[ unsigned char*->signed char ][ !!! *<1* !!! ][ 54 ][ 4 ][ 5 ]]
|
|
[[ unsigned char*->unsigned char ][ !!! *<1* !!! ][ 54 ][ 4 ][ 5 ]]
|
|
[[ unsigned char*->int ][ !!! *4* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ unsigned char*->short ][ !!! *4* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ unsigned char*->long int ][ !!! *4* !!! ][ 66 ][ 24 ][ 19 ]]
|
|
[[ unsigned char*->long long ][ !!! *4* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ unsigned char*->unsigned int ][ !!! *4* !!! ][ 79 ][ 24 ][ 22 ]]
|
|
[[ unsigned char*->unsigned short ][ !!! *7* !!! ][ 123 ][ 23 ][ 22 ]]
|
|
[[ unsigned char*->unsigned long int ][ !!! *8* !!! ][ 121 ][ 24 ][ 22 ]]
|
|
[[ unsigned char*->unsigned long long ][ !!! *8* !!! ][ 121 ][ 24 ][ 22 ]]
|
|
[[ unsigned char*->float ][ 97 ][ 167 ][ 67 ][ !!! *47* !!! ]]
|
|
[[ unsigned char*->double ][ 96 ][ 164 ][ 67 ][ !!! *47* !!! ]]
|
|
[[ unsigned char*->long double ][ 97 ][ 165 ][ 66 ][ !!! *47* !!! ]]
|
|
[[ unsigned char*->array<char, 50> ][ !!! *<1* !!! ][ 119 ][ 22 ][ 17 ]]
|
|
[[ unsigned char*->string ][ !!! *11* !!! ][ 139 ][ 34 ][ --- ]]
|
|
[[ unsigned char*->container::string ][ !!! *1* !!! ][ 121 ][ 25 ][ --- ]]
|
|
[[ signed char*->char ][ !!! *<1* !!! ][ 106 ][ 11 ][ 8 ]]
|
|
[[ signed char*->signed char ][ !!! *<1* !!! ][ 81 ][ 12 ][ 13 ]]
|
|
[[ signed char*->unsigned char ][ !!! *<1* !!! ][ 109 ][ 11 ][ 12 ]]
|
|
[[ signed char*->int ][ !!! *7* !!! ][ 122 ][ 24 ][ 21 ]]
|
|
[[ signed char*->short ][ !!! *4* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ signed char*->long int ][ !!! *4* !!! ][ 60 ][ 10 ][ 8 ]]
|
|
[[ signed char*->long long ][ !!! *4* !!! ][ 60 ][ 10 ][ 8 ]]
|
|
[[ signed char*->unsigned int ][ !!! *4* !!! ][ 64 ][ 23 ][ 22 ]]
|
|
[[ signed char*->unsigned short ][ !!! *7* !!! ][ 120 ][ 24 ][ 22 ]]
|
|
[[ signed char*->unsigned long int ][ !!! *8* !!! ][ 121 ][ 24 ][ 22 ]]
|
|
[[ signed char*->unsigned long long ][ !!! *8* !!! ][ 122 ][ 23 ][ 22 ]]
|
|
[[ signed char*->float ][ 95 ][ 165 ][ 68 ][ !!! *46* !!! ]]
|
|
[[ signed char*->double ][ 95 ][ 161 ][ 66 ][ !!! *47* !!! ]]
|
|
[[ signed char*->long double ][ 96 ][ 161 ][ 66 ][ !!! *46* !!! ]]
|
|
[[ signed char*->array<char, 50> ][ !!! *<1* !!! ][ 117 ][ 22 ][ 17 ]]
|
|
[[ signed char*->string ][ !!! *10* !!! ][ 84 ][ 15 ][ --- ]]
|
|
[[ signed char*->container::string ][ !!! *1* !!! ][ 119 ][ 25 ][ --- ]]
|
|
[[ iterator_range<char*>->char ][ !!! *<1* !!! ][ 111 ][ 16 ][ 11 ]]
|
|
[[ iterator_range<char*>->signed char ][ !!! *<1* !!! ][ 110 ][ 16 ][ 13 ]]
|
|
[[ iterator_range<char*>->unsigned char ][ !!! *<1* !!! ][ 111 ][ 15 ][ 13 ]]
|
|
[[ iterator_range<char*>->int ][ !!! *6* !!! ][ 119 ][ 25 ][ 22 ]]
|
|
[[ iterator_range<char*>->short ][ !!! *7* !!! ][ 119 ][ 25 ][ 22 ]]
|
|
[[ iterator_range<char*>->long int ][ !!! *7* !!! ][ 120 ][ 25 ][ 22 ]]
|
|
[[ iterator_range<char*>->long long ][ !!! *8* !!! ][ 119 ][ 24 ][ 22 ]]
|
|
[[ iterator_range<char*>->unsigned int ][ !!! *6* !!! ][ 119 ][ 24 ][ 22 ]]
|
|
[[ iterator_range<char*>->unsigned short ][ !!! *6* !!! ][ 117 ][ 24 ][ 22 ]]
|
|
[[ iterator_range<char*>->unsigned long int ][ !!! *7* !!! ][ 120 ][ 24 ][ 22 ]]
|
|
[[ iterator_range<char*>->unsigned long long ][ !!! *8* !!! ][ 118 ][ 24 ][ 22 ]]
|
|
[[ iterator_range<char*>->float ][ 96 ][ 155 ][ 48 ][ !!! *47* !!! ]]
|
|
[[ iterator_range<char*>->double ][ 96 ][ 141 ][ 47 ][ !!! *47* !!! ]]
|
|
[[ iterator_range<char*>->long double ][ 96 ][ 140 ][ 46 ][ !!! *46* !!! ]]
|
|
[[ iterator_range<char*>->array<char, 50> ][ !!! *<1* !!! ][ 118 ][ 25 ][ 17 ]]
|
|
[[ iterator_range<char*>->string ][ !!! *10* !!! ][ 136 ][ 35 ][ --- ]]
|
|
[[ iterator_range<char*>->container::string ][ !!! *1* !!! ][ 119 ][ 26 ][ --- ]]
|
|
[[ array<char, 50>->char ][ !!! *<1* !!! ][ 108 ][ 11 ][ 10 ]]
|
|
[[ array<char, 50>->signed char ][ !!! *<1* !!! ][ 106 ][ 12 ][ 12 ]]
|
|
[[ array<char, 50>->unsigned char ][ !!! *<1* !!! ][ 107 ][ 11 ][ 13 ]]
|
|
[[ array<char, 50>->int ][ !!! *6* !!! ][ 119 ][ 24 ][ 22 ]]
|
|
[[ array<char, 50>->short ][ !!! *7* !!! ][ 121 ][ 24 ][ 22 ]]
|
|
[[ array<char, 50>->long int ][ !!! *7* !!! ][ 119 ][ 24 ][ 22 ]]
|
|
[[ array<char, 50>->long long ][ !!! *7* !!! ][ 123 ][ 24 ][ 22 ]]
|
|
[[ array<char, 50>->unsigned int ][ !!! *7* !!! ][ 121 ][ 23 ][ 25 ]]
|
|
[[ array<char, 50>->unsigned short ][ !!! *6* !!! ][ 120 ][ 24 ][ 22 ]]
|
|
[[ array<char, 50>->unsigned long int ][ !!! *7* !!! ][ 59 ][ 10 ][ 9 ]]
|
|
[[ array<char, 50>->unsigned long long ][ !!! *4* !!! ][ 60 ][ 10 ][ 8 ]]
|
|
[[ array<char, 50>->float ][ 47 ][ 80 ][ 32 ][ !!! *22* !!! ]]
|
|
[[ array<char, 50>->double ][ 46 ][ 82 ][ 31 ][ !!! *22* !!! ]]
|
|
[[ array<char, 50>->long double ][ 49 ][ 82 ][ 31 ][ !!! *22* !!! ]]
|
|
[[ array<char, 50>->array<char, 50> ][ !!! *1* !!! ][ 59 ][ 9 ][ 7 ]]
|
|
[[ array<char, 50>->string ][ !!! *5* !!! ][ 70 ][ 15 ][ --- ]]
|
|
[[ array<char, 50>->container::string ][ !!! *1* !!! ][ 60 ][ 11 ][ --- ]]
|
|
[[ int->int ][ !!! *<1* !!! ][ 61 ][ 12 ][ --- ]]
|
|
[[ float->double ][ !!! *<1* !!! ][ 111 ][ 54 ][ --- ]]
|
|
[[ char->signed char ][ !!! *<1* !!! ][ 51 ][ 4 ][ --- ]]
|
|
]
|
|
[endsect]
|
|
|
|
[section GNU C++ version 4.8.5]
|
|
[table:id Performance Table ( GNU C++ version 4.8.5)
|
|
[[From->To] [lexical_cast] [std::stringstream with construction] [std::stringstream without construction][scanf/printf]]
|
|
[[ string->char ][ !!! *<1* !!! ][ 100 ][ 10 ][ 10 ]]
|
|
[[ string->signed char ][ !!! *<1* !!! ][ 97 ][ 9 ][ 11 ]]
|
|
[[ string->unsigned char ][ !!! *<1* !!! ][ 103 ][ 11 ][ 13 ]]
|
|
[[ string->int ][ !!! *6* !!! ][ 122 ][ 23 ][ 22 ]]
|
|
[[ string->short ][ !!! *6* !!! ][ 116 ][ 23 ][ 22 ]]
|
|
[[ string->long int ][ !!! *6* !!! ][ 97 ][ 21 ][ 22 ]]
|
|
[[ string->long long ][ !!! *7* !!! ][ 118 ][ 22 ][ 22 ]]
|
|
[[ string->unsigned int ][ !!! *6* !!! ][ 116 ][ 22 ][ 22 ]]
|
|
[[ string->unsigned short ][ !!! *6* !!! ][ 106 ][ 9 ][ 8 ]]
|
|
[[ string->unsigned long int ][ !!! *3* !!! ][ 59 ][ 9 ][ 8 ]]
|
|
[[ string->unsigned long long ][ !!! *3* !!! ][ 58 ][ 9 ][ 8 ]]
|
|
[[ string->float ][ 88 ][ 166 ][ 70 ][ !!! *47* !!! ]]
|
|
[[ string->double ][ 102 ][ 162 ][ 65 ][ !!! *51* !!! ]]
|
|
[[ string->long double ][ 96 ][ 163 ][ 71 ][ !!! *46* !!! ]]
|
|
[[ string->array<char, 50> ][ !!! *1* !!! ][ 112 ][ 21 ][ 18 ]]
|
|
[[ string->string ][ !!! *2* !!! ][ 139 ][ 37 ][ --- ]]
|
|
[[ string->container::string ][ !!! *1* !!! ][ 121 ][ 24 ][ --- ]]
|
|
[[ string->char ][ !!! *9* !!! ][ 121 ][ 31 ][ 21 ]]
|
|
[[ string->signed char ][ !!! *9* !!! ][ 121 ][ 31 ][ 34 ]]
|
|
[[ string->unsigned char ][ !!! *9* !!! ][ 120 ][ 31 ][ 30 ]]
|
|
[[ int->string ][ !!! *17* !!! ][ 141 ][ 39 ][ 30 ]]
|
|
[[ short->string ][ !!! *18* !!! ][ 142 ][ 39 ][ 30 ]]
|
|
[[ long int->string ][ 17 ][ 136 ][ 17 ][ !!! *12* !!! ]]
|
|
[[ long long->string ][ !!! *7* !!! ][ 69 ][ 17 ][ 13 ]]
|
|
[[ unsigned int->string ][ !!! *8* !!! ][ 70 ][ 24 ][ 13 ]]
|
|
[[ unsigned short->string ][ !!! *7* !!! ][ 69 ][ 17 ][ 12 ]]
|
|
[[ unsigned long int->string ][ !!! *7* !!! ][ 71 ][ 16 ][ 12 ]]
|
|
[[ unsigned long long->string ][ !!! *7* !!! ][ 71 ][ 16 ][ 12 ]]
|
|
[[ float->string ][ 60 ][ 95 ][ 49 ][ !!! *24* !!! ]]
|
|
[[ double->string ][ 68 ][ 97 ][ 45 ][ !!! *26* !!! ]]
|
|
[[ long double->string ][ 72 ][ 108 ][ 45 ][ !!! *28* !!! ]]
|
|
[[ char*->char ][ !!! *<1* !!! ][ 52 ][ 5 ][ 4 ]]
|
|
[[ char*->signed char ][ !!! *<1* !!! ][ 52 ][ 5 ][ 5 ]]
|
|
[[ char*->unsigned char ][ !!! *<1* !!! ][ 52 ][ 5 ][ 5 ]]
|
|
[[ char*->int ][ !!! *3* !!! ][ 60 ][ 10 ][ 8 ]]
|
|
[[ char*->short ][ !!! *3* !!! ][ 61 ][ 10 ][ 8 ]]
|
|
[[ char*->long int ][ !!! *4* !!! ][ 60 ][ 10 ][ 8 ]]
|
|
[[ char*->long long ][ !!! *4* !!! ][ 61 ][ 9 ][ 8 ]]
|
|
[[ char*->unsigned int ][ !!! *3* !!! ][ 103 ][ 13 ][ 8 ]]
|
|
[[ char*->unsigned short ][ !!! *3* !!! ][ 97 ][ 23 ][ 22 ]]
|
|
[[ char*->unsigned long int ][ !!! *7* !!! ][ 123 ][ 23 ][ 22 ]]
|
|
[[ char*->unsigned long long ][ !!! *6* !!! ][ 72 ][ 10 ][ 8 ]]
|
|
[[ char*->float ][ 85 ][ 160 ][ 66 ][ !!! *47* !!! ]]
|
|
[[ char*->double ][ 94 ][ 161 ][ 65 ][ !!! *46* !!! ]]
|
|
[[ char*->long double ][ 94 ][ 172 ][ 64 ][ !!! *47* !!! ]]
|
|
[[ char*->array<char, 50> ][ !!! *2* !!! ][ 113 ][ 22 ][ 16 ]]
|
|
[[ char*->string ][ !!! *10* !!! ][ 145 ][ 34 ][ --- ]]
|
|
[[ char*->container::string ][ !!! *1* !!! ][ 120 ][ 25 ][ --- ]]
|
|
[[ unsigned char*->char ][ !!! *<1* !!! ][ 102 ][ 11 ][ 10 ]]
|
|
[[ unsigned char*->signed char ][ !!! *<1* !!! ][ 100 ][ 12 ][ 12 ]]
|
|
[[ unsigned char*->unsigned char ][ !!! *<1* !!! ][ 102 ][ 11 ][ 12 ]]
|
|
[[ unsigned char*->int ][ !!! *7* !!! ][ 119 ][ 24 ][ 22 ]]
|
|
[[ unsigned char*->short ][ !!! *7* !!! ][ 120 ][ 24 ][ 22 ]]
|
|
[[ unsigned char*->long int ][ !!! *7* !!! ][ 119 ][ 24 ][ 23 ]]
|
|
[[ unsigned char*->long long ][ !!! *7* !!! ][ 119 ][ 24 ][ 22 ]]
|
|
[[ unsigned char*->unsigned int ][ !!! *6* !!! ][ 82 ][ 9 ][ 8 ]]
|
|
[[ unsigned char*->unsigned short ][ !!! *3* !!! ][ 58 ][ 9 ][ 8 ]]
|
|
[[ unsigned char*->unsigned long int ][ !!! *4* !!! ][ 59 ][ 10 ][ 10 ]]
|
|
[[ unsigned char*->unsigned long long ][ !!! *4* !!! ][ 60 ][ 12 ][ 8 ]]
|
|
[[ unsigned char*->float ][ 47 ][ 80 ][ 32 ][ !!! *22* !!! ]]
|
|
[[ unsigned char*->double ][ 47 ][ 79 ][ 31 ][ !!! *23* !!! ]]
|
|
[[ unsigned char*->long double ][ 47 ][ 80 ][ 31 ][ !!! *22* !!! ]]
|
|
[[ unsigned char*->array<char, 50> ][ !!! *1* !!! ][ 58 ][ 9 ][ 7 ]]
|
|
[[ unsigned char*->string ][ !!! *4* !!! ][ 68 ][ 15 ][ --- ]]
|
|
[[ unsigned char*->container::string ][ !!! *<1* !!! ][ 60 ][ 10 ][ --- ]]
|
|
[[ signed char*->char ][ !!! *<1* !!! ][ 52 ][ 5 ][ 4 ]]
|
|
[[ signed char*->signed char ][ !!! *<1* !!! ][ 54 ][ 4 ][ 5 ]]
|
|
[[ signed char*->unsigned char ][ !!! *<1* !!! ][ 52 ][ 4 ][ 6 ]]
|
|
[[ signed char*->int ][ !!! *6* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ signed char*->short ][ !!! *3* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ signed char*->long int ][ !!! *4* !!! ][ 60 ][ 10 ][ 8 ]]
|
|
[[ signed char*->long long ][ !!! *4* !!! ][ 59 ][ 10 ][ 9 ]]
|
|
[[ signed char*->unsigned int ][ !!! *3* !!! ][ 58 ][ 9 ][ 8 ]]
|
|
[[ signed char*->unsigned short ][ !!! *4* !!! ][ 58 ][ 9 ][ 8 ]]
|
|
[[ signed char*->unsigned long int ][ !!! *4* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ signed char*->unsigned long long ][ !!! *4* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ signed char*->float ][ 47 ][ 81 ][ 32 ][ !!! *25* !!! ]]
|
|
[[ signed char*->double ][ 46 ][ 79 ][ 31 ][ !!! *22* !!! ]]
|
|
[[ signed char*->long double ][ 48 ][ 80 ][ 32 ][ !!! *22* !!! ]]
|
|
[[ signed char*->array<char, 50> ][ !!! *1* !!! ][ 63 ][ 9 ][ 7 ]]
|
|
[[ signed char*->string ][ !!! *4* !!! ][ 68 ][ 15 ][ --- ]]
|
|
[[ signed char*->container::string ][ !!! *<1* !!! ][ 58 ][ 10 ][ --- ]]
|
|
[[ iterator_range<char*>->char ][ !!! *<1* !!! ][ 54 ][ 6 ][ 4 ]]
|
|
[[ iterator_range<char*>->signed char ][ !!! *<1* !!! ][ 57 ][ 6 ][ 5 ]]
|
|
[[ iterator_range<char*>->unsigned char ][ !!! *<1* !!! ][ 54 ][ 6 ][ 5 ]]
|
|
[[ iterator_range<char*>->int ][ !!! *3* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ iterator_range<char*>->short ][ !!! *3* !!! ][ 59 ][ 11 ][ 9 ]]
|
|
[[ iterator_range<char*>->long int ][ !!! *3* !!! ][ 61 ][ 11 ][ 8 ]]
|
|
[[ iterator_range<char*>->long long ][ !!! *3* !!! ][ 59 ][ 10 ][ 9 ]]
|
|
[[ iterator_range<char*>->unsigned int ][ !!! *3* !!! ][ 57 ][ 9 ][ 8 ]]
|
|
[[ iterator_range<char*>->unsigned short ][ !!! *3* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ iterator_range<char*>->unsigned long int ][ !!! *3* !!! ][ 58 ][ 10 ][ 8 ]]
|
|
[[ iterator_range<char*>->unsigned long long ][ !!! *3* !!! ][ 58 ][ 15 ][ 8 ]]
|
|
[[ iterator_range<char*>->float ][ 46 ][ 78 ][ 22 ][ !!! *22* !!! ]]
|
|
[[ iterator_range<char*>->double ][ 94 ][ 85 ][ !!! *21* !!! ][ 22 ]]
|
|
[[ iterator_range<char*>->long double ][ 47 ][ 79 ][ 33 ][ !!! *22* !!! ]]
|
|
[[ iterator_range<char*>->array<char, 50> ][ !!! *1* !!! ][ 102 ][ 25 ][ 16 ]]
|
|
[[ iterator_range<char*>->string ][ !!! *10* !!! ][ 96 ][ 16 ][ --- ]]
|
|
[[ iterator_range<char*>->container::string ][ !!! *<1* !!! ][ 64 ][ 11 ][ --- ]]
|
|
[[ array<char, 50>->char ][ !!! *<1* !!! ][ 75 ][ 4 ][ 4 ]]
|
|
[[ array<char, 50>->signed char ][ !!! *<1* !!! ][ 54 ][ 6 ][ 13 ]]
|
|
[[ array<char, 50>->unsigned char ][ !!! *<1* !!! ][ 103 ][ 12 ][ 12 ]]
|
|
[[ array<char, 50>->int ][ !!! *6* !!! ][ 121 ][ 25 ][ 23 ]]
|
|
[[ array<char, 50>->short ][ !!! *7* !!! ][ 122 ][ 24 ][ 22 ]]
|
|
[[ array<char, 50>->long int ][ !!! *7* !!! ][ 119 ][ 24 ][ 22 ]]
|
|
[[ array<char, 50>->long long ][ !!! *7* !!! ][ 120 ][ 24 ][ 22 ]]
|
|
[[ array<char, 50>->unsigned int ][ !!! *6* !!! ][ 121 ][ 23 ][ 22 ]]
|
|
[[ array<char, 50>->unsigned short ][ !!! *6* !!! ][ 121 ][ 23 ][ 22 ]]
|
|
[[ array<char, 50>->unsigned long int ][ !!! *6* !!! ][ 118 ][ 24 ][ 20 ]]
|
|
[[ array<char, 50>->unsigned long long ][ !!! *6* !!! ][ 109 ][ 22 ][ 21 ]]
|
|
[[ array<char, 50>->float ][ 93 ][ 150 ][ 61 ][ !!! *43* !!! ]]
|
|
[[ array<char, 50>->double ][ 89 ][ 147 ][ 61 ][ !!! *43* !!! ]]
|
|
[[ array<char, 50>->long double ][ 91 ][ 148 ][ 61 ][ !!! *42* !!! ]]
|
|
[[ array<char, 50>->array<char, 50> ][ !!! *2* !!! ][ 106 ][ 21 ][ 15 ]]
|
|
[[ array<char, 50>->string ][ !!! *10* !!! ][ 124 ][ 32 ][ --- ]]
|
|
[[ array<char, 50>->container::string ][ !!! *1* !!! ][ 109 ][ 23 ][ --- ]]
|
|
[[ int->int ][ !!! *<1* !!! ][ 114 ][ 26 ][ --- ]]
|
|
[[ float->double ][ !!! *<1* !!! ][ 207 ][ 105 ][ --- ]]
|
|
[[ char->signed char ][ !!! *<1* !!! ][ 97 ][ 10 ][ --- ]]
|
|
]
|
|
[endsect]
|
|
|
|
[section Clang version 3.6.0 (tags/RELEASE_360/final)]
|
|
[table:id Performance Table ( Clang version 3.6.0 (tags/RELEASE_360/final))
|
|
[[From->To] [lexical_cast] [std::stringstream with construction] [std::stringstream without construction][scanf/printf]]
|
|
[[ string->char ][ !!! *<1* !!! ][ 79 ][ 4 ][ 4 ]]
|
|
[[ string->signed char ][ !!! *<1* !!! ][ 51 ][ 4 ][ 5 ]]
|
|
[[ string->unsigned char ][ !!! *<1* !!! ][ 51 ][ 4 ][ 5 ]]
|
|
[[ string->int ][ !!! *3* !!! ][ 80 ][ 22 ][ 22 ]]
|
|
[[ string->short ][ !!! *6* !!! ][ 108 ][ 22 ][ 22 ]]
|
|
[[ string->long int ][ !!! *6* !!! ][ 66 ][ 10 ][ 11 ]]
|
|
[[ string->long long ][ !!! *6* !!! ][ 101 ][ 9 ][ 20 ]]
|
|
[[ string->unsigned int ][ !!! *5* !!! ][ 77 ][ 8 ][ 8 ]]
|
|
[[ string->unsigned short ][ !!! *3* !!! ][ 61 ][ 8 ][ 8 ]]
|
|
[[ string->unsigned long int ][ !!! *5* !!! ][ 87 ][ 9 ][ 9 ]]
|
|
[[ string->unsigned long long ][ !!! *3* !!! ][ 89 ][ 9 ][ 8 ]]
|
|
[[ string->float ][ 52 ][ 114 ][ 38 ][ !!! *22* !!! ]]
|
|
[[ string->double ][ 49 ][ 79 ][ 32 ][ !!! *22* !!! ]]
|
|
[[ string->long double ][ 83 ][ 160 ][ 65 ][ !!! *47* !!! ]]
|
|
[[ string->array<char, 50> ][ !!! *<1* !!! ][ 114 ][ 21 ][ 16 ]]
|
|
[[ string->string ][ !!! *2* !!! ][ 78 ][ 34 ][ --- ]]
|
|
[[ string->container::string ][ !!! *1* !!! ][ 100 ][ 11 ][ --- ]]
|
|
[[ string->char ][ !!! *4* !!! ][ 60 ][ 16 ][ 7 ]]
|
|
[[ string->signed char ][ !!! *5* !!! ][ 70 ][ 30 ][ 30 ]]
|
|
[[ string->unsigned char ][ !!! *10* !!! ][ 119 ][ 31 ][ 30 ]]
|
|
[[ int->string ][ !!! *17* !!! ][ 140 ][ 38 ][ 28 ]]
|
|
[[ short->string ][ !!! *17* !!! ][ 139 ][ 38 ][ 29 ]]
|
|
[[ long int->string ][ !!! *17* !!! ][ 139 ][ 37 ][ 29 ]]
|
|
[[ long long->string ][ !!! *18* !!! ][ 138 ][ 37 ][ 30 ]]
|
|
[[ unsigned int->string ][ !!! *17* !!! ][ 138 ][ 37 ][ 29 ]]
|
|
[[ unsigned short->string ][ !!! *17* !!! ][ 139 ][ 38 ][ 29 ]]
|
|
[[ unsigned long int->string ][ !!! *17* !!! ][ 142 ][ 37 ][ 29 ]]
|
|
[[ unsigned long long->string ][ !!! *8* !!! ][ 71 ][ 16 ][ 28 ]]
|
|
[[ float->string ][ 68 ][ 97 ][ 42 ][ !!! *38* !!! ]]
|
|
[[ double->string ][ 68 ][ 134 ][ 43 ][ !!! *25* !!! ]]
|
|
[[ long double->string ][ 72 ][ 164 ][ 91 ][ !!! *55* !!! ]]
|
|
[[ char*->char ][ !!! *<1* !!! ][ 76 ][ 4 ][ 5 ]]
|
|
[[ char*->signed char ][ !!! *<1* !!! ][ 54 ][ 5 ][ 5 ]]
|
|
[[ char*->unsigned char ][ !!! *<1* !!! ][ 55 ][ 4 ][ 5 ]]
|
|
[[ char*->int ][ !!! *3* !!! ][ 60 ][ 10 ][ 8 ]]
|
|
[[ char*->short ][ !!! *3* !!! ][ 61 ][ 9 ][ 8 ]]
|
|
[[ char*->long int ][ !!! *4* !!! ][ 61 ][ 9 ][ 8 ]]
|
|
[[ char*->long long ][ !!! *3* !!! ][ 60 ][ 9 ][ 8 ]]
|
|
[[ char*->unsigned int ][ !!! *3* !!! ][ 59 ][ 8 ][ 9 ]]
|
|
[[ char*->unsigned short ][ !!! *3* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ char*->unsigned long int ][ !!! *3* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ char*->unsigned long long ][ !!! *3* !!! ][ 59 ][ 10 ][ 8 ]]
|
|
[[ char*->float ][ 48 ][ 80 ][ 32 ][ !!! *25* !!! ]]
|
|
[[ char*->double ][ 48 ][ 81 ][ 32 ][ !!! *22* !!! ]]
|
|
[[ char*->long double ][ 48 ][ 90 ][ 31 ][ !!! *22* !!! ]]
|
|
[[ char*->array<char, 50> ][ !!! *<1* !!! ][ 59 ][ 9 ][ 7 ]]
|
|
[[ char*->string ][ !!! *4* !!! ][ 77 ][ 15 ][ --- ]]
|
|
[[ char*->container::string ][ !!! *1* !!! ][ 62 ][ 12 ][ --- ]]
|
|
[[ unsigned char*->char ][ !!! *<1* !!! ][ 54 ][ 4 ][ 5 ]]
|
|
[[ unsigned char*->signed char ][ !!! *<1* !!! ][ 53 ][ 4 ][ 5 ]]
|
|
[[ unsigned char*->unsigned char ][ !!! *<1* !!! ][ 57 ][ 4 ][ 5 ]]
|
|
[[ unsigned char*->int ][ !!! *3* !!! ][ 63 ][ 24 ][ 24 ]]
|
|
[[ unsigned char*->short ][ !!! *5* !!! ][ 65 ][ 9 ][ 9 ]]
|
|
[[ unsigned char*->long int ][ !!! *3* !!! ][ 60 ][ 10 ][ 8 ]]
|
|
[[ unsigned char*->long long ][ !!! *4* !!! ][ 67 ][ 23 ][ 23 ]]
|
|
[[ unsigned char*->unsigned int ][ !!! *5* !!! ][ 116 ][ 23 ][ 22 ]]
|
|
[[ unsigned char*->unsigned short ][ !!! *5* !!! ][ 114 ][ 22 ][ 22 ]]
|
|
[[ unsigned char*->unsigned long int ][ !!! *6* !!! ][ 118 ][ 23 ][ 22 ]]
|
|
[[ unsigned char*->unsigned long long ][ !!! *6* !!! ][ 116 ][ 23 ][ 22 ]]
|
|
[[ unsigned char*->float ][ 93 ][ 160 ][ 66 ][ !!! *47* !!! ]]
|
|
[[ unsigned char*->double ][ 93 ][ 158 ][ 64 ][ !!! *46* !!! ]]
|
|
[[ unsigned char*->long double ][ 93 ][ 158 ][ 64 ][ !!! *46* !!! ]]
|
|
[[ unsigned char*->array<char, 50> ][ !!! *<1* !!! ][ 112 ][ 21 ][ 17 ]]
|
|
[[ unsigned char*->string ][ !!! *10* !!! ][ 136 ][ 33 ][ --- ]]
|
|
[[ unsigned char*->container::string ][ !!! *<1* !!! ][ 117 ][ 26 ][ --- ]]
|
|
[[ signed char*->char ][ !!! *<1* !!! ][ 102 ][ 11 ][ 10 ]]
|
|
[[ signed char*->signed char ][ !!! *<1* !!! ][ 102 ][ 11 ][ 12 ]]
|
|
[[ signed char*->unsigned char ][ !!! *<1* !!! ][ 102 ][ 11 ][ 12 ]]
|
|
[[ signed char*->int ][ !!! *5* !!! ][ 119 ][ 23 ][ 22 ]]
|
|
[[ signed char*->short ][ !!! *5* !!! ][ 116 ][ 23 ][ 22 ]]
|
|
[[ signed char*->long int ][ !!! *6* !!! ][ 116 ][ 23 ][ 22 ]]
|
|
[[ signed char*->long long ][ !!! *6* !!! ][ 115 ][ 23 ][ 22 ]]
|
|
[[ signed char*->unsigned int ][ !!! *5* !!! ][ 116 ][ 23 ][ 22 ]]
|
|
[[ signed char*->unsigned short ][ !!! *5* !!! ][ 114 ][ 22 ][ 22 ]]
|
|
[[ signed char*->unsigned long int ][ !!! *6* !!! ][ 92 ][ 9 ][ 8 ]]
|
|
[[ signed char*->unsigned long long ][ !!! *3* !!! ][ 60 ][ 9 ][ 10 ]]
|
|
[[ signed char*->float ][ 94 ][ 134 ][ 51 ][ !!! *28* !!! ]]
|
|
[[ signed char*->double ][ 47 ][ 80 ][ 31 ][ !!! *22* !!! ]]
|
|
[[ signed char*->long double ][ 90 ][ 115 ][ 64 ][ !!! *25* !!! ]]
|
|
[[ signed char*->array<char, 50> ][ !!! *<1* !!! ][ 97 ][ 22 ][ 17 ]]
|
|
[[ signed char*->string ][ !!! *11* !!! ][ 139 ][ 34 ][ --- ]]
|
|
[[ signed char*->container::string ][ !!! *<1* !!! ][ 118 ][ 26 ][ --- ]]
|
|
[[ iterator_range<char*>->char ][ !!! *<1* !!! ][ 106 ][ 15 ][ 10 ]]
|
|
[[ iterator_range<char*>->signed char ][ !!! *<1* !!! ][ 107 ][ 15 ][ 13 ]]
|
|
[[ iterator_range<char*>->unsigned char ][ !!! *<1* !!! ][ 107 ][ 15 ][ 12 ]]
|
|
[[ iterator_range<char*>->int ][ !!! *5* !!! ][ 117 ][ 25 ][ 22 ]]
|
|
[[ iterator_range<char*>->short ][ !!! *5* !!! ][ 116 ][ 25 ][ 22 ]]
|
|
[[ iterator_range<char*>->long int ][ !!! *6* !!! ][ 114 ][ 22 ][ 20 ]]
|
|
[[ iterator_range<char*>->long long ][ !!! *5* !!! ][ 106 ][ 23 ][ 22 ]]
|
|
[[ iterator_range<char*>->unsigned int ][ !!! *5* !!! ][ 104 ][ 21 ][ 20 ]]
|
|
[[ iterator_range<char*>->unsigned short ][ !!! *5* !!! ][ 105 ][ 22 ][ 20 ]]
|
|
[[ iterator_range<char*>->unsigned long int ][ !!! *5* !!! ][ 106 ][ 22 ][ 20 ]]
|
|
[[ iterator_range<char*>->unsigned long long ][ !!! *5* !!! ][ 105 ][ 23 ][ 20 ]]
|
|
[[ iterator_range<char*>->float ][ 89 ][ 140 ][ !!! *42* !!! ][ 43 ]]
|
|
[[ iterator_range<char*>->double ][ 88 ][ 127 ][ 43 ][ !!! *43* !!! ]]
|
|
[[ iterator_range<char*>->long double ][ 88 ][ 127 ][ 43 ][ !!! *43* !!! ]]
|
|
[[ iterator_range<char*>->array<char, 50> ][ !!! *<1* !!! ][ 104 ][ 22 ][ 15 ]]
|
|
[[ iterator_range<char*>->string ][ !!! *9* !!! ][ 122 ][ 32 ][ --- ]]
|
|
[[ iterator_range<char*>->container::string ][ !!! *<1* !!! ][ 105 ][ 24 ][ --- ]]
|
|
[[ array<char, 50>->char ][ !!! *<1* !!! ][ 68 ][ 4 ][ 4 ]]
|
|
[[ array<char, 50>->signed char ][ !!! *<1* !!! ][ 47 ][ 4 ][ 5 ]]
|
|
[[ array<char, 50>->unsigned char ][ !!! *<1* !!! ][ 48 ][ 4 ][ 5 ]]
|
|
[[ array<char, 50>->int ][ !!! *3* !!! ][ 53 ][ 9 ][ 8 ]]
|
|
[[ array<char, 50>->short ][ !!! *3* !!! ][ 54 ][ 9 ][ 8 ]]
|
|
[[ array<char, 50>->long int ][ !!! *3* !!! ][ 54 ][ 8 ][ 7 ]]
|
|
[[ array<char, 50>->long long ][ !!! *3* !!! ][ 53 ][ 8 ][ 8 ]]
|
|
[[ array<char, 50>->unsigned int ][ !!! *3* !!! ][ 52 ][ 7 ][ 8 ]]
|
|
[[ array<char, 50>->unsigned short ][ !!! *3* !!! ][ 53 ][ 8 ][ 7 ]]
|
|
[[ array<char, 50>->unsigned long int ][ !!! *3* !!! ][ 53 ][ 8 ][ 8 ]]
|
|
[[ array<char, 50>->unsigned long long ][ !!! *3* !!! ][ 53 ][ 9 ][ 8 ]]
|
|
[[ array<char, 50>->float ][ 43 ][ 72 ][ 29 ][ !!! *20* !!! ]]
|
|
[[ array<char, 50>->double ][ 42 ][ 72 ][ 28 ][ !!! *20* !!! ]]
|
|
[[ array<char, 50>->long double ][ 43 ][ 72 ][ 28 ][ !!! *20* !!! ]]
|
|
[[ array<char, 50>->array<char, 50> ][ !!! *<1* !!! ][ 53 ][ 8 ][ 6 ]]
|
|
[[ array<char, 50>->string ][ !!! *4* !!! ][ 62 ][ 13 ][ --- ]]
|
|
[[ array<char, 50>->container::string ][ !!! *1* !!! ][ 54 ][ 10 ][ --- ]]
|
|
[[ int->int ][ !!! *<1* !!! ][ 57 ][ 10 ][ --- ]]
|
|
[[ float->double ][ !!! *<1* !!! ][ 102 ][ 49 ][ --- ]]
|
|
[[ char->signed char ][ !!! *<1* !!! ][ 49 ][ 3 ][ --- ]]
|
|
]
|
|
[endsect]
|
|
|
|
|
|
|
|
[/ END of section, generated by performance measuring program ]
|
|
[endsect]
|
|
|