エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2017/11/04(土) 16:33:35.07ID:NYxCuvMY2デフォルトの名無しさん
2017/11/05(日) 17:44:45.44ID:rSDVGL6P >>1
乙
乙
2017/11/05(日) 20:58:13.61ID:80sy7ZoV
unsigned long strtoulxn( char const* psz, size_t n )
{
unsigned long v;
for ( v = 0; *psz && n--; psz++ ) {
if ( ! isdigit( *psz ) ) {
continue;
}
v = 10 * v + ( *psz - '0' );
}
return v;
}
{
unsigned long v;
for ( v = 0; *psz && n--; psz++ ) {
if ( ! isdigit( *psz ) ) {
continue;
}
v = 10 * v + ( *psz - '0' );
}
return v;
}
2017/11/05(日) 21:07:57.69ID:i5zx7IeJ
これは酷いクソコード
2017/11/05(日) 22:25:14.64ID:NxjjuMpf
実行速度
見やすさ
汎用性
コードサイズ
どれかひとつ位は満たさないと
見やすさ
汎用性
コードサイズ
どれかひとつ位は満たさないと
2017/11/05(日) 22:42:14.76ID:3uuR82Hq
>>5
まあそう言うごたくを言うのは一つぐらいは満たしたコードを書いてからでないとね
まあそう言うごたくを言うのは一つぐらいは満たしたコードを書いてからでないとね
2017/11/06(月) 08:01:53.31ID:uTTN+kxR
>>3 の関数は前のスレッドの終わりに出た
"12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、
てお題の答案かな。
…と思ったけど、NUL終端文字列が仮定されてるね。
どういう流れで投稿されたんだろう?
"12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、
てお題の答案かな。
…と思ったけど、NUL終端文字列が仮定されてるね。
どういう流れで投稿されたんだろう?
2017/11/06(月) 08:45:24.00ID:H37qYFYx
size_t n で文字数を受けとるからNUL終端である必要は無いのでは
2017/11/06(月) 09:40:14.23ID:L15YU14L
if (strncmp(psz, "12 34 56", 8) == 0) return 123456;
2017/11/06(月) 23:29:19.85ID:OMQOLu1z
相変わらず片山はクソコードしか書かないな
""だと不定値返る数値変換なんてゴミ
""だと不定値返る数値変換なんてゴミ
2017/11/06(月) 23:59:53.41ID:/gW4r5bt
>>10
確かにクソコードだが不定値は返らんぞ
確かにクソコードだが不定値は返らんぞ
2017/11/07(火) 04:37:45.33ID:T7zw8VZw
>>9 は質問者に対する皮肉のつもりだったんだけど
2017/11/07(火) 04:47:47.90ID:T7zw8VZw
意図的に糞コードを書いた事もわからないクソがいるとは
こんな簡単なコードの動作も理解できてないようだし
こんな簡単なコードの動作も理解できてないようだし
2017/11/07(火) 06:16:53.55ID:pkgJL5Ib
初心者歓迎をうたうスレッドで「意図的に『糞コード』を書いた」などと
しかも後付けで言われてもあんまり支持できないなぁ。
せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。
「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。
>>3 のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、
実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。
後置デクリメント評価値、ね。
しかも後付けで言われてもあんまり支持できないなぁ。
せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。
「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。
>>3 のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、
実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。
後置デクリメント評価値、ね。
2017/11/07(火) 06:53:54.21ID:+N0q+RZO
誰も騙してないのにクソみたいなプライドが高いな
2017/11/07(火) 07:08:01.90ID:aXJpgdu1
出だしから勢いのいいうんこだな
何のスレか忘れてしまいそう
何のスレか忘れてしまいそう
2017/11/07(火) 08:24:36.39ID:FXbSqjpU
psz = "", n = 0 はいいけど
char a[8] で psz = a, n = 8 を渡すと不定値どころか鼻から悪魔の糞コード
仕様も理解せずに余計なことしてバグを作り込む知ったかの典型
char a[8] で psz = a, n = 8 を渡すと不定値どころか鼻から悪魔の糞コード
仕様も理解せずに余計なことしてバグを作り込む知ったかの典型
2017/11/07(火) 08:32:51.44ID:T7zw8VZw
>>3
●パフォーマンス
*pszが3回も出てくる
代入して持っておいた方が
チープなコンパイラでは速度が変わる
isdigit
どうせ数字が連続してる前提のコードなんだから
関数を呼ばずに'0' '9'と比較しちゃおう
そうのが速い
関数コールは一般的に遅い
●見やすさ
forループにいくつも入れない
while (n--) か for (size_t i= 0; i < n ; i++)
null文字はbreakで
●仕様
null文字とサイズ、両方で停止は仕様としては問題ない
パフォーマンス最優先であればそれぞれの特別版を作ればいい
文字数もスペースの位置も固定で
パフォーマンス最優先なら
ループアンロールするのが一番
●パフォーマンス
*pszが3回も出てくる
代入して持っておいた方が
チープなコンパイラでは速度が変わる
isdigit
どうせ数字が連続してる前提のコードなんだから
関数を呼ばずに'0' '9'と比較しちゃおう
そうのが速い
関数コールは一般的に遅い
●見やすさ
forループにいくつも入れない
while (n--) か for (size_t i= 0; i < n ; i++)
null文字はbreakで
●仕様
null文字とサイズ、両方で停止は仕様としては問題ない
パフォーマンス最優先であればそれぞれの特別版を作ればいい
文字数もスペースの位置も固定で
パフォーマンス最優先なら
ループアンロールするのが一番
2017/11/07(火) 12:47:26.90ID:FXbSqjpU
2017/11/07(火) 13:22:08.68ID:oMcRDniv
仕様として「両方で停止は問題ない」よな?
判別の順番は問題だ
順番が逆
そもそも相談者の仕様がおかしい
判別の順番は問題だ
順番が逆
そもそも相談者の仕様がおかしい
2017/11/07(火) 16:16:20.01ID:3ER4WXnW
先に大きさでチェックしてから 内容の nul チェックする
for ( v = 0; n-- && *psz; psz++ ) {
これなら、存在しない指し先のデリファレンスしないし
ただ、
ショートサーキット前提の記述をよしとするかどうかはわからん
for ( v = 0; n-- && *psz; psz++ ) {
これなら、存在しない指し先のデリファレンスしないし
ただ、
ショートサーキット前提の記述をよしとするかどうかはわからん
2017/11/07(火) 17:07:50.15ID:Zpoup5pM
int str2i( const char *s, size_t n )
{
int v = 0;
while ( n-- ) {
char c = *s++;
if ( c == '??0' ) break;
if ( '0' <= c && c <= '9' ) v = v * 10 + ( c - '0' );
}
return v;
}
{
int v = 0;
while ( n-- ) {
char c = *s++;
if ( c == '??0' ) break;
if ( '0' <= c && c <= '9' ) v = v * 10 + ( c - '0' );
}
return v;
}
2017/11/07(火) 17:17:37.91ID:jEe4bM6y
片山以外に文字化けするブラウザ使ってる奴いるのか
あとnull文字って初心者が背伸びしてる感じがして微笑ましいな
あとnull文字って初心者が背伸びしてる感じがして微笑ましいな
2017/11/07(火) 17:31:27.26ID:Zpoup5pM
ソフト歴35年ですが
2017/11/07(火) 17:50:48.44ID:6NdbJPOz
PC(プロセスコントローラー)のプログラマーですが何か?
ってのは居たが
ってのは居たが
2017/11/08(水) 01:37:38.03ID:MEe7IGP8
isdigitが関数コールな処理系ってあるのか?
ここって車輪の再発明好きな人多いのかね
ここって車輪の再発明好きな人多いのかね
28片山博文MZ ◆T6xkBnTXz7B0
2017/11/08(水) 02:06:05.60ID:TZ5JAUzS isdigitは、ロケールの関係で遅くなる可能性があるはず。256バイトの配列を使うのが最速だ。
29はちみつ餃子 ◆8X2XSCHEME
2017/11/08(水) 03:38:56.63ID:xvDlz0If ちょっとした演算よりメモリアクセスの方が遅いこともあるよ。
本当に配列が最速?
(試したわけではないので配列が最速かもしれない……)
本当に配列が最速?
(試したわけではないので配列が最速かもしれない……)
2017/11/08(水) 06:19:22.66ID:u4hO2YM0
2017/11/08(水) 06:36:16.44ID:u4hO2YM0
int str2i( const char *s, size_t n )
{
int v = 0;
while ( n-- ) {
char c = *s++;
switch (c){
case '¥0':
goto brk;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
v = v * 10 + ( c - '0' );
break;
}
}
brk:
return v;
}
{
int v = 0;
while ( n-- ) {
char c = *s++;
switch (c){
case '¥0':
goto brk;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
v = v * 10 + ( c - '0' );
break;
}
}
brk:
return v;
}
2017/11/08(水) 06:36:55.45ID:u4hO2YM0
これのがまだマシ
2017/11/08(水) 06:40:10.32ID:u4hO2YM0
普通に>>23でいい
2017/11/08(水) 09:37:48.99ID:kEoXgNLC
gotoとかwwww
って思った人いるんだろうか
って思った人いるんだろうか
2017/11/08(水) 10:35:10.40ID:FLS9cqpb
switch である必要ないな
2017/11/08(水) 11:33:23.57ID:2d9va5Xh
2017/11/08(水) 12:27:45.50ID:2VVChtYT
&&って条件分岐が入るけど、本当に高速?
2017/11/08(水) 12:44:08.80ID:FLS9cqpb
そこはctypeで判定だね
2017/11/08(水) 13:01:31.63ID:2VVChtYT
40はちみつ餃子 ◆8X2XSCHEME
2017/11/08(水) 13:02:27.97ID:xvDlz0If >>37
&& では分岐しなかった。
'0' <= c && c <= '9' を clang で -O3 付きでコンパイルしてみたらこうなった。
addl $-48, %eax
cmpl $10, %eax
setb %al
賢いな!
直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。
&& では分岐しなかった。
'0' <= c && c <= '9' を clang で -O3 付きでコンパイルしてみたらこうなった。
addl $-48, %eax
cmpl $10, %eax
setb %al
賢いな!
直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。
41片山博文MZ ◆T6xkBnTXz7B0
2017/11/08(水) 13:37:52.71ID:TZ5JAUzS 俺の知識も時代遅れになったな。シンプル伊豆ベスト。
42はちみつ餃子 ◆8X2XSCHEME
2017/11/08(水) 18:14:28.55ID:xvDlz0If もっと >>40 を高速化できないかと思って考えてみたが、
'0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。
ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね〜
'0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。
ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね〜
2017/11/08(水) 18:22:33.84ID:8jdacwiA
>>42
まるで昔は速かったかのようだ
まるで昔は速かったかのようだ
2017/11/08(水) 18:43:03.66ID:u4hO2YM0
ん?
8086はビット演算の方が速いぞ
8086はビット演算の方が速いぞ
2017/11/08(水) 18:57:26.39ID:GPQLPiKH
2017/11/08(水) 18:59:47.82ID:GPQLPiKH
2017/11/08(水) 19:03:40.31ID:CwKlKlOQ
>>47
俺は書くけど それを"普通"とまで言い切ってしまって良いという自信はない
俺は書くけど それを"普通"とまで言い切ってしまって良いという自信はない
2017/11/08(水) 19:14:43.13ID:u4hO2YM0
>>46
わからないならだまってれば
正確な要求仕様がわからない事くらい誰でもわかる
両方でとまる関数は片方で止まる関数の機能を含むので
問題になる場面は普通は考えられない
質問に書いてない、文字列の途中にNULL文字とか
いうアホな事を心配しない限り
わからないならだまってれば
正確な要求仕様がわからない事くらい誰でもわかる
両方でとまる関数は片方で止まる関数の機能を含むので
問題になる場面は普通は考えられない
質問に書いてない、文字列の途中にNULL文字とか
いうアホな事を心配しない限り
2017/11/08(水) 19:18:16.64ID:u4hO2YM0
全角数字の方がまだ可能性がある
2017/11/08(水) 19:42:17.13ID:GPQLPiKH
>>49
こういう思い込みの激しい奴が要らんバグを作り込むんだよな...
こういう思い込みの激しい奴が要らんバグを作り込むんだよな...
2017/11/08(水) 19:51:21.87ID:CyIcapPx
isdigit関連で性能測ってみた。
環境: Core i7-2600 / gcc 6.4 (-O2)
rund() & 0xff の値で条件分岐して、真ならさらに rand() を呼ぶ、を10億回ループ。
条件式はASCII前提。
数字: 条件式 < int配列ルックアップ < isdigit
英字: 条件式 <= int配列ルックアップ < isalpha
数字英字: int配列ルックアップ < 条件式 < isalnum
ロケールの影響か、isalphaなどはisdigitより遅い。
char配列ルックアップはint配列より遅い。
奇妙なことに、配列ルックアップでも、数字だけより、英字も入ってくると遅くなる。なぜだ。
環境: Core i7-2600 / gcc 6.4 (-O2)
rund() & 0xff の値で条件分岐して、真ならさらに rand() を呼ぶ、を10億回ループ。
条件式はASCII前提。
数字: 条件式 < int配列ルックアップ < isdigit
英字: 条件式 <= int配列ルックアップ < isalpha
数字英字: int配列ルックアップ < 条件式 < isalnum
ロケールの影響か、isalphaなどはisdigitより遅い。
char配列ルックアップはint配列より遅い。
奇妙なことに、配列ルックアップでも、数字だけより、英字も入ってくると遅くなる。なぜだ。
5352
2017/11/08(水) 19:54:52.03ID:CyIcapPx あ、ごめん、rand() 呼ぶ分、数字 < 英字 < 英数字の順で遅くなるの、当然だった。
2017/11/08(水) 20:30:53.41ID:u4hO2YM0
2017/11/08(水) 20:49:19.11ID:QAR8Spec
このスレの結論はこれか。
10000*a[0]+10000*a[1]+1000*a[3]+100*a[4]+10*a[6]+a[7]-5333328;
これより速くする方法あるのか
10000*a[0]+10000*a[1]+1000*a[3]+100*a[4]+10*a[6]+a[7]-5333328;
これより速くする方法あるのか
2017/11/08(水) 21:08:26.39ID:CwKlKlOQ
何時の間に判定せずにすむようになったんだ
2017/11/08(水) 21:11:25.51ID:u4hO2YM0
前スレの>>997が質問者だから
フォーマットは固定と思われる
フォーマットは固定と思われる
2017/11/08(水) 21:12:49.95ID:u4hO2YM0
さすがに '0' * 111111 をコンパイル時に計算しないコンパイラは無いと思うので
このままで良い気はする
当然こちらの方が意味が分かりやすい
このままで良い気はする
当然こちらの方が意味が分かりやすい
2017/11/08(水) 21:14:04.15ID:u4hO2YM0
( ) を色々とかえて時間を測ってみたけどほとんど同じ
やっぱりLEAを多用してる
VS2017の64bit Releaseビルドの場合
やっぱりLEAを多用してる
VS2017の64bit Releaseビルドの場合
2017/11/08(水) 21:39:10.43ID:u4hO2YM0
VPMOVZXBD xmm0, a
VPMADFWD xmm0, xmm0, [掛け算テーブル]
VPHADDD xmm0, xmm0, xmm0
VPHADDD xmm0, xmm0, xmm0
VPMADFWD xmm0, xmm0, [掛け算テーブル]
VPHADDD xmm0, xmm0, xmm0
VPHADDD xmm0, xmm0, xmm0
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【おこめ券】物価高対策の“おこめ券”全米販は1枚477円で販売へ 鈴木農水大臣「国民の皆様に活用いただきやすいよう工夫いただいた」★2 [ぐれ★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★5 [蚤の市★]
- 神田沙也加さん元恋人で元俳優の前山剛久 六本木のメンズラウンジ勤務を報告「真叶(まなと)です。よろしく」 [muffin★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 ★5 [蚤の市★]
- 【埼玉】54歳男性死亡…菓子店で機械に挟まれる 昼前に1人で作業中、あんを混ぜる“かくはん機”に巻き込まれ…女性従業員が発見 入間 [ぐれ★]
- 【麻雀】プロ雀士の岡田紗佳さんが勝訴、点数計算めぐる発言は「違法とは言えず」 大宮簡裁 [征夷大将軍★]
- ムミィ🥺いる❓🏡
- ママカースト、地獄すぎるwwwwwwwwwwwwwwwwwwwww [977790669]
- 【高市悲報】片山さつき「かじ取り間違えてデフレになったらどうすんの!😡」😲 [359965264]
- 建設作業員(27)男子高校生のうんこを盗撮し逮捕 [389326466]
- 日本を破壊した総理大臣ほど支持率高くない?小泉、安倍、高市
- 逆に、これは中国産に限るっていうもの [331823419]
