$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] expected/result/etc
From: Michael Marcin (mike.marcin_at_[hidden])
Date: 2016-02-12 04:25:21
On 2/12/2016 1:39 AM, Emil Dotchevski wrote:
> On Thu, Feb 11, 2016 at 9:02 PM, Michael Marcin <mike.marcin_at_[hidden]>
> wrote:
>>
>> But I don't want to pay for them in retail builds.
>>
>
> Good, I don't, either.
Sorry, I don't follow at all then.
If .get() isn't specified as UB when a value is not ready how are you
going to avoid the overhead?
Specifically .get() must do *at least* an if statement before returning
the value.
Are you relying on the compiler to optimize away the check and throw as
unreachable given an earlier check for an error?
>
> And I'm arguing that whether you throw or not should rarely be a question
> of performance. If hitting the intersection limit in a raytracing program
> leads to an invalid frame, you should report that error by throwing an
> exception. This has zero performance cost if functions are being inlined,
> which they are at the lowest levels of a raytracer. Generally, if you can
> afford the "if" statement to detect the error, you can afford to throw.
>
Sorry I don't follow.
Are you suggesting that the raytracer should be inlined into every call
site?
What I think you're saying is that where I want to write code that looks
like:
result<int> bar()
{
return std::make_error_code( std::errc::bad_address );
}
int main()
{
int foo;
auto _foo = bar();
if ( _foo ) {
foo = _foo.get();
} else {
foo = 0;
}
return foo;
}
I should instead write code that looks like:
int bar()
{
throw std::system_error(
std::make_error_code( std::errc::bad_address ) );
}
int main()
{
int foo;
try {
foo = bar();
}
catch ( std::system_error& e )
{
foo = 0;
}
return foo;
}
And I should expect equal performance?
>
> In ~20 years in the video game industry I have never needed to implement my
> own STL, and modern STL implementations are a lot better than in the old
> days. On the other hand years ago I did have to refactor a company's
> home-grown STL replacement to fold templates to reduce bloat, since
> otherwise the executable was over 20 megs on a platform with 32 megs of
> RAM. Ironically, the STL on that platform was folding the templates
> automatically. Too bad they had it banned.
>
Your experience differs from my own.
EASTL just (officially) released to much fanfare.
https://github.com/electronicarts/EASTL
It's very easy to find performance problems in even current shipping
standard libraries.
2 examples:
See what happens when you insert a duplicate key into a std::map VS2015.
Or look towards the 17x perf increase in iostreams float serialization
coming in VS2015 update 2.