comp.lang.ada
 help / color / mirror / Atom feed
From: Georg Bauhaus <rm.dash-bauhaus@futureapps.de>
Subject: Re: Exception handling overhead?
Date: Fri, 24 Apr 2009 17:48:56 +0200
Date: 2009-04-24T17:48:57+02:00	[thread overview]
Message-ID: <49f1df69$0$31330$9b4e6d93@newsspool4.arcor-online.net> (raw)
In-Reply-To: <pHjIl.157617$4m1.91061@bgtnsc05-news.ops.worldnet.att.net>

anon schrieb:
> You must disable the compiler default Range checking, like:

Or Index_Check.  However, this only gives an implementation
permission to omit certain checks. So I wonder whether
 pragma Suppress ( *_Check )
will have an effect on the library code, or whether the library will
have to be recompiled, and then, whether recompilation of the
library will still produce correct code.



> 
>   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
> 


-- 
--
Georg Bauhaus
Y A Time Drain  http://www.9toX.de



      reply	other threads:[~2009-04-24 15:48 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
2009-04-24 15:48   ` Georg Bauhaus [this message]
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox