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


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

C++相談室 part126



1 名前:デフォルトの名無しさん mailto:sage [2016/08/13(土) 11:24:45.65 ID:NPYsKJkE.net]
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part125
echo.2ch.net/test/read.cgi/tech/1463761261/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
echo.2ch.net/test/read.cgi/tech/1469177649/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
www.bohyoh.com/CandCPP/FAQ/ (日本語)

684 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 00:44:49.84 ID:T7xxiiqM.net]
うちの会社にいるレガシープログラマもクラスを引数にするのを嫌うな

685 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 01:12:15.86 ID:NvSd/4YA.net]
税金泥棒は、RMPについて何も理解できていない
分からないくせに、ひたすらコピペを繰り返す
突っ込んだ話を始めると、チンプンカンプンで付いて来れなくなる

686 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 01:30:52.05 ID:Y3qTK8mc.net]
gccはC++11のmoveとかつかわんでも、呼出側がスタックに用意したところに
せっせと返値を書き込んでるのでクラスを返値にしたところでcopyとか余計なことはしないな。

687 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 06:19:48.63 ID:Cz5G8II8.net]
コピーする必要がなかったかも知れないのにコピーしておいて余計なことはしていないとな

688 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 08:52:00.54 ID:uFO7Kr12.net]
返り血にmove使うと事態は悪化

689 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 10:11:38.91 ID:5FDuUIWg.net]
拭き取ろうと擦れば擦るほど赤く血塗られた範囲が広がって…。

690 名前:デフォルトの名無しさん [2016/09/11(日) 13:09:13.01 ID:QVUfpLVG.net]
特定の関数があるなしで呼び出す関数をわけたいのですけど方法はありますか

template<typename T> void hoge(T val)
{
val.hage(0);
}

template<typename T> void hoge(T val)
{
val.husa(100);
}

691 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 13:55:18.24 ID:KOEkGnWi.net]
SFINAE使えばできる

692 名前:デフォルトの名無しさん [2016/09/11(日) 14:53:31.90 ID:h0ayt47M.net]
コードではSSE命令をまったく使わず、コンパイラ最適化でSSE使ってもらいやすくする方法って
どこかに書いてありますか?



693 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 15:31:44.83 ID:9/O5tJ2a.net]
type_traitsのテストクラスばかり使っていたらSFINAEの書き方忘れた

694 名前:デフォルトの名無しさん [2016/09/11(日) 15:50:46.32 ID:hGR6Mbre.net]
>>683
https://msdn.microsoft.com/ja-jp/library/7t5yh4fd.aspx

695 名前:デフォルトの名無しさん [2016/09/11(日) 22:14:42.57 ID:OIs9p1U8.net]
void func( char *output, int max_buffer )

これはさ、max_bufferで指定した範囲で対応出来るようにするための引数だろ
呼び出す側でintの範囲なら自由に決められるに決まってるだろ

696 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:19:35.02 ID:m0F7Ld2f.net]
↑アスペ

697 名前:デフォルトの名無しさん [2016/09/11(日) 22:20:45.93 ID:OIs9p1U8.net]
いやいや、outputの最大値を一緒に渡すのは常識だろう

698 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:25:57.81 ID:2EFm3ZKd.net]
要するに、
char b[128];
func(&b[16],128-16);
ってやって、特定の範囲で処理できるのも利点だろうといってるんだと。
あんまりやらないけど。

699 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:34:43.72 ID:T7xxiiqM.net]
文字列クラスでもできるけど

700 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:37:36.83 ID:2EFm3ZKd.net]
substrだっけか?

701 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:38:54.98 ID:m0F7Ld2f.net]
『要するに』
超能力者>>689のオツムが心配だ

702 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:40:38.21 ID:2EFm3ZKd.net]
チガッテマスカ?



703 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:43:30.84 ID:m0F7Ld2f.net]
>>693
>>689の解釈は
『max_bufferで指定した範囲』
『intの範囲なら自由に』
という表現と整合しない。

704 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:45:10.47 ID:2EFm3ZKd.net]
オーバーフローを指定するような間抜けなことをわざわざするんかいな。

705 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:46:59.51 ID:m0F7Ld2f.net]
>>695
>>688は「intの最大」でなく「outputの最大」と言っているのだが

706 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:48:58.46 ID:2EFm3ZKd.net]
>>686の頭にはなんか特殊用途でもよぎったんじゃね?
俺が懇意すぎたかな・・・。Orz

707 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:51:16.46 ID:m0F7Ld2f.net]
深い意味はない
単に>>674を見て並んでいた単語に連想した自分の知識を反射的に書き込んだだけ

708 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 22:54:31.75 ID:2EFm3ZKd.net]
俺は>>686ではない。それはそうかもな。
俺はC++ではstd::まで書くStl派なので、このところ生配列は使ったことがない。
というか、オーバーフロー怖くて使いたくない。

709 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:01:21.72 ID:67F7MmNh.net]
生配列を使ったことないってことはないだろ
インターフェースにstlのコンテナとかを露出したらコンパイラ依存になっちゃうじゃん
てか高速に処理したくてスタックに配列を積みたいときとかどうするわけ?

710 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:04:52.03 ID:2EFm3ZKd.net]
競プロ解いてるだけだから問題にならん。
まぁ、しばらく黙るわ。

711 名前:デフォルトの名無しさん [2016/09/11(日) 23:09:47.79 ID:OIs9p1U8.net]
俺が言いたかったのはだね、

void func( char *output, int max_buffer )

のようにchar *outputを渡すような時は、
バッファオーバーフローを防ぐために一緒にサイズも渡すってのが、
C言語での使い方では常識化してるって事だ。

712 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:12:11.14 ID:m0F7Ld2f.net]
わざわざ補足しなくても
そんなことはみんな知ってるから



713 名前:デフォルトの名無しさん [2016/09/11(日) 23:14:19.23 ID:OIs9p1U8.net]
>>674 が変な事言ってたからだ

714 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:17:06.20 ID:67F7MmNh.net]
競プロでSTLコンテナなんて使うか??
アルゴリズムとかはそのまま使えるけどコンテナは普通生配列か必要に応じて自前の使うだろ?

715 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:19:39.01 ID:2EFm3ZKd.net]
ガチ勢じゃないからね。
最近ではリングバッファほしい位で満足してるよ。
STLコンテナで解けないなら、アルゴリズムが悪い事が多い。

716 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:20:05.58 ID:m0F7Ld2f.net]
>>704
>674の懸念は別に変じゃないぞ
変なのは>>674を理解できなかったお前だ

717 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:20:10.89 ID:T7xxiiqM.net]
>>700
規格準拠度が低いクソみたいなコンパイラを使わない

718 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:22:00.72 ID:m0F7Ld2f.net]
どうしたいきなり
>>700も関係無いことを言いだして

719 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:22:32.77 ID:m0F7Ld2f.net]
誤 700も
正 700と

720 名前:デフォルトの名無しさん [2016/09/11(日) 23:23:32.91 ID:OIs9p1U8.net]
>>707
いやいや、おかしいよ。
void func( char *output, int max_buffer )
を使うのにバッファを意識しないプログラムとかありえないだろ

バッファがどのくらいか分からんのに
void func( char *output, int max_buffer )
とか間違ってるだろ。

これCの使い方だぞ

721 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:28:22.83 ID:T7xxiiqM.net]
>>705
競プロなんていうマイナー分野の話なんかしてないし
実行時間のほとんどはアルゴリズム依存なんだから1%未満のオーバーヘッドが影響するわけが無い
固定長配列はarrayを使うべきだし、動的にサイズを変えないといけない場合vectorでまとめて確保して普通のnewした配列として使えばいい
他人の競プロのコード見たら使いまくってるしな

722 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:39:10.29 ID:m0F7Ld2f.net]
>>711
よくわかった
>>674の『バッファサイズをどのぐらい用意すれば良いんだ?という問題が出る』
を単語レベルに近い連想で文を捉えるから珍妙な解釈になる
レスを100回読み直せ



723 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:46:15.15 ID:M5lO5IQC.net]
ID:2EFm3ZKdの背伸びが痛々しい。
このスレで一番出来ない子が何をいっちょまえにレスしてんだか…。
なぁーにが「競プロ解いてるだけ」だよド素人が。

724 名前:デフォルトの名無しさん [2016/09/11(日) 23:48:48.59 ID:OIs9p1U8.net]
>>713
だからよ、
>バッファサイズをどのぐらい用意すれば良いんだ?という問題が出る
って言うような疑問がおかしいんであって、

void func( char *output, int max_buffer)

はサイズを指定して使うもんだ。それ以外にあるかよ。
パターンもパターンやんけ。

バッファサイズがわからん状態で、、
void func( char *output, int max_buffer)ってのはあり得ないんだよ

725 名前:デフォルトの名無しさん mailto:sage [2016/09/11(日) 23:49:06.36 ID:2EFm3ZKd.net]
>>714
はっはー。おだいじんさまぁ〜。

726 名前:デフォルトの名無しさん [2016/09/11(日) 23:54:09.86 ID:IuKZJB78.net]
>>715
別の関数で必要なサイズを返すのか?
変更が別スレッドだったら、さらにロック、アンロックの関数がそれぞれ必要になるな。

727 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:00:05.72 ID:JmiC7f4k.net]
じゃー背伸びついでに言っとくわ。
その関数voidだから失敗したかどうかわからんから、バッファ入力サイズを推定できない。

728 名前:
ドキュメント読め。
[]
[ここ壊れてます]

729 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:03:56.69 ID:JmiC7f4k.net]
チッ間に合わなかった。

730 名前:デフォルトの名無しさん [2016/09/12(月) 00:04:01.94 ID:GwVwE6OL.net]
いやいや、
void func( char *output, int max_buffer)
ってのは

char *output に結果を返すんだよ。
そんなのもわからんのか。

max_bufferはオーバーフローを防ぐための物だ。
何を言ってんだ一体

731 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:04:29.54 ID:hz43BbCS.net]
例外使わないのか
初心者なのかレガシープログラマなのか

732 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:04:37.05 ID:Tu0jZEI4.net]
>>715
その部分の日本語の理解が間違っているとわざわざ教えてやっているのに
他にどういう理解があり得るのかも考えずゴミレスを繰り返すとは
アスペなだけでなくて荒らしのつもりなのか?



733 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:05:58.76 ID:JmiC7f4k.net]
>>720
そんなちゃんぽん仕様にしなくても戻り値一個設定すれば済む話じゃないか。
汚いと思う。 []
[ここ壊れてます]

735 名前:デフォルトの名無しさん [2016/09/12(月) 00:07:03.07 ID:GwVwE6OL.net]
Cやってたらvoid func(char *output, int max_buffer)なんてパターンだろ。
基本中の基本だろ。

736 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:08:06.86 ID:JmiC7f4k.net]
染まってるのか。
まぁいいや。
黙るって言ったから黙る。

737 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:08:07.10 ID:WISOHly2.net]
723 : デフォルトの名無しさん 2016/09/12(月) 00:05:58.76 ID:JmiC7f4k
>>720
そんなちゃんぽん仕様にしなくても戻り値一個設定すれば済む話じゃないか。
汚いと思う。

738 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:09:36.24 ID:Tu0jZEI4.net]
バッファサイズ指定の関数で溢れた時に例外をスローするのは珍しいな
Visual C++の_s関数の配列オーバーロードはそんな仕様だった気もするが

739 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:09:38.22 ID:WIrRwO5G.net]
>>715
https://msdn.microsoft.com/ja-jp/library/cc429127.aspx
バッファサイズを指定できても、結果を正しく格納するのに必要なバッファサイズはわからない
ってことはあるんだよ。

740 名前:デフォルトの名無しさん [2016/09/12(月) 00:11:17.09 ID:GwVwE6OL.net]
void func( char *output, int max_buffer)
これはさ、max_buffer以内で絶対に納めるって前提があるんだよ。
その為のmax_bufferだぞ。

max_bufferの指定が間違ったらエラーなんだよ。
他にどういう使い方あるんだよ

741 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:11:25.69 ID:XcxNhSoL.net]
>>728
マクロでパスの最大規定されてる

742 名前:デフォルトの名無しさん [2016/09/12(月) 00:13:42.09 ID:GwVwE6OL.net]
結果を正しく格納するのに必要なバッファサイズが、max_bufferだろ。
char *outputのサイズがmax_buffeなんだよ

char *outputがオーバーフローしないように、max_bufferを上限に処理をして、
char *outputで返せばオーバーフローしないって仕組みなんだよ。



743 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:14:04.49 ID:Tu0jZEI4.net]
まさか>>728のやさしいレスを見てもまだ世迷い言が続くとは
これはホンモノだ

744 名前:デフォルトの名無しさん [2016/09/12(月) 00:18:26.76 ID:GwVwE6OL.net]
おまえなにもわかってないだろ。
何ひとつ自分で説明してないだろ。

745 名前:デフォルトの名無しさん [2016/09/12(月) 00:21:57.49 ID:U6Ajls88.net]
>>732
老害プログラマによくいる切り捨てられても気にしない、切り捨てによって発生したバグが確認されて初めてバッファーサイズをプログラム内の定数値で変更する人なんでしょ。

C++使ってるなら正しく処理する為には多大な面倒が発生する手法なんて使うなって事なんだけど老害にはそれが理解出来ないらしい。

746 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:22:27.92 ID:/3fOrQXc.net]
max_bufferがあるからバッファオーバーフローを防ぐことが出来る
逆にmax_bufferが効果を発揮する状況というのは
結果を正しく格納するのに必要なバッファサイズがmax_bufferを越える時だ
従って>>731の最初の行は間違っている

747 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:23:39.94 ID:XcxNhSoL.net]
最大値をどうすればいいのかって話でしょ
728の例だと別の場所で最大値は決まってる
でもバッファサイズ3とか小さすぎると欲しい情報は帰ってこない
当然オーバーフローはしないけど

748 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:27:04.07 ID:feiUf+9B.net]
バッファっていう概念がちょっとズレてんのかもな
Cやってる人はコップでプールの水をすくうとき
コップがバッファだ
コップの大きさで回数を重ねてすくう
コップを最大まで大きくしなきゃいけないとか
必要なコップサイズは、などとは考えない
それがバッファ

749 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:28:34.40 ID:Tu0jZEI4.net]
>>730
文脈を理解できない低能は去れ

>>733
健常者なら『レスを100回読み直せ』で理解できると思ったので敢えて説明しなかった失礼
では説明してやろう
<呼び出し側>
 vector<char> result(★);
 func ( &result[0], result.size() );
>>674はこの★をどう決定するかが
呼び出し側コードを書く者の負担になると言っている

750 名前:デフォルトの名無しさん [2016/09/12(月) 00:28:41.75 ID:GwVwE6OL.net]
だからよ、C++の使い方で
void func( char *output, int max_buffer)
を使おうとすれば、Cのバッファを意識する使い方以外に無いだろ。

それをストリングクラスの代わりに
void func( char *output, int max_buffer) を使う手ももあるが、
バッファのサイズをどうするかが問題、とか言ってるから、

そういう使い方はしないし間違ってるって言ってんだろがよ

751 名前:デフォルトの名無しさん [2016/09/12(月) 00:30:38.58 ID:GwVwE6OL.net]
void func( char *output, int max_buffer)
これはよ、char *outputのサイズを意識しない限り、動かせないプログラムだよ

このサイズが分からない時に、
void func( char *output, int max_buffer) を使うってのは無いんだよ
それをあるって言うから、無いって言ってんだよ 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


752 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:35:45.75 ID:XBLhc0H+.net]
>>740
一旦これだけは言っておくが
おまいの言っていることは正常でしかもごくあたりまえのこと
おそらくその点を繰り返す必要はもうないし
そのことはみんな分かってる

読み込む前にサイズ分からないものがあるよね?
そのときは固定サイズじゃ読み込めないよね、
的なことをおまいの相手は繰り返し言ってるんじゃないか?
配列に対するベクタの利点みたいな部分を言いたがってる気がする



753 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:40:53.14 ID:XcxNhSoL.net]
最大値がどっかで決まってるか、outputにヌルいれると必要なサイズ返るとかが普通じゃね
その関数だけじゃ必要なサイズがわからんというお話
パスが欲しいのにバッファ小さすぎてドライブレターだけ返ってきても意味無いわけで

754 名前:デフォルトの名無しさん [2016/09/12(月) 00:43:58.37 ID:GwVwE6OL.net]
void func( char *output, int max_buffer)
を使う前にはサイズを把握してないと駄目ってだけだよ。

それが把握できんのにこういうCライクな使い方は間違ってるって俺は言ってるだけだよ

755 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 00:47:09.50 ID:hz43BbCS.net]
C言語的なインターフェイスは不便だからC++らしく書きましょう

756 名前:デフォルトの名無しさん [2016/09/12(月) 00:47:23.61 ID:U6Ajls88.net]
>>743
格納サイズを把握してたらmax_bufferなんて要らなくね?

757 名前:デフォルトの名無しさん [2016/09/12(月) 00:51:26.47 ID:GwVwE6OL.net]
>>745
いやオーバーフロー対策の最大値だから
引数で明示的にサイズを渡しましょうって取り決めだ

758 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 01:02:10.22 ID:Tu0jZEI4.net]
>>743の達した結論が
>>674とほぼ同じに思えてならない

759 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 01:10:30.26 ID:hz43BbCS.net]
いまさらそんな40年前からある常識を言われも困る

760 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 01:13:36.21 ID:WIrRwO5G.net]
>>730
>728 で挙げた MSDN のページにそんな規定は見当たらないんだけど、どこ見て言ってるの?
MAX_PATH の類のことを言ってるなら、よくある勘違いだろうと思うんだ。
https://www.google.com/search?q=GetModuleFileName+MAX_PATH
d.hatena.ne.jp/satosystems/20100807/1281152224

761 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 06:52:52.36 ID:y21Asc3i.net]
MAXPATH があてにならんのは確かだが
サイズ取得せずにリトライするのもダメ臭が

762 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 08:08:53.69 ID:46mLPt5D.net]
書き込んだサイズを返すくせに必要なサイズを
調べる機能が規格に無いstd::mbstowcsはクソ



763 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 09:10:27.05 ID:HZgwCDH3.net]
プログラミングのコードを書く時のタブvsスペース戦争がついに決着
www.gizmodo.jp/2016/09/tab-vs-space.html
www.gizmodo.jp/images/2016/09/160901coding2.jpg
www.gizmodo.jp/images/2016/09/160901coding3.jpg

764 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 09:38:06.48 ID:y21Asc3i.net]
優れたデータから生まれるクソ同然な解説

765 名前:デフォルトの名無しさん [2016/09/12(月) 10:27:38.72 ID:CKtP/5ek.net]
おまえTAB派かw

766 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 11:33:25.20 ID:+YsVO5lS.net]
タブスペース混在で起きる問題とは?

767 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 12:31:33.38 ID:ZblQazo2.net]
タブ幅が決まってないのが一番の問題だな。2,3,4,8みんなバラバラ。

768 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 13:20:51.17 ID:s5J5+4ba.net]
pythonが致命傷を負う

769 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 13:57:05.61 ID:x7GAwvaf.net]
>outputにヌルいれると必要なサイズ返るとかが普通じゃね

必ずしもそれが有効かどうかわからないから困る
必要なバッファサイズを取得してから実際に文字列を取得するまで
関数を二回呼び出す必要があり

770 名前:Aここに時間差があるのが問題
マルチスレッドで問題になる
取得したバッファサイズは既に古い情報になっている可能性がある
これを解決するにはLockするしかない
obj->lock();
size_t buffer_size = obj->func( nullptr, 0 );
std::vector<char> output( buffer_size );
obj->func( outputr.data(), output.size() );
obj->unlock();
こんなコードはまさに糞であるということ
しかも、lock、unlockをし忘れても、たまたまのタイミングの物で、そこそこ動きそうというのが怖い
つまり、ほんの短い期間の間に、文字列が更新されて取得したバッファサイズが無効になるほうが珍しいだろう
しかし、ありえないことではない
1000回に1回だけ失敗するというのが一番怖い

これに比べれば、関数内でnew char[]して返すほうが、まだいくらかマシに思えるぐらい
しかしこれをやると、帰ってきた文字列は自分で開放しなければならないのか
あるいは開放してはダメなのか、解放関数はdelete[]なのかfreeなのかあるいは別の専用関数なのか
ということが関数ごとにマチマチになり、非常に煩雑になる

std::string output = obj->func();
のほうが断然良い、誰の目にも明らか、短い、シンプル
lock、unlockを呼び出し元が保証しなければならないのは良くない
必要な処理が一発の関数呼び出しでキマるように設計すれば、同期処理はobj内に隠蔽できる
こちらのほうが良い
単に文字列取得するだけでlock、unlockが必要というのは狂気の沙汰
>>700のような特殊な場合を除いては、ね
[]
[ここ壊れてます]

771 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 15:42:12.58 ID:tjH2oYJX.net]
ってか

void func( char *output, int max_buffer)

なんてI/Fを書いちゃってることが問題なんじゃねーの?
これでなんとかしようって考えたって生産性ないし

772 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 16:16:50.47 ID:ZblQazo2.net]
cのIFだから古臭いのはしょうがない。

効率悪くなってもstd::string吐くようにラップして二度と触らないのが吉。



773 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 16:45:03.11 ID:+C5a7cGR.net]
void func( char *output, int max_buffer)
これ、ニワカが作ったダメな見本

普通
size_t func( char *output, size_t max_buffer)

774 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 17:01:45.51 ID:2Vwoh4uN.net]
ゴミが得意気に難癖つけてて笑える

775 名前:デフォルトの名無しさん [2016/09/12(月) 17:58:57.32 ID:KCLSxXC3.net]
同じ意味じゃんw

776 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 18:06:15.51 ID:5/ctHFsj.net]
マルチスレッドのリテラシーも無いのにクソみたいな長文をドヤ顔で貼り付ける>>758が哀れで仕方ない
2回のfnucの呼び出しの間にバッファーが変更される状況では単独の呼び出しすら破綻していることが理解できないらしい

777 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 18:13:03.76 ID:Brz5tLm8.net]
彼に限らず何らかの問題意識を訴える子が
なぜか突然マルチスレッドを絡めてくるのはもはや伝統芸
そして一通り話を聞いてみると
「そうだね、排他だね」としか言いようがないことも毎度

778 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 18:27:11.87 ID:x7GAwvaf.net]
std::string output = obj->func();
の場合、funcの中で排他処理をしていれば、呼び出し元は排他処理について気にしなくてよい
アトミックな操作ということになる
文字列の取得にかかわらず、アトミックが期待される処理は
分解せずに一つの関数で実現すべきである
personオブジェクトの取得なら、person = obj->get_person(); とすべきであり
person.set_name( obj->get_persion_name() );
person.set_age( obj->get_persion_age() );
のように分解してしまうとアトミックでなくなるから、やはりロックが必要になる
外からオブジェクトをロックする、そういうI/Fをobjに用意するということは
何時でも何処でも好き勝手にロックできるというわけで
使い方を誤るとデッドロックを引き起こす可能性がある
ロックの順番はクラス設計者が明確に管理し、隠蔽すべき

さて、文字列取得を二つの関数に分けて行うとアトミックな操作でなくなるから
呼び出し元で排他処理をしなければならなくなる
obj->lock();
size_t buffer_size = obj->func( nullptr, 0 );
std::vector<char> output( buffer_size );
obj->func( output.data(), output.size() );
obj->unlock();
これは非常に面倒なので君らは直ぐにでもstd::stringを返すラッパーを書く
そうすれば結局同じことになるので、初めからstd::stringを返せばよい
もとより文字列の取得はアトミックであることが期待されるわけだから
一回の関数呼び出しで行うのが筋である

779 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 18:43:38.31 ID:5/ctHFsj.net]
一生懸命考えた結果がコレか?
呼び出し側が自らコンカレントな使い方する前提でロック必須と言われてもねぇ
その内vectorのremove&eraseイディオムにも排他が必要で狂気の沙汰とか言い出しそうだな

780 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 18:44:31.77 ID:x7GAwvaf.net]
どれだけの処理を一つの関数で行うべきかは
どこまでの処理がアトミックと期待されるか、による
文字列の取得はアトミックであることが期待されるので
一つの関数でアトミックに実行すべき、となる
場合によればアトミックの範囲がもっと広がることもある
例えばpersonの情報が欲しいとき、名前と年齢を別々に取得するのはよくない
名前の取得と年齢の取得のそれぞれが独立して排他処理してあって正しく動いたとしても
全体として名前と年齢のペアが一致しなくなる可能性があるから
だからこの場合、personの情報は一つの関数呼び出しで行い、アトミックである必要がある

なので、一つの関数で実行すべきこと、アトミックに実行すべきこと、は
文字列の取得なんかよりは大きな範囲、粒度になることはある
大きくなることはあり得るということ

が、間違っても、文字列の取得などというプリミティブな処理を
バッファサイズの取得と文字の取得の二つに分割したほうが良い
とはならない

781 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 18:50:01.82 ID:x7GAwvaf.net]
>>767

>必ずしもそれが有効かどうかわからないから困る

と書いた通り、すべての場合とは言っていない
困る場合があるといっている
そして、困る場合での話である

782 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 19:40:26.75 ID:5/ctHFsj.net]
なるほどつまりは>>765だな
この論法は非constメンバー関数を使ったイディオムに広く使えそうだ

「〜って普通だろ?」
 ↓
「必ずしもそれが有効かどうかわからないから困る(長文略)」



783 名前:デフォルトの名無しさん [2016/09/12(月) 21:04:54.81 ID:U6Ajls88.net]
>>767
呼び出し側だけとは限らんでしょ。
非同期でデータメンバーを更新しつつ、更新通知をだすクラスとか

784 名前:デフォルトの名無しさん mailto:sage [2016/09/12(月) 22:29:31.42 ID:2Vwoh4uN.net]
一発でstringやらvectorで返すなら常識的に言ってロックは必要ないわな
何話してるのか分かってない奴が力んでるな






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

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

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