[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 05/16 09:46 / Filesize : 287 KB / Number-of Response : 1022
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.102【環境依存OK】



1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net]
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/

2 名前:デフォルトの名無しさん [2017/11/05(日) 17:44:45.44 ID:rSDVGL6P.net]
>>1


3 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 20:58:13.61 ID:80sy7ZoV.net]
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;
}

4 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 21:07:57.69 ID:i5zx7IeJ.net]
これは酷いクソコード

5 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 22:25:14.64 ID:NxjjuMpf.net]
実行速度
見やすさ
汎用性
コードサイズ

どれかひとつ位は満たさないと

6 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 22:42:14.76 ID:3uuR82Hq.net]
>>5
まあそう言うごたくを言うのは一つぐらいは満たしたコードを書いてからでないとね

7 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 08:01:53.31 ID:uTTN+kxR.net]
>>3 の関

8 名前:狽ヘ前のスレッドの終わりに出た
"12 34 56"(NUL終端なし8byte) を数値の 123456 に変換、
てお題の答案かな。

…と思ったけど、NUL終端文字列が仮定されてるね。
どういう流れで投稿されたんだろう?
[]
[ここ壊れてます]

9 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 08:45:24.00 ID:H37qYFYx.net]
size_t n で文字数を受けとるからNUL終端である必要は無いのでは

10 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 09:40:14.23 ID:L15YU14L.net]
if (strncmp(psz, "12 34 56", 8) == 0) return 123456;



11 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 23:29:19.85 ID:OMQOLu1z.net]
相変わらず片山はクソコードしか書かないな
""だと不定値返る数値変換なんてゴミ

12 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 23:59:53.41 ID:/gW4r5bt.net]
>>10
確かにクソコードだが不定値は返らんぞ

13 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 04:37:45.33 ID:T7zw8VZw.net]
>>9 は質問者に対する皮肉のつもりだったんだけど

14 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 04:47:47.90 ID:T7zw8VZw.net]
意図的に糞コードを書いた事もわからないクソがいるとは
こんな簡単なコードの動作も理解できてないようだし

15 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 06:16:53.55 ID:pkgJL5Ib.net]
初心者歓迎をうたうスレッドで「意図的に『糞コード』を書いた」などと
しかも後付けで言われてもあんまり支持できないなぁ。
せめて最初から「お前らこれ改善してみろよ」とかで出してくれ。
「糞コード」とけなすだけで、具体的な問題点の指摘がないってのも寂しいわ。

>>3 のソース、引数のpszが""でも、nが0でも妥当な返り値 0 が返るけど、
実は最初に見たとき n==0 で呼ばれた場合に即時終了しないと騙されたわ。
後置デクリメント評価値、ね。

16 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 06:53:54.21 ID:+N0q+RZO.net]
誰も騙してないのにクソみたいなプライドが高いな

17 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 07:08:01.90 ID:aXJpgdu1.net]
出だしから勢いのいいうんこだな
何のスレか忘れてしまいそう

18 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 08:24:36.39 ID:FXbSqjpU.net]
psz = "", n = 0 はいいけど
char a[8] で psz = a, n = 8 を渡すと不定値どころか鼻から悪魔の糞コード
仕様も理解せずに余計なことしてバグを作り込む知ったかの典型

19 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 08:32:51.44 ID:T7zw8VZw.net]
>>3

●パフォーマンス
*pszが3回も出てくる
代入して持っておいた方が
チープなコンパイラでは速度が変わる

isdigit
どうせ数字が連続してる前提のコードなんだから
関数を呼ばずに'0' '9'と比較しちゃおう
そうのが速い
関数コールは一般的に遅い

●見やすさ
forループにいくつも入れない
while (n--) か for (size_t i= 0; i < n ; i++)
null文字はbreakで

●仕様
null文字とサイズ、両方で停止は仕様としては問題ない
パフォーマンス最優先であればそれぞれの特別版を作ればいい
文字数もスペースの位置も固定で
パフォーマンス最優先なら
ループアンロールするのが一番

20 名前:片山博文MZ mailto:sage [2017/11/07(火) 10:46:29.90 ID:BS6pey7a.net]
>>10
人違い。



21 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 12:47:26.90 ID:FXbSqjpU.net]
>>18
> null文字とサイズ、両方で停止は仕様としては問題ない
だからダメだっつーの
知ったかは黙ってろよ
最低限サイズチェックを先にやらないとダメ

22 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 13:22:08.68 ID:oMcRDniv.net]
仕様として「両方で停止は問題ない」よな?

判別の順番は問題だ
順番が逆

そもそも相談者の仕様がおかしい

23 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 16:16:20.01 ID:3ER4WXnW.net]
先に大きさでチェックしてから 内容の nul チェックする
for ( v = 0; n-- && *psz; psz++ ) {
これなら、存在しない指し先のデリファレンスしないし

ただ、
ショートサーキット前提の記述をよしとするかどうかはわからん

24 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 17:07:50.15 ID:Zpoup5pM.net]
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;
}

25 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 17:17:37.91 ID:jEe4bM6y.net]
片山以外に文字化けするブラウザ使ってる奴いるのか
あとnull文字って初心者が背伸びしてる感じがして微笑ましいな

26 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 17:31:27.26 ID:Zpoup5pM.net]
ソフト歴35年ですが

27 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 17:50:48.44 ID:6NdbJPOz.net]
PC(プロセスコントローラー)のプログラマーですが何か?
ってのは居たが

28 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 01:37:38.03 ID:MEe7IGP8.net]
isdigitが関数コールな処理系ってあるのか?
ここって車輪の再発明好きな人多いのかね

29 名前:片山博文MZ mailto:sage [2017/11/08(水) 02:06:05.60 ID:TZ5JAUzS.net]
isdigitは、ロケールの関係で遅くなる可能性があるはず。256バイトの配列を使うのが最速だ。

30 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 03:38:56.63 ID:xvDlz0If.net]
ちょっとした演算よりメモリアクセスの方が遅いこともあるよ。
本当に配列が最速?
(試したわけではないので配列が最速かもしれない……)



31 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:19:22.66 ID:u4hO2YM0.net]
配列www
ないない
仮に>>23より速くても

32 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:36:16.44 ID:u4hO2YM0.net]
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;
}

33 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:36:55.45 ID:u4hO2YM0.net]
これのがまだマシ

34 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:40:10.32 ID:u4hO2YM0.net]
普通に>>23でいい

35 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 09:37:48.99 ID:kEoXgNLC.net]
gotoとかwwww
って思った人いるんだろうか

36 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 10:35:10.40 ID:FLS9cqpb.net]
switch である必要ないな

37 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 11:33:23.57 ID:2d9va5Xh.net]
>>34
ああ、素人はgoto嫌うよな

>>35
もちろん必要は無い
テーブルよりは色々な面でマシってだけ
普通に if ( '0' <= c && c <= '9' ) で良い
一目で意味がわかるし高速

38 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 12:27:45.50 ID:2VVChtYT.net]
&&って条件分岐が入るけど、本当に高速?

39 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 12:44:08.80 ID:FLS9cqpb.net]
そこはctypeで判定だね

40 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 13:01:31.63 ID:2VVChtYT.net]
>>37
とおもってアセンブリ吐かせてみたら、すごかった。
48引いた上で、符号なしで10未満か



41 名前:判定してるので、
余分な条件分岐してなかった。
[]
[ここ壊れてます]

42 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 13:02:27.97 ID:xvDlz0If.net]
>>37
&& では分岐しなかった。
'0' <= c && c <= '9' を clang で -O3 付きでコンパイルしてみたらこうなった。

addl $-48, %eax
cmpl $10, %eax
setb %al

賢いな!
直後に分岐するなら結果をレジスタに書き込む必要はないから実質的に二命令だ。

43 名前:片山博文MZ mailto:sage [2017/11/08(水) 13:37:52.71 ID:TZ5JAUzS.net]
俺の知識も時代遅れになったな。シンプル伊豆ベスト。

44 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 18:14:28.55 ID:xvDlz0If.net]
もっと >>40 を高速化できないかと思って考えてみたが、
'0' を引くんじゃなくて 0x30 と xor を取ってから 10 より小さいか比較するっていうのでもいける。

ただ、最近はビット演算が算術命令より速いとも限らないみたいなんだよね〜

45 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:22:33.84 ID:8jdacwiA.net]
>>42
まるで昔は速かったかのようだ

46 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 18:37:11.31 ID:xvDlz0If.net]
>>42-43
Z80 ですら足し算と XOR は 1 クロックだったわ。 スマソ

47 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:43:03.66 ID:u4hO2YM0.net]
ん?
8086はビット演算の方が速いぞ

48 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:57:26.39 ID:GPQLPiKH.net]
>>21
> 仕様として「両方で停止は問題ない」よな?
相談者でないとわからん
途中に'\0'があるケースについては書いてないから

> そもそも相談者の仕様がおかしい
それはお前が決める話じゃない

49 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:59:47.82 ID:GPQLPiKH.net]
>>22
> ショートサーキット前提の記述をよしとするかどうかはわからん
if(p != 0 && *p != '\0')
みたいなのは普通に書かない?

50 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:03:40.31 ID:CwKlKlOQ.net]
>>47
俺は書くけど それを"普通"とまで言い切ってしまって良いという自信はない



51 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:14:43.13 ID:u4hO2YM0.net]
>>46
わからないならだまってれば
正確な要求仕様がわからない事くらい誰でもわかる

両方でとまる関数は片方で止まる関数の機能を含むので
問題になる場面は普通は考えられない
質問に書いてない、文字列の途中にNULL文字とか
いうアホな事を心配しない限り

52 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:18:16.64 ID:u4hO2YM0.net]
全角数字の方がまだ可能性がある

53 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:42:17.13 ID:GPQLPiKH.net]
>>49
こういう思い込みの激しい奴が要らんバグを作り込むんだよな...

54 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:51:21.87 ID:CyIcapPx.net]
isdigit関連で性能測ってみた。
環境: Core i7-2600 / gcc 6.4 (-O2)
rund() & 0xff の値で条件分岐して、真ならさらに rand() を呼ぶ、を10億回ループ。
条件式はASCII前提。

数字: 条件式 < int配列ルックアップ < isdigit
英字: 条件式 <= int配列ルックアップ < isalpha
数字英字: int配列ルックアップ < 条件式 < isalnum

ロケールの影響か、isalphaなどはisdigitより遅い。
char配列ルックアップはint配列より遅い。
奇妙なことに、配列ルックアップでも、数字だけより、英字も入ってくると遅くなる。なぜだ。

55 名前:52 mailto:sage [2017/11/08(水) 19:54:52.03 ID:CyIcapPx.net]
あ、ごめん、rand() 呼ぶ分、数字 < 英字 < 英数字の順で遅くなるの、当然だった。

56 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 20:30:53.41 ID:u4hO2YM0.net]
最速なら前スレの>>995>>997

>>997は演算の依存性が高いので
>>995の方が少し速いかな?
まあコンパイラや環境依存でしょう

x64前提なら、
64bit一気に持ってきて偶数奇数桁に分けて、
LEAで5倍してシフトして足すとか
AVXで乗算してから水平演算とか
色々と考えられるけど
まあ一応このスレのC言語の範囲で

57 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 20:49:19.11 ID:QAR8Spec.net]
このスレの結論はこれか。
10000*a[0]+10000*a[1]+1000*a[3]+100*a[4]+10*a[6]+a[7]-5333328;

これより速くする方法あるのか

58 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:08:26.39 ID:CwKlKlOQ.net]
何時の間に判定せずにすむようになったんだ

59 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:11:25.51 ID:u4hO2YM0.net]
前スレの>>997が質問者だから
フォーマットは固定と思われる

60 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:12:49.95 ID:u4hO2YM0.net]
さすがに '0' * 111111 をコンパイル時に計算しないコンパイラは無いと思うので
このままで良い気はする
当然こちらの方が意味が分かりやすい



61 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:14:04.15 ID:u4hO2YM0.net]
( ) を色々とかえて時間を測ってみたけどほとんど同じ
やっぱりLEAを多用してる
VS2017の64bit Releaseビルドの場合

62 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:39:10.43 ID:u4hO2YM0.net]
VPMOVZXBD xmm0, a
VPMADFWD xmm0, xmm0, [掛け算テーブル]
VPHADDD xmm0, xmm0, xmm0
VPHADDD xmm0, xmm0, xmm0

63 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:40:02.30 ID:u4hO2YM0.net]
AVXが使えるならこれ

64 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:42:47.06 ID:u4hO2YM0.net]
微妙に間違った
メモリが連続してれば複数同時に出来る
連続してなくても複数同時にやった方が速い

65 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:43:54.20 ID:YMDhJx7T.net]
>>29でメモリアクセスに言及されてる話の流れの中で
10億回ループがいちいちキャッシュクリアされてるのかが気になる

66 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 21:49:19.34 ID:u4hO2YM0.net]
普通はキャッシュに入ったままだが、
処理次第で可能性が無いことはない
他のキャッシュを汚染する可能性もある
HTTなどでは特に

他に良い方法が有るのにわざわざ面倒なテーブルにする意味がわからない

67 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 07:46:10.46 ID:F5y7yLWH.net]
std::vector<std::string>からchar*const[]を作成するいい方法ってないですか。
newするしかないですかね。

68 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 10:26:44.91 ID:TvDreq2K.net]
>>65
vector<char*> に各要素 s の &s[0] を入れて済むなら new は要らなさそう。

69 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 20:15:55.61 ID:MIqJX5DT.net]
>>66
まあどうみても内部でnewしてるんだろうけど

70 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 21:01:13.10 ID:UsP+TtJI.net]
クラスの概念がわかりません



71 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 21:19:13.94 ID:lLb0QJod.net]
構造体みたいなもの

72 名前:片山博文MZ mailto:sage [2017/11/10(金) 21:39:23.58 ID:x1hu0efq.net]
>>68
クラスは構造体に関数を追加したようなもの。
クラス内部の関数はメソッドと呼ばれる。
メソッドからは、クラスのデータとメソッドを参照できる。
データとメソッドのそれぞれの項目をクラスのメンバーと呼ぶ。
クラスの実体はインスタンスと呼ばれる。メソッドからは、thisポインターにより、クラスのインスタンスを参照できる。
メンバーは、public:、protected:、private:によってアクセスを制御できる。アクセスできないメンバーを参照するとコンパイルエラーになる。

73 名前:片山博文MZ mailto:sage [2017/11/10(金) 22:11:59.59 ID:x1hu0efq.net]
class A
{
int a;
};
と書くとA::aは、privateになる。構造体と同じアクセスにするには
class A
{
public: int a;
};
と書かないといけない。このようにクラスのデフォルトのアクセスはprivateになり、構造体はpublicになるという違いもある。

74 名前:片山博文MZ mailto:sage [2017/11/10(金) 22:14:05.73 ID:x1hu0efq.net]
クラスはコンストラクタと呼ばれる特殊なメソッドがあり、インスタンスの構築に使われる。
また、インスタンスが破棄されるときに、デストラクタという特殊なメソッドが呼ばれる。

75 名前:片山博文MZ mailto:sage [2017/11/10(金) 22:17:22.95 ID:x1hu0efq.net]
コンストラクタの例。
class A
{
public:
int m_a;
A(int a) {m_a = a + 1; }
};

int main() {
A a(2);
printf("%d\n", a.m_a);
}

76 名前:片山博文MZ mailto:sage [2017/11/10(金) 22:19:15.61 ID:x1hu0efq.net]
別のコンストラクタの例。
class A {
public: int m_a;
A(int a, int b) : m_a(a + b) { }
};
int main() {
A a(2, 3);
printf("%d\n", a.m_a);
}

77 名前:はちみつ餃子 mailto:sage [2017/11/10(金) 23:02:09.42 ID:4kUQXTj6.net]
そんなの説明してやらなくてもネット上に無数の解説があるだろ。
ちゃんとした説明を読んで理解できないなら掲示板で短い説明読んだってわかりゃしねーよ。

78 名前:片山博文MZ mailto:sage [2017/11/10(金) 23:14:40.61 ID:x1hu0efq.net]
>>75
情報が多過ぎて迷子になってるんじゃないか。マニュアル読め、規格票読め、で終わればいいのだが。

79 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 23:21:03.62 ID:YANYSepQ.net]
そう思うならなぜ現在地を聞く前に世界地図を渡すのか

80 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 23:32:23.63 ID:2wx3Dyqu.net]
>クラスは構造体に関数を追加したようなもの

こういうアホってどこにでもいるんですね



81 名前: mailto:sage [2017/11/10(金) 23:40:07.53 ID:qCTAOUdD.net]
>>78
その理解で8割がたOKだと思うのだが、何が問題なの?

82 名前:はちみつ餃子 mailto:sage [2017/11/10(金) 23:46:33.90 ID:4kUQXTj6.net]
>>76
チュートリアルだってたくさんあるじゃん。

83 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 00:24:04.64 ID:5MIg+SHx.net]
>>79
クラスがわからんやつにこんな説明しても通じないだろ

84 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 00:49:17.73 ID:1PUme0lw.net]
山田さんってどんな人?と聞かれて
原子の集まりだよ。って答えるようなもの
形式的にウソじゃあないんだが
そこじゃないだろっていう

85 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 02:47:19.31 ID:fW1Ux/Kl.net]
純粋にC++のクラスそれ自体の概念というなら
C言語(ベース)でのオブジェクト指向プログラミングをサポートするために言語機能で用意された部品
オブジェクト指向プログラミングにおけるオブジェクト、オブジェクトの状態、
メッセージの送受信、メッセージを受けたときの振る舞いといった概念を具体化した仕組みの一例

86 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 13:22:39.97 ID:134uacB+.net]
記憶クラスについての質問の可能性

87 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 23:51:21.74 ID:nDRVLcBe.net]
実のところはOOPを知らないからクラスをどう使えばいいのかわからない/
他人の真似でなんとなく使ってるけどなぜクラスを使うのかがわからないといったあたりの話だろ

88 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 02:18:46.71 ID:jSfISRI4.net]
下手にクラスを説明するやつが多いせいで、コーディング経験なくても理解できる概念的なものだと思われちゃう
クラスは実用あってこそ

89 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 07:58:58.54 ID:gxZQPw73.net]
アニマルクラスがわんにゃー鳴くのがオブジェクト指向です

90 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 17:16:56.90 ID:ehTxx6H6.net]
メンバ関数を呼び出す際の
「オブジェクトにメッセージを送る」って言い回しも
C++だと分かりにくいね。

この表現がしっくりくるプログラミング言語というか
環境もあるのだろうけど。



91 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 17:52:35.50 ID:NgxFNsMl.net]
>>88
そういうのをベタで実現しているOO言語はないかな…

92 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 18:04:22.80 ID:evJ3QlJY.net]
smalltalkは?

93 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 20:55:50.24 ID:6XHR1ElK.net]
>>90
あれも結局、関数(メソッド)の動的なコールをそう呼ばせてるだけ
同じSmalltalkでもSmalltalk-72までさかのぼるとメッセージ送信と呼べなくもない仕組みにはなっているけど
それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと

まあ、ともあれC++の「オブジェクト指向」を説明するときには「メッセージを送る」とかはすっかり忘れていいよ
そもそもC++の設計者の提唱するオブジェクト指向は「抽象データ型(端的にはユーザー定義の型)」を
Simulaという言語から拝借した「クラス」という言語機能で実現することが主軸のアイデアなので
www.stroustrup.com/whatis.pdf

94 名前:はちみつ餃子 mailto:sage [2017/11/22(水) 21:08:20.60 ID:Rn9KsJdK.net]
言語の意味論とそれを実現するメカニズムは別物だから、
仕組みがどうなっているかから考察するのは無粋だと思うけどなぁ。

まあ C++ は低水準レイヤでの仕組みを意識せざるを得ない、
意味論とメカニズムが不可分なデザインではあるから概念としてのメッセージ指向よりも
メカニズムに意識が引きずられてしまうというのは確かにあるかもしれない。

95 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:21:24.87 ID:3PrpHuiB.net]
メソッド呼び出しってメッセージパッシング感すげー出てない?

96 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:28:03.86 ID:+hB2MqUt.net]
>それでもオブジェクトに(メッセージを)「送る」というよりは(トークン列を)「流し込む」って感じかと

違いがわからないw

97 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 22:33:35.60 ID:2YdhEIzW.net]
>>93
メッセージパッシング言うなら、何かが静的に決定してる時点で興醒めだよ
wiki.c2.com/?AlanKayOnMessaging

98 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 23:02:11.68 ID:XGz0BDt0.net]
>>95
C++のポリモーフィックなメソッドは動的ディスパッチだろう

99 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 23:09:00.03 ID:NgxFNsMl.net]
>>91
>抽象データ型
これがすべてなのに、どうしてメッセージ駆動の話が今でももちきりなのだろうか?

100 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 08:26:45.55 ID:Qr4pYIOt.net]
>>96
C++に「動的なものは何もない」という主張ではなく
「静的に決まる何かが一つでもある」時点でそれをメッセージングに例えるのは興醒めという意味

少なくともケイは彼のOOPにおけるメッセージングを「遅延結合の徹底」の目的で提案している
d.hatena.ne.jp/katzchang/touch/20080807/p2
「私が考えるOOPはメッセージング、状態処理のローカルでの保有・保護・隠蔽、
そして全ての物に対する強力な遅延束縛、これだけだ。
これはSmalltalkとLISPだけが実現できている。他のシステムでも可能かもしれないが、私は知らない。」

つまるところ、これはすなわち、SmalltalkやLispみたいな変態言語でもなければ、
(あるいはアクター機構のように、並列化を意識して本当にメッセージを送るのでもなければ)
無理して「メッセージパッシング」なんてたとえる必要は無いんやで、という話でしかない








[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<287KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef