comp.lang.ada
 help / color / mirror / Atom feed
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




  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