2007.09.12 15:02 "Re: [Tiff] SIZEOF_UNSIGNED_LONG", by Bob Friesenhahn
On Tue, 11 Sep 2007, Frank Warmerdam wrote:
The concern I have is that this code defaults to assuming 32bit if the macro is not defined, and it produces incorrect results if the unsigned long is actually 64bit.
I wonder if we should either:
- Require that SIZEOF_UNSIGNED_LONG be explicitly 8 or 4, and if it is not defined we #error to stop the build.
- Add some sort of runtime checking to detect that sizeof(unsigned long) is actually 4 if SIZEOF_UNSIGNED_LONG is not defined.
I have yet to encounter a modern system where sizeof(long) is not 8 or 4. I notice that each macro is used exactly once. It does not seem bad to me to have the macro incorporate both cases with a "runtime" test for sizeof(long). Since sizeof(long) will be a constant, 1/2 of the code will be dead code and the compiler can simply throw it away. Even if it does not throw the unused code away there should be practically no runtime overhead if it does perform the test.
There are probably more imaginative approaches than I describe above but I leave those approaches for people with an imagination. It seems that the implementation of FILL and ZERO are a form of optimization for decisions which are not very hard (most are cp[n-1]=value), could be implemented quite differently, and might actually run faster without the apparent optimization.
GraphicsMagick Maintainer, http://www.GraphicsMagick.org/