Deutsch English Français Italiano |
<vbnre4$2h8k3$1@paganini.bofh.team> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!2.eu.feeder.erje.net!feeder.erje.net!newsfeed.bofh.team!paganini.bofh.team!not-for-mail From: Waldek Hebisch <antispam@fricas.org> Newsgroups: comp.lang.c Subject: Re: Top 10 most common hard skills listed on resumes... Date: Mon, 9 Sep 2024 22:04:54 -0000 (UTC) Organization: To protect and to server Message-ID: <vbnre4$2h8k3$1@paganini.bofh.team> References: <vab101$3er$1@reader1.panix.com> <vbepcb$q6p2$1@dont-email.me> <vbgb5q$1ruv8$1@paganini.bofh.team> <vbhbbb$1blt4$1@dont-email.me> <vbipp5$24kl5$1@paganini.bofh.team> <vbk0d9$1tajm$1@dont-email.me> <vbkpfc$27l2o$1@paganini.bofh.team> <vbl3am$228vv$1@dont-email.me> <vblfgb$2dkij$1@paganini.bofh.team> <vblhp7$249ug$1@dont-email.me> <vbloje$2e34o$1@paganini.bofh.team> <vbmeae$2bn2v$2@dont-email.me> <vbn8pe$2g9i6$2@paganini.bofh.team> <vbnaqt$2g0vc$1@dont-email.me> Injection-Date: Mon, 9 Sep 2024 22:04:54 -0000 (UTC) Injection-Info: paganini.bofh.team; logging-data="2663043"; posting-host="WwiNTD3IIceGeoS5hCc4+A.user.paganini.bofh.team"; mail-complaints-to="usenet@bofh.team"; posting-account="9dIQLXBM7WM9KzA+yjdR4A"; User-Agent: tin/2.6.2-20221225 ("Pittyvaich") (Linux/6.1.0-9-amd64 (x86_64)) X-Notice: Filtered by postfilter v. 0.9.3 Bytes: 6056 Lines: 88 David Brown <david.brown@hesbynett.no> wrote: > On 09/09/2024 18:46, Waldek Hebisch wrote: >> David Brown <david.brown@hesbynett.no> wrote: >>> On 09/09/2024 05:04, Waldek Hebisch wrote: >>>> Bart <bc@freeuk.com> wrote: >>>>> On 09/09/2024 01:29, Waldek Hebisch wrote: >>>>>> Bart <bc@freeuk.com> wrote: >>>>> >>>>>> No. It is essential for efficiency to have 32-bit types. On 32-bit >>>>>> machines doing otherwise would add useless instructions to object >>>>>> code. More precisly, really stupid compiler will generate useless >>>>>> intructions even with my declarations, really smart one will >>>>>> notice that variables fit in 32-bits and optimize accordingly. >>>>>> But at least some gcc versions needed such declarations. Note >>>>>> also that my version makes clear that there there is >>>>>> symmetry (everything should be added using 64-bit precision), >>>>>> you depend on promotion rules which creates visual asymetry >>>>>> are requires reasoning to realize that meaning is symetric. >>>>> >>>>> Your posted code used 64-bit aritmetic. The xext and c 32-bit variables >>>>> were used in loops where they need to be widened to 64 bits anyway. The >>>>> new value of c is set from a 32-bit result. >>>> >>>> Well, at C level there is 64-bit type. The intent is that C compiler >>>> should notice that the result is 32-bit + carry flag. Ideally >>>> compiler should notice that c has only one bit and can keep it >>>> in carry flag. On i386 comparison needed for loop control would >>>> destroy carry flag, so there must be code using value of carry in >>>> register and code to save carry to register. But one addition >>>> of highs parts can be skipped. On 32-bit ARM compiler can use >>>> special machine istructions and actually generated code which >>>> is close to optimal. >>> >>> When you have a type that you want to be at least 32 bits (to cover the >>> range you need), and want it to be as efficient as possible on 32-bit >>> and 64-bit machines (and 16-bit and 8-bit, still found in >>> microcontrollers), use "int_fast32_t". On x86-64 it will be 64-bit, on >>> 32-bit systems it will be 32-bit. Use of the [u]int_fastNN_t types can >>> make code significantly more efficient on 64-bit systems while retaining >>> efficiency on 32-bit (or even smaller) targets. >> >> Well, I have constraints, some of which are outside of C code. >> To resolve contraints I normally use some configure machinery. >> If a standard type is exact match for my constraints, then I would >> use standard type, possibly adding some fallbacks for pre-standard >> systems. But if my constranits differ, I see no advantage in >> using more "fancy" standard types compared to old types. >> > > The "fancy" standard types in this case specify /exactly/ what you > apparently want - a type that can deal with at least 32 bits for range, > and is as efficient as possible on different targets. What other > constraints do you have here that make "int_fast32_t" unsuitable? This routine is part of small library. Good approximation is that I want a type (posibly depending on target) which will make this library fast. As I wrote in another message I plan to use 64-bit units of work on 64-bit targets. I have not plans to use the library in 8-bit or 16-bit targets, but if I needed them on such targets I probably would use 16-bit work unit. So, while 32-bit work unit represents current state, it not correct statement of intentions. Consequently, 'int_fast32_t' would be as misleading or more misleading than 'int' ('int' is reasonable indication that choice of types is not finished, 'int_fast32_t' suggest that it is proper choice for all targets). >> Concerning '<stdint.h>', somewhat worring thing is that several types >> there seem to be optional (or maybe where optional in older versions >> of the standard). I am not sure if this can be real problem, >> but too many times I saw that on various issues developers say >> "this in not mandatory, so we will skip it". >> > > <stdint.h> has been required since C99. It has not been optional in any > C standard in the last 25 years. That's a /long/ time - long enough for > most people to be able to say "it's standard". > > And almost every C90 compiler also includes <stdint.h> as an extension. > > If you manage to find a compiler that is old enough not to have > <stdint.h>, and you need to use it for actual code, it's probably worth > spending the 3 minutes it takes to write a suitable <stdint.h> yourself > for that target. ATM I do not have standard text handy to check, but AFAIR several _types_ in <stdint.h> were not required but optional. -- Waldek Hebisch