From: anon@anon.org (anon)
Subject: Re: Exception handling overhead?
Date: Fri, 24 Apr 2009 14:06:13 GMT
Date: 2009-04-24T14:06:13+00:00 [thread overview]
Message-ID: <pHjIl.157617$4m1.91061@bgtnsc05-news.ops.worldnet.att.net> (raw)
In-Reply-To: Xns9BF75019363FApcc482719gmailcom@198.186.192.137
You must disable the compiler default Range checking, like:
function Element( B : Buffer; Index : Positive ) return Character is
begin
declare
-- Temporary disable system checks
pragma Suppress ( Range_Check ) ;
begin
if Index > Ada.Strings.Unbounded.Length ( B.Internal_String ) then
raise Bad_Index ;
end if ;
end ;
return Ada.Strings.Unbounded.Element ( B.Internal_String, Index ) ;
end Element ;
In <Xns9BF75019363FApcc482719gmailcom@198.186.192.137>, "Peter C. Chapin" <pcc482719@gmail.com> writes:
>Hello!
>
>I'm creating a type intended to represent lines of editable text. It
>will provide some specialized services and is not intended to be a
>general purpose string type. At the moment I'm wrapping the type
>Ada.Strings.Unbounded.Unbounded_String (I'm really using Wide_Strings,
>but I don't think that's important right now). I may want to change that
>underlying implementation in the future so I don't want to directly
>expose my current choice to my clients. Thus I'm providing some
>subprograms that do some minor things and then just forward to
>subprograms in Ada.Strings.Unbounded.
>
>My question is about exceptions. To avoid exposing my implementation
>choice and to give me more control in the long run I've defined my own
>exception for (as an example) an out of bounds access:
>
>Bad_Index : exception;
>
>Naturally I want to raise this exception if the client tries to access a
>character not in my buffer. This leads to two possibilities.
>
>function Element(B : Buffer; Index : Positive) return Character is
>begin
> if Index > Ada.Strings.Unbounded.Length(B.Internal_String) then
> raise Bad_Index;
> end if;
> return Ada.Strings.Unbounded.Element(B.Internal_String, Index);
>end Element;
>
>This entails two checks on the index value: the one I'm doing and the
>one being done inside Ada.Strings.Unbounded.Element. Another approach is
>
>function Element(B : Buffer; Index : Positive) return Character is
>begin
> return Ada.Strings.Unbounded.Element(B.Internal_String, Index);
>exception
> when Ada.Strings.Index_Error =>
> raise Bad_Index;
>end Element;
>
>This lets the check exist in only one place but it invokes the machinery
>of exception handling.
>
>Now I know that in C++ there are implementation methods that allow zero
>execution time overhead in the case when an exception is not thrown (at
>the expense of increasing executable size and making thrown exceptions
>slower). Compilers are not required to use such methods, of course, but
>I know of at least one that does... or that can if the right options are
>selected. I'm wondering about how this might work in Ada. Does Ada admit
>such implementation methods? If so, do compilers commonly use them? From
>a raw performance point of view which of the two approaches above would
>be "better?"
>
>For the record... I understand that in my application it probably
>doesn't matter much either way. I also understand that the answer is
>likely to be very compiler specific. This is mostly a question of
>academic interest.
>
>Thanks!
>
>Peter
next prev parent reply other threads:[~2009-04-24 14:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-24 11:52 Exception handling overhead? Peter C. Chapin
2009-04-24 12:06 ` Ludovic Brenta
2009-04-24 12:42 ` Dmitry A. Kazakov
2009-04-25 11:58 ` Peter C. Chapin
2009-04-24 14:06 ` anon [this message]
2009-04-24 15:48 ` Georg Bauhaus
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox