Re: str{,l,n}cpy()
新城@筑波大学情報です。こんにちは。
In article <m34quy63bi.fsf@kzin.dip.jp>
Mito <co_mon@ybb.ne.jp> writes:
> 新城さんの考えは、たとえ strcpy の正しい使いかたを知ったとし
> ても使うべきではない、というふうに思われるのですが、もしそう
> なら理由を教えてもらえませんか?
strcpy() を使った方がよい局面というのが、なかなか出てこない
ので、「strcpy()使うな」でいいんじゃないか、ということです。
何か「こういう時には strcpy() がいい」という状況はありますか?
> 本題とははずれますが、私は memcpy() ってほとんど使いません。
> 代わりに memmove() を使います。memcpy() が必要な場面って思い
> 付きませんが、何かありましたっけ?
memmove() か。なるほど。これは、重なっていても OK なわけね。
それは、memcpy() は、領域が重なっていたらアウト。それは、
memmove() の方が、いいんじゃないですか。
In article <bu4io3$63j$1@caraway.media.kyoto-u.ac.jp>
<kounoike@mbh.nifty.com> writes:
> 自己フォロー。すいません,これ撤回させて頂きます。早とちりでした。ワード単位
> を考慮したstrncpyのスマートな実装ってそう簡単ではないような気がします。でき
> たところでmemcpyより速くなるとは思えません。つまり,どうやって残り(これも
> strlen(src)しなければ分からない。)をワード単位に,しかも'\0'で埋めるのかと
> 考えると。ちょっと私では思いつきません。
最近は、メモリのアクセス回数で速度は図れます。残りを 0 で埋
めたいという要求は、そんなにはないんじゃないか、ということで
す。そうなると、メモリを埋めるだけ損だということです。
char s1[100];
strncpy(s1,s2,sizeof(s1));
strlcpy(s1,s2,sizeof(s1));
を考えると、strncpy() だと 100 バイト全部 store が入るけれど、
strlcpy() なら、s2 が短ければその文しかアクセスしません。
n = strlen(s2);
strncpy(s1,s2,n);
s1[n]=0;
strlen() と cpy で2回 s2 をスキャンしているので、strlcpy()
より遅そうだというのは、そうなんでしょう。キャッシュが効くの
で、そんなには差はないかもしれませんね。
In article <3989351news.pl@insigna.ie.u-ryukyu.ac.jp>
kono@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> 河野真治 @ 琉球大学情報工学です。
> 最近のIntel系は、CPUが勝手にまとめてアクセスするように変換
> してしまうみたいですね。
> アライメントをずらしてword copyとかしてもベンチマークで時間
> が変わらなくてびっくりしたことがあります。
複数バイトのストアを、ワード単位ののストアに自動的にまとめた
りはしないんですか。ロードの方は、自動的にそうなるんだろうけ
れど。キャッシュでライトバックなら自動的にそうなるということ
かなあ。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735