In order to determine what kind of saving could be achieved, I defined a test using the expression:
The values of the constants
d and the variables
z were all chosen so that the expression would never overflow. Three cases were done. The first used
unsigned int. The second used a range type defined similar to one above. The third was like the second, except the code was compiled so that the checks were always done regardless of the possibility of overflow. For each case, the expression was put in an external function which was executed several million times, and an average elapsed time for one execution calculated. For this particular test, using my machine, and my compiler (Visual C++ Toolkit 2003 (13.10.3077), optimization level O2) the results were:
1st case: 0.0246 seconds 2nd case: 0.0297 seconds 3rd case: 0.1119 seconds
The results using GCC (MinGW 3.4.2, optimization level O3) were similar. This was an admittedly contrived test, but I was interested in seeing what the best case savings would be. Your mileage may vary.
There are various ways to reduce the cost of the overflow checking at the cost of portability. One way is to increase the assumptions made by the code. For example, if your implementation treats signed overflow in a benign and predicable way, then you can simplify those checks. Even more time can be saved by using inline assembly, if your compiler has such a feature.
ranged_type class template provides integral types that are safe from overflowing and constrained to a given range. Using templates allows much of the overhead of the checks to be removed, though it is not possible to remove all. There is always some cost associated with safety. In the future, I'd like to expand the implementation to include floating point types, but only time will tell if that is even possible.
This class is part of a free C++ library of classes I have written over the years and have found useful in my own programs. The latest version can always be found here: http://www.richherrick.com/software/herrick_library.html
I would like to thank my peer reviewer, Victor Bazarov, for his invaluable help and insight.
Rich has thirteen years experience as a software engineer. For the past eight years he has been employed by Lockheed Martin Systems Integration in Owego, NY writing real-time embedded systems oriented towards avionics. He can be contacted at [email protected].