home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / lang / c / 12680 < prev    next >
Encoding:
Internet Message Format  |  1992-08-23  |  2.5 KB

  1. Xref: sparky comp.lang.c:12680 comp.std.c:2493
  2. Path: sparky!uunet!elroy.jpl.nasa.gov!ames!olivea!mintaka.lcs.mit.edu!spdcc!iecc!johnl
  3. From: johnl@iecc.cambridge.ma.us (John R. Levine)
  4. Newsgroups: comp.lang.c,comp.std.c
  5. Subject: Re: strcpy implementation question
  6. Message-ID: <1992Aug23.194919.22007@iecc.cambridge.ma.us>
  7. Date: 23 Aug 92 19:49:19 GMT
  8. References: <PINKAS.92Aug21114508@caraway.intel.com> <1992Aug23.003930.9918@saaf.se>
  9. Organization: I.E.C.C.
  10. Lines: 45
  11.  
  12. In article <1992Aug23.003930.9918@saaf.se> pausch@saaf.se (Paul Schlyter) writes:
  13. >>[I said the C standard says strcpy() has to copy exactly the string
  14. >>including the terminating null character]
  15. >>But it doesn't say "(including the terminating null character and any other
  16. >>garbage convenient for the compiler implementer)".  You have to stop at the
  17. >>null byte.
  18. >
  19. >Even on a machine with word addressing, where each string is very likely to
  20. >occupy an integral number of machine words?
  21.  
  22. C defines a string as a sequence of "char" items with the last one
  23. containing a zero.  There has to be some way to address individual chars
  24. in an implementation or it's hard to see on what basis it claims to be C.
  25. For example, the string "ineptitude" is 11 chars long including the null
  26. character, not 12, 15 or some other convenient multiple.  Consider the
  27. following code:
  28.  
  29.     static char buf[6];
  30.  
  31.     strcpy(buf+3, "cd");
  32.     strcpy(buf, "ab");
  33.  
  34. If buf doesn't end up containing "ab\0cd\0" I'd say that something was
  35. seriously wrong.
  36.  
  37. The original question asked whether when using strcpy() to copy a string
  38. from one static array to another it would be an OK optimization to copy
  39. the whole array as full words in an unwound loop rather than looking for
  40. the null byte.  Temporarily disregarding the total wrongheadedness of the
  41. idea, there are two other reasons not to copy words:
  42.  
  43. 1.  If the programmer wanted to copy the whole buffer, he would have used
  44. memcpy(), since that's what it's for.
  45.  
  46. 2.  It is my impression that the most common case where source and target
  47. array length are both known is when the source operand is a literal
  48. string.  In that case the compiler knows the exact length of the actual
  49. string and can generate its unwound code, copying exactly the right number
  50. of characters at the end.  This gets you most of the performance gain of
  51. the proposed optimization while still being correct.
  52.  
  53. -- 
  54. John R. Levine, IECC, POB 349, Cambridge MA 02238, +1 617 492 3869
  55. johnl@iecc.cambridge.ma.us, {ima|spdcc|world}!iecc!johnl
  56. Re-elect Vice President Potatoe-Head !
  57.