X



C++相談室 part144
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2019/07/22(月) 13:18:35.52ID:gptRHpgT
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

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

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

----- テンプレ ここまで -----
0002デフォルトの名無しさん
垢版 |
2019/07/22(月) 15:58:46.65ID:sp7+c3NQ
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

---- テンプレ ここまで ----
0003デフォルトの名無しさん
垢版 |
2019/07/22(月) 17:03:26.86ID:YPZZyU9O
すっぱい葡萄
ttps://ja.wikipedia.org/wiki/%E3%81%99%E3%81%A3%E3%81%B1%E3%81%84%E8%91%A1%E8%90%84
 自分のものにしたくてたまらないにもかかわらず、努力しても到底かなわない対象である場合、
 人はその対象を「価値の無いもの」「自分にふさわしくないもの」と見なそうとし、
 それをあきらめの理由として納得し、心の平安を得ようとするものである。
 フロイトの心理学では、これを防衛機制および合理化の例とする。また、社会心理学においては、認知的不協和の例とされる。
 英語には、この寓話を元に生まれた熟語として "sour grapes" があるが、これは「負け惜しみ」を意味する。
0006デフォルトの名無しさん
垢版 |
2019/07/23(火) 16:24:43.67ID:Rjd8/nXp
ループの中で剰余演算子が沢山出てくるとまぁよく知られてるように遅いわけだが、
(x += a) %= m;

x += a;
if(x >= m) x -= m;
としたら高速化された

だったら言語仕様として剰余演算子の定義をこう変えれば良いのに、なぜ遅いままなのですか?
0007デフォルトの名無しさん
垢版 |
2019/07/23(火) 16:32:47.77ID:tt/1GdHu
>>6
それじゃ変更前と同じ演算になってないだろ。x>=2mやx<0の可能性を排除しているから速いんじゃね。
0011デフォルトの名無しさん
垢版 |
2019/07/23(火) 18:24:59.51ID:u/gGnwtd
>>10
それ読んでもc++使う理由わからんよな
高速化が必要なコアのアルゴリズムにc++最新機能不要だろ
それより確率モデル使ってGPUで解くとかもっと賢くやれよと思うわ
0013デフォルトの名無しさん
垢版 |
2019/07/23(火) 21:35:57.63ID:04X8GIZv
自分が食っていくためには自分に仕事が必要であるため、
C++言語仕様周辺で食ってる人は永遠にコネクリ回したいはず。
0014デフォルトの名無しさん
垢版 |
2019/07/23(火) 21:41:03.53ID:Ffr5F2PG
最新規格に合わせた方が生産性高く保守も容易になる

それに、cudaだってc++17相当で書けるだろうに
0017デフォルトの名無しさん
垢版 |
2019/07/23(火) 22:06:42.46ID:Ffr5F2PG
普通にc++17は便利に使っているが?

てか使っている実例に対して、無意味断定する根拠が適当過ぎる
それこそコードで示せと

そんなに大きくない会社が金かけてまでやっているのだから、それで利益が出る効果はあるんだろう
0021デフォルトの名無しさん
垢版 |
2019/07/23(火) 22:36:46.59ID:u/gGnwtd
>>19
ごまかすなよw
お前が今保守してるコードについて聞いてる
c++のバージョンは?
行数は?
0022デフォルトの名無しさん
垢版 |
2019/07/23(火) 22:39:03.45ID:TGpHom7B
速度とC++を使用する意義について問題提起したのかと思いきや生産性の話になってる
0023デフォルトの名無しさん
垢版 |
2019/07/23(火) 22:51:25.14ID:LMG0h0kR
constexpr ifって言ってんのにC++のバージョン聞くってどういうこっちゃ
まさかC++20?
0024デフォルトの名無しさん
垢版 |
2019/07/23(火) 22:53:38.63ID:Ffr5F2PG
>>21
今のところc++17だな
17で0から書いたわけじゃないが、少なくとも有効にしないと通らん
行数はひとつじゃなくライブラリ沢山だから分からん
昔はlinuxメインでcudaとかも使って数値演算だったがここ数年はwindowsばかり
画像処理系、GUI、数値演算ライブラリその他装置制御とかのライブラリと組み合わせたアプリ作っている感じだな
0025デフォルトの名無しさん
垢版 |
2019/07/23(火) 22:58:50.26ID:Ffr5F2PG
画像処理だと要素型のテンプレートで基本操作をそれぞれ特殊化してintrinsicsで書いておいて、それを組み合わせて応用機能を実現している感じ
組み合わせで最適化可能な操作も基本操作に加えているけど
0026デフォルトの名無しさん
垢版 |
2019/07/23(火) 22:58:57.04ID:TGpHom7B
>>23
何言ってだお前
0031デフォルトの名無しさん
垢版 |
2019/07/23(火) 23:38:39.91ID:OTk37+kC
それ保守ってほど時間たってないんじゃね?
しかも他人のコードじゃないならなおさら
0032デフォルトの名無しさん
垢版 |
2019/07/23(火) 23:42:48.79ID:Ffr5F2PG
17にしてからは1年も経ってないかも知らんが、14,11の頃から数えれば数年前のソフトいじるとかは普通にある
弄るついでに最新規格でコンパイル通るようにしたり、使ってたライブラリ最新版に置き換えたりしてる
0034デフォルトの名無しさん
垢版 |
2019/07/23(火) 23:46:09.85ID:OTk37+kC
自分のちっさいライブラリでしょどうせ
他人の膨大なソースコードでそれできんのかと
仕事で保守したことないやつの戯言
0035デフォルトの名無しさん
垢版 |
2019/07/23(火) 23:50:18.68ID:+dwx5m0u
機能追加やリファクタも保守だぞ
変えないことが保守だと思ってんの?仕事で保守したことないやつの戯言
0036デフォルトの名無しさん
垢版 |
2019/07/23(火) 23:51:10.09ID:Ffr5F2PG
他人のなら、1ソース数10万行のが50ファイルとかあって、中身がコピペ改変のネスト構造になっているとか頭おかしいコードのデバッグとかすることもあるよ。
おんなじバグが100箇所くらいあったりするのw
0038デフォルトの名無しさん
垢版 |
2019/07/24(水) 07:38:12.78ID:xGXQ+cSs
>>36
そういうやつは触れない
そうじゃないやつはリファクタリング可能
統一して語る必要はない
0039デフォルトの名無しさん
垢版 |
2019/07/24(水) 15:35:36.80ID:51dv4//C
修正は保守に入るだろうけど、
機能追加はどうかな。保守ではないような気がするが。

別にどうでもよいけど
0040デフォルトの名無しさん
垢版 |
2019/07/24(水) 17:30:07.43ID:2ifmVNIE
新しいOSに対応しろ、ファイル形式に対応しろ、こういうAPI追加しろ、出力形式変えろ、速くしろ、軽くしろ
保守ってそういう要求に対応すること・対応できる体制を維持することだと思ってたんだが、そうじゃない宇宙もあるのかな
0041デフォルトの名無しさん
垢版 |
2019/07/24(水) 20:29:11.56ID:TdGR8UUG
ソフトの保守って受けたことねーや
納品したらそれまで
改修や機能追加は別料金
0042デフォルトの名無しさん
垢版 |
2019/07/24(水) 21:09:49.20ID:j4f+/jKb
> 改修や機能追加は別料金
オレが決められるなら当然そうするんだが
クソ脳無しの営業どもが
0043デフォルトの名無しさん
垢版 |
2019/07/24(水) 21:52:55.40ID:94R5D7K2
元来の意味は現状維持なんだから機能追加するものは保守とは言わんよなぁ
どうしても直さないといけないバグとか、開発環境変わったことによる対応とか、そういうのだけいやいややる感じ
0044デフォルトの名無しさん
垢版 |
2019/07/24(水) 22:50:28.58ID:2ifmVNIE
保守(maintenance)ってのはソフトウェアの利用価値を持続させることでしょ
そのために必要なら修正もするし機能追加もする
「保守だから現状維持、改修や追加なんてしないししてはいけない」なんてのは思考停止
0045デフォルトの名無しさん
垢版 |
2019/07/24(水) 23:04:23.71ID:u4NdgWgN
パッケージだと正式リリースした後のバージョンアップはすべてメンテナンス
0047デフォルトの名無しさん
垢版 |
2019/07/24(水) 23:31:07.37ID:8xr9hPJ6
思考停止っつーか実際問題そんな仕事ないだろ。
c++バカによくある妄想に付き合う必要はない。
0048デフォルトの名無しさん
垢版 |
2019/07/24(水) 23:38:01.87ID:TdGR8UUG
ある人にとっての「保守」は
趣味プログラマによるお仕事ごっこという文脈でのそれなのかな
0049デフォルトの名無しさん
垢版 |
2019/07/25(木) 00:16:11.89ID:f/JymLGM
ソースコード変えたらテストせねばならないがC++は単体テストの記法がイマイチ
Google Test一時期使ってたがテスト対象を呼び出すコードを書くまでのタイピング量がけっこう生じる
GoやRustはいいいぞ〜☆
0051デフォルトの名無しさん
垢版 |
2019/07/25(木) 02:39:40.09ID:f/JymLGM
苦労して自由を行使した末に得られる見返りのは
たいていはわずかばかりのパフォーマンス向上と
二度と見る気がしない気がする醜いソースコードやし、

保守wwwwwwwwww
0052デフォルトの名無しさん
垢版 |
2019/07/25(木) 06:25:29.69ID:GrqrASiv
const std::string & を std::string_viewに置き換えている記事をよく見かけます
後者を使うことに何か意味はありますか?
単に置き換え可能だと言うことを解説したかっただけなのでしょうか
0053デフォルトの名無しさん
垢版 |
2019/07/25(木) 06:43:57.53ID:jgZKUqYh
後者は部分文字列を切り出したいときにメモリ確保と文字列のコピーが発生しない
005654
垢版 |
2019/07/25(木) 09:25:28.09ID:fv/O10Ch
>>55
丁寧な解説を、ありがとうございます。
0057デフォルトの名無しさん
垢版 |
2019/07/25(木) 12:47:32.28ID:i0AuwjJi
streamで固定長の文字列分解したい
以下イメージ

istreamstring ss(“0123456789”);
string no1;
int no2;
char no3;
ss >> std::setw(4) >> no1;
ss >> std::setw(4) >> no2;
ss >> std::setw(2) >> no3;

結果
no1=0123
no2=4567
no3=89

みたいな感じで
環境はコンパイラc++03、boost使えず
std::string::substr使ったやつはもう作ってます
よろしくお願いします
0059デフォルトの名無しさん
垢版 |
2019/07/25(木) 14:10:42.84ID:HIqmru9O
>>58
項目ごとにstreamかまさないと、型で自動変換してくれないし、抜き取り開始位置指定しなくちゃいけないし、なんか冗長でカッコ悪し
みたいな理由です。
0060デフォルトの名無しさん
垢版 |
2019/07/25(木) 15:06:48.36ID:eq0G00ml
ABIの変更ってこれから先何度もあるんでしょうか?
stringとか基本のクラスが変わるのはきついんですが
0063デフォルトの名無しさん
垢版 |
2019/07/25(木) 17:11:22.15ID:DsBc3y+y
BeOSっていうOSが昔あって、純粋にC++でゼロから作られたOSなんだけど
コンパイラのバージョンアップだとかでABIが変わって
アプリの使うAPIの互換性が保たれてなかったんだよね
(後継のHAIKU OSも同じ問題抱えてる)
そこらへん標準で決めててくれればいいのにねぇ
0066デフォルトの名無しさん
垢版 |
2019/07/25(木) 23:57:42.04ID:n2Si4yAe
C++の委員会って規模やリソース的に多言語と比べてどうなんでしょう?
かなり恵まれているほうえすかね?
0070デフォルトの名無しさん
垢版 |
2019/07/26(金) 00:47:51.48ID:qhxgv2BF
そもそも1つの規格を元に複数のコンパイラが存在するって言語が少ないだろ
0071デフォルトの名無しさん
垢版 |
2019/07/26(金) 01:25:43.63ID:6ttC61YN
>>52
例えば文字列リテラルを与えた時にconst std::string &だと暗黙的に一時オブジェクトが構築され、バッファの確保と文字列のコピーが発生する。
std::string_viewを使うと、文字列の先頭アドレスと長さだけが渡されることになるので、効率の良いコードが生成される。
0077デフォルトの名無しさん
垢版 |
2019/07/26(金) 13:37:03.81ID:X7S0ZvoC
Fortran今も使われてるのか
研究室のコードが軒並みFortranでイヤイヤ使わされた記憶がよみがえった
C++だのなんだの色々流行ってるが研究者はそんなものに振り回されるな
Fortranは完成された言語なんだとボスが力説してたわ
0080デフォルトの名無しさん
垢版 |
2019/07/26(金) 14:48:21.28ID:pSMqg5vs
Pythonは「CPythonの実装が規格だ」だし
MATLABはそもそもプロプラで言語仕様や変更プロセス自体ブラックボックスだし
あんまり依存するのは危険だと思うんだけどな
アカデミックでは特に
0085デフォルトの名無しさん
垢版 |
2019/07/27(土) 01:32:43.02ID:KwccJBez
>>80
それでもpythonのリスト処理の仕様の方がc++のuniversal initializerなんかよりも
よっぽど仕様として安定してる。それが現実だ。
0086デフォルトの名無しさん
垢版 |
2019/07/27(土) 07:33:07.73ID:NQ4+UjHL
>>53
それは存じていたのですが、単にstringの参照を渡したいときにまで(const std ::string &)std::string_viewを使う意味はあるのかなぁ…?というのが疑問でした
上手く伝えられずすみません

>>71
非常に納得しました。そういう意図が有ったのですね
ありがとうございます
0088デフォルトの名無しさん
垢版 |
2019/07/27(土) 09:24:24.73ID:utI+NfFM
パイソン2と3が混在してるのがややこしい。
spirvのビルドスクリプトは2でしか動かない記述なのに勝手に3を探してきて動かそうとするとか混乱が甚だしい
0089デフォルトの名無しさん
垢版 |
2019/07/27(土) 11:41:57.01ID:zR8v2AWF
>>88
ちょっと話はそれるけど、外国製の言語処理で最近やたらとネットから勝手に
いろんなものをダウンロードしてくるものが増えて嫌だ。
0092デフォルトの名無しさん
垢版 |
2019/07/27(土) 13:57:22.46ID:zfEkdoko
別にオンライン前提でもいいんだけどエラー処理が糞なのが多くて、オフラインだと起動が超遅くなるとかそもそも起動しないとかあるのが
0096デフォルトの名無しさん
垢版 |
2019/07/27(土) 18:56:25.83ID:KwccJBez
アメリカ関係ないだろ。
エヴァンジェリストとか名乗る馬鹿が要らんものばっか押し付けてるだけで。
0098デフォルトの名無しさん
垢版 |
2019/07/28(日) 03:30:37.94ID:tecnuiEb
エヴァンジェリストっていう単語はじめてきいたときは
エヴァンゲリオンのファンの事かとオモテタ
0100デフォルトの名無しさん
垢版 |
2019/07/28(日) 06:12:59.88ID:mOcFR82C
広告宣伝しまくってプロパガンダのゴリ押しで本当に要らないものを買わせる奴らだろ
神からプログラミング言語までなんでもアリだ

ハロウィン文書なんかは異教徒抹殺のための冷静な分析でこれは宗教ヤってる目つきの物言いだ
キリスト教各宗派の合宗国のアメリカはそういうの強いよ
どこかのバカが州とか訳したけどね、真実を悟らせないようにする翻訳テクニックじゃねえの
つまりあいつらのやってることは邪悪だから気をつけろ、ってことだ
0102デフォルトの名無しさん
垢版 |
2019/07/28(日) 09:44:05.47ID:5UHV96py
C++がいかに委員会制を敷いて仕様をがっちり固めているといっても
元になっているC言語がUnix記述のためにデニスリッチーがほぼ一人で考えたドメイン固有言語みたいなものなので
後方互換性というものを重視すればするほど後発言語に対してハンデ戦になってしまうのは仕方が無い
Rustを見たらC++のconstや参照がいかに危険で不用意なブツになってしまっているかがワカル

・こんな人はRustを使うべき(中略

・今すぐRustを使うべき10の理由(ry
0103デフォルトの名無しさん
垢版 |
2019/07/28(日) 09:53:00.46ID:5UHV96py
ていうかUnixの記述自体が文書整形をやりたいから(後にroffとして結実)という
システム記述ではなくてアプリ実現要求に端を発しているから、
やっぱ全体を俯瞰するとろくでもない流れの末に生まれたC++は不幸な出自と言えるかもしれん…
0105デフォルトの名無しさん
垢版 |
2019/07/28(日) 10:57:33.68ID:c9+bQbdr
2の補数以外を捨てたのと、評価順序を規定したあたりでCとは決別したと思ってる
これ生粋のCerは絶対受け入れられないでしょ
0106デフォルトの名無しさん
垢版 |
2019/07/28(日) 10:58:21.15ID:/T7nmvYx
>>89
ウチは羹に懲りて膾吹いてるので許可したサイトにしかつながらない
パイパイすらつながらない
0109デフォルトの名無しさん
垢版 |
2019/07/28(日) 13:18:40.37ID:c9+bQbdr
1の補数や符号ビットだと0のエイリアス(+0と-0)が出来てハッシュの要件満たさなくてめんどくせえし、
もう2の補数ばっかりなんだから2の補数に限定しようぜーってなってC++20から整数型は2の補数限定になる
例によってIBMはキレてる
0110デフォルトの名無しさん
垢版 |
2019/07/28(日) 13:25:39.79ID:N2Io9ZPD
あと宇宙船演算子の戻り値型が符号付整数だけstrong_orderingじゃなくなったりとよろしくない
0117デフォルトの名無しさん
垢版 |
2019/07/30(火) 08:36:20.97ID:mDNZ+mDk
ほえー宇宙船演算子なんてできるのか…
勉強になったわ
しかしおふざけネーミングなの珍しいな。総合比較演算子とかならなかったのか
0121デフォルトの名無しさん
垢版 |
2019/07/30(火) 14:58:53.30ID:q4AvHDZp
宇宙船演算子なんてなんかのタイポだろうと思って読み飛ばしていたけどマジな用語だったのか、勉強になったわ…
FORTRANの算術IF文みたいに宇宙船if文とか作ってくれればいいのに
space_ship_if(x)
equal { … }
plus { … }
minus { … }
0124デフォルトの名無しさん
垢版 |
2019/07/30(火) 19:15:29.41ID:YQWzaJvj
Opencvで空の画像に点を1000個程度書きたいです
X座標Y座標が既知の場合に最速で点を1000個描画するにはどうしたらいいんですかね?
0125デフォルトの名無しさん
垢版 |
2019/07/30(火) 20:14:10.30ID:q4AvHDZp
>>123
> xは何と比較してるん?
0 と比較してるつもり
space_ship_if(x, y)
== { … }
< { … }
> { … }
の方がわかり易いかな
0126デフォルトの名無しさん
垢版 |
2019/07/31(水) 14:05:31.56ID:/qk9IG8W
gitに公開されているcpp環境を使おうとしたところ、サンプルコードのcppファイルのコンパイル時に
「undefined reference to 〜」
と出てコンパイルできませんでした。
何が原因かわかりますでしょうか?
操作した手順は以下になります。

#-------------
# 1. インストール
#-------------
git clone http://github.com/HomerReid/libGDSII
cd libGDSII
mkdir m4
sh autogen.sh --prefix=/home/user/install/libGDSII
make install

2. につづく
0127デフォルトの名無しさん
垢版 |
2019/07/31(水) 14:08:46.05ID:/qk9IG8W
#-------------
# 2. 下記URLにあるSample codeを元にファイル作成
# ->https://github.com/HomerReid/libGDSII
#-------------
--- xxx.cppファイルで保存 ---
#include "libGDSII.h"
using namespace std;
using namespace libGDSII;
int main(int argc, char *argv[]) {
/********************************************************************/
GDSIIData *gdsIIData = new GDSIIData( string("GSiP_4_RingFilter.gds") );

if (gdsIIData->ErrMsg)
{ printf("error: %s (aborting)\n",gdsIIData->ErrMsg->c_str());
exit(1);
}
/***************************************************************/
gdsIIData->WriteDescription(); // writes to console
gdsIIData->WriteDescription("MyOutputFile");

/***************************************************************/
PolygonList Layer3Polygons = gdsIIData->GetPolygons(3);
printf("Found %lu polygons on layer 3: \n",Layer3Polygons.size());
for(size_t np=0; np<Layer3Polygons.size(); np++)
{ printf("Polygon #%lu has vertices: ",np);
for(unsigned int nv=0; nv<Layer3Polygons[np].size()/2; nv++)
printf(" {%e,%e} ",Layer3Polygons[np][2*nv+0],Layer3Polygons[2*nv+1]);
printf("\n");
}
return 0;
}
3. につづく
0128デフォルトの名無しさん
垢版 |
2019/07/31(水) 14:09:39.80ID:/qk9IG8W
#-------------
# 3. コンパイル
#-------------
gcc -I/home/user/install/libGDSII/include -o xxx xxx.cpp
/tmp/ccwjjcp2.o: In function `main':
xxx.cpp:(.text+0x54): undefined reference to `libGDSII::GDSIIData::GDSIIData(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
xxx.cpp:(.text+0xb8): undefined reference to `libGDSII::GDSIIData::WriteDescription(char const*)'
xxx.cpp:(.text+0xc9): undefined reference to `libGDSII::GDSIIData::WriteDescription(char const*)'
xxx.cpp:(.text+0xe4): undefined reference to `libGDSII::GDSIIData::GetPolygons(int)'

↑ここで落ちる
0132デフォルトの名無しさん
垢版 |
2019/07/31(水) 16:18:44.92ID:/qk9IG8W
ググりましたが難しかったです。
make install時に*.aなどのlibパスを入れるとか、コンパイル時にlibパスを入れるとかありましたがうまくいかず。。
作者がいるので問い合わせればよいですね。
まずは問い合わせてみます。
ありがとうございました。
0134デフォルトの名無しさん
垢版 |
2019/07/31(水) 18:10:51.91ID:qr1YW5nx
ggrksファッキューって言われたら戻って来てね
優しいお兄ちゃん達が解決してくれるよ
0135デフォルトの名無しさん
垢版 |
2019/07/31(水) 18:38:26.40ID:3lzQcoQt
あれーmake installする前にmakeやるんじゃなかったっけ。ライブラリがそもそも生成されてないんじゃないの

それとライブラリのパス入れるときは-Lか-lだけどもしかして-Iでやってたりしない?
0139デフォルトの名無しさん
垢版 |
2019/07/31(水) 22:08:20.49ID:MO/qze1m
>>138
usingを使えば。std:: と打ち込む手間が減って便利になるメリットが
ある。逆にデメリットは何か聞いてみたい?
0142デフォルトの名無しさん
垢版 |
2019/07/31(水) 22:53:59.23ID:P7Lm1qLK
実際問題、std は standard template library の 「standard(標準)」な
訳だから、using 使っても、他の何らかの(ライブラリなど)の名前と
衝突する可能性は低いですよね。汚染と言っても現実に衝突する可能性
は低い。もしstd::が必須なのであれば、Stdという接頭辞を最初から
付けていればよかったはずであって、敢えて std:: という 5文字分を
タイプする必要は無かったはず。

仮に何かと衝突するというなら設計の不味さを感じますね。
0144デフォルトの名無しさん
垢版 |
2019/07/31(水) 23:05:09.42ID:jjf+PlTq
>>142
衝突する可能性は低いという前提が抑間違い。
お前さんは広範な標準ライブラリのすべてを熟知してstd名前空間で定義された名前とはぶつからない命名が常にできる自信はあるのかい?
今現在問題なかったとして、後に標準ライブラリが拡張されて、自分でつけた名前にぶつからない保証は?
そんな諸々の厄介ごとを回避するために名前空間はあるのだから、自分しか使わないソースで誰にも迷惑かけないなら好きにすればいいよ。
0147デフォルトの名無しさん
垢版 |
2019/07/31(水) 23:26:41.52ID:pv+GZng6
仮に線形代数のベクトルクラスとか作ったらいきなり衝突するんだがな
他にも衝突しそうな名前なんか腐る程ある
何のための名前空間だと思ってんのかと小一時間

どうせ標準ライブラリしか使ったことが無いようなド素人なんだろ
0149デフォルトの名無しさん
垢版 |
2019/08/01(木) 00:01:43.50ID:x8K/VZkX
>>128
libzzz.a または libzzz.so とリンクするには gcc のオプションに -L 該当ファイルのパス -l zzz が必要。

て事も知らないなら入門書からやり直しが必要な初歩レベル
0150デフォルトの名無しさん
垢版 |
2019/08/01(木) 00:11:28.53ID:jAJZsaMK
using namespaceが悪なのはヘッダのグローバル空間でかますのが絶対悪ってだけで
それ以外では大概どうでもいい話
0151デフォルトの名無しさん
垢版 |
2019/08/01(木) 01:27:47.64ID:EAAzAfmw
>>142
競合するかどうかは問題の本質ではない。
using stdをつけてstd::を省略したコードは、using stdをつけていない他の環境に持っていったときに動かない。
std::をつけていれば、どんなusingが使われていようと関係なく動作する。
using stdを使うべきではない理由はこれだけで十分。
せっかく標準規格化されてどの環境でも同じように動作するライブラリのポータビリティを阻害するのは長い目で見ればデメリットしかないと思う。
0152デフォルトの名無しさん
垢版 |
2019/08/01(木) 02:08:20.24ID:YZxnvLL/
プロのプログラマでもないしstdやboost使う程度なんで名前空間汚染問題とか大げさにしか思えない
大したコードでもないのにstd::つけまくってるコード見るとアホらしくなる
職業や用途あるいは個々人の技量によって求められるものは違うでしょうに、十把一絡げに議論して意味あるの?
0153デフォルトの名無しさん
垢版 |
2019/08/01(木) 02:19:13.29ID:AVudDz+c
>>152
元の質問者が何も分かってないから突っ込まれているだけで、問題点とか自分以外の人がどう認識しているかを知った上で、使う使わないって判断は好きにすればいいだろうよ。
0155デフォルトの名無しさん
垢版 |
2019/08/01(木) 02:21:00.23ID:EAAzAfmw
>>152
オレオレコードを一人で書いて満足するのが好きなら、別に止めはしない。
でもそんな主張をここでされても多分同意は得られないと思うよw
議論する気があるなら、みんなが分かるコードを書かないとだめでしょ。
0156デフォルトの名無しさん
垢版 |
2019/08/01(木) 02:21:21.39ID:xENMcR2S
>>152
>>142を読み直せ
言わずに我慢してたけど、
てか今まで何度も言ってきたが最近C++数年かそれ以下の初心者が偉そうにしすぎ
初心者だからと貶したいんじゃない、自分が知らないことや先人(俺のことじゃないよ、念の為)への畏怖や敬意が全く無いから
>>142の最後の行みたいな思い上がったセリフが出てくる

そういうやつが今後上達するかというと俺は首ひねるけどね
0158デフォルトの名無しさん
垢版 |
2019/08/01(木) 03:13:40.26ID:xENMcR2S
それが都合がいいなら好きにすればいいんだよ
誰もstd名前空間は取り込んじゃいけないとは言ってない

そんなのは個々の設計の意思決定と責任の話で、std取り込む奴がアホとか取り込まないのがアホとかいう話じゃない
0159デフォルトの名無しさん
垢版 |
2019/08/01(木) 05:07:42.89ID:z8lvaa68
ヘッダにusing namespace書くやつは許さんけど、実装部分では好きにさせてやれよ
0160デフォルトの名無しさん
垢版 |
2019/08/01(木) 07:34:07.43ID:RgaAx32e
>>151
「他の環境に持っていったときに動かない」って、どういうこと?
ソース丸ごと持っていくなら、ソースにusing namespace std;が含まれるから動くでしょ。
もしかして、ソースの一部だけコピペして持っていく場合の話?
「コピペでも動くソースにしなければならない」という主張はちょっとどうかとおもうけど。
0163デフォルトの名無しさん
垢版 |
2019/08/01(木) 08:05:18.75ID:xENMcR2S
>>160
標準以外のライブラリの存在が全く想定できてない
自前のちょっとしたライブラリのヘッダでもusing namespace stdって書いてたら
その後or中でインクルードしたヘッダ類が全部巻き込まれて名前の衝突が起きうる
ソースでusingした後にインクルードした場合も同じ(これはあんま無いと思うけど

仮にライブラリとしてファイルが綺麗に別けられてても別のプロジェクトに移して動かない場合があるってのはこれのことでしょ
0166デフォルトの名無しさん
垢版 |
2019/08/01(木) 08:30:48.58ID:EAAzAfmw
ヘッダーにインラインで書くときはstd::つけて、ソースには個別にusingしてstd::を省略するってこと?
そんな面倒なことしてなにか良いことあるの?
0167デフォルトの名無しさん
垢版 |
2019/08/01(木) 08:41:54.03ID:xENMcR2S
あーすまん、ヘッダには一切書かないのならわかる

ただ、標準と別のライブラリで衝突する名前があるならどちらかはusingしない、あるいは衝突するものはいちいち指定するかしなきゃいかんでしょ
0168デフォルトの名無しさん
垢版 |
2019/08/01(木) 08:48:03.19ID:xENMcR2S
>>166
衝突しないことがわかってるならいいけど、ライブラリのヘッダでusingしてたら
そのライブラリのユーザーは衝突する名前をグローバルで書けないんだよ
自分しか使わないのなら好きにすれ
0169デフォルトの名無しさん
垢版 |
2019/08/01(木) 09:12:15.95ID:+lGsNRBr
させたくないならそれが出来ないようにルールそのものが無いはずだ
でもルールがあるなら使っていいでしょう
それが出来るようにそのルールがあるんだから

それともルールはあるが使ってはいけないという宗教なの?
0172デフォルトの名無しさん
垢版 |
2019/08/01(木) 09:44:39.86ID:lFlDu5J/
>>169
どうして0か1でしか考えられないんだ?
使うことでメリットがあり問題ないなら使えばいい。
問題あるなら使うな。
メリットデメリットがあるならトレードオフで判断しろ。
0173デフォルトの名無しさん
垢版 |
2019/08/01(木) 09:53:26.68ID:cScMcWqS
おれの職場ではコード規約でusing stdはもちろんその他の名前空間も省略禁止
ファイルローカルでaliasは可能というか推奨
基本的にコードは後で誰でもすぐ読めるように書く方針だからね
仕事で使うときはこんなもんだよ

似たようなの話でauto多用が読みやすいか読みにくいかは結構議論になる
こっちはまだ規約化されてないな
0179デフォルトの名無しさん
垢版 |
2019/08/01(木) 19:18:28.91ID:Ag3GiCEL
>>156
流れ読んでないし本題には触れずにレスするけど同意
「ニワカなやつほど語りたがる」のは世の常だけど
C++ちょっと触っただけくらいの駆け出しのカスが
「C++は〜」なんて知った風に語ってるのたまにあるよなw
それも、スレに参加してるなかでお前一番素人やろってやつが
平然と調子こいてきたりするから驚く
0180デフォルトの名無しさん
垢版 |
2019/08/01(木) 22:39:23.89ID:re8BbLkf
すまないC++20の新機能諳じて言えない奴は例外なく初心者なので出ていってくれないか
0183デフォルトの名無しさん
垢版 |
2019/08/01(木) 22:56:22.56ID:8zpMvWHA
パディングの有無ならstd::has_unique_object_representationsでわかると思う
どこにいくつあるかは難しい・・・
0184デフォルトの名無しさん
垢版 |
2019/08/01(木) 23:14:16.19ID:Phw6FYmd
>>177
うわああああああ!!!これだ!これだやりたかったの!サンクス!
そうか0を対象の構造体へcastした後メンバアクセスしてそのアドレス値を取るのか!全然思い付かんかった!
俺に向けたレスかは分からんけど助かった!サンクス!

>>181
それ思い付いたんだけど苦行過ぎてやめてもうた…

>>182
あーalignofで上手く取るってのも有ったのか!使う機会があまり無いポンコツなもので気付かんかった!

>>183
うむむ?初耳機能だ
後で調べてみまする

皆さんありがとうございました!
0186デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:03:55.33ID:zOtmkI/7
>>151
using を絶対に全く使わないのであれば、そもそも namespace の概念自体が
意味が無いと思いますよ。タイプ量を減らすことはとても大切だからこそ、
衝突しない場合には、using を使えるように設計してされているわけですから。
もし絶対に std:: を付けるのであれば、例えば、std::vector と書かずに
最初から StdVector などと固定の名前でも良かったわけです。しかし
それだと長くなってコーディング効率が下がるので、可能ならば
std:: を省略して vector と書けるように設計されているわけです。
それこそが namespace の思想なのでしょう。
0187デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:09:48.23ID:zOtmkI/7
>>173
usingを使わない方針は気持ちは分かります。しかし、usingを使い辛くなって
しまうのは想像力を働かせればSTLやC++の言語使用設計の段階から
最初から分かっていたはずで、そもそもSTLが最初からstd という
namespace に入れて有ること自体が余りセンスが無かった可能性があると
自分は思ってます。
0188デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:16:04.07ID:zOtmkI/7
1. std::string
2. StdString
3. CString

最も効率がいいのは、3 の CString でその意味では CString の設計者は
センスが良かったと私は思っています。using を使って std:: を書かないように
した場合、確かに何かのライブラリと衝突の危険性が出てきます。
ならば、標準のライブラリ(STL)は、デフォルトでは namespace の中に入れる
べきではなかったのではないかとも思います。
namespaceは、たまたま衝突が起きた場合には、その時点で使うと助かる場合が
あると思いますが、最初から入れてしまった事で新たな問題が入ってしまった
可能性があります。
0189デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:35:42.08ID:TGlmBsBg
>>186
namespaceってその名の通り名前空間を分割することで識別子名の競合を避けて、命名の自由度を上げる(楽をする)ための機能でしょ。
ある程度大きな規模のプロジェクトでは大変重宝するものだと思うんだけど、なんかものすごく偏った理解のしかたしてない?
0190デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:46:27.31ID:TGlmBsBg
>>188
CStringとタイプするには、shiftを押したり離したりしないといけないし、手間としてはstd::とそれほどかわらないと思うんだけどw
0191デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:49:52.24ID:zOtmkI/7
>>190
Shiftキーは同時押し可能なので速度が全然違う。
CStringの場合、実質Cの1文字が増える程度で済むが、
std::stringは確実に5文字分増える。
0192デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:51:05.19ID:zOtmkI/7
>>189
環境の変化での不安定さを避けるためにstd::を付けざるを得ないなら
命名の自由度は全く上がってません。
0193デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:54:02.02ID:TGlmBsBg
>>191
いやいや、実際はshiftを若干早くおしとかないと、cStringになっちゃったりするだろw
離す時も気をつけないとCSTringになっちゃったりするし。
それに最近のエディタ(統合開発環境)には補完機能が付いてるから、std::で候補が絞られる分、選択に有利に働く。
0194デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:54:16.42ID:1bW2v8eW
>>186
外から使うことだけしか考えてないみたいだけど、名前空間内の実装を読み書きしやすくする効果もあるでしょ。
0195デフォルトの名無しさん
垢版 |
2019/08/02(金) 02:55:50.33ID:TGlmBsBg
>>192
命名の自由度があがるのはnamespaceの中での話だよ。
namespaceで囲っておけば、変数にhogeとか適当な名前をつけても競合する心配がなくなる。
0196デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:01:42.94ID:zOtmkI/7
>>195
namespace std で囲まれている事で気が緩んで hoge みたいな短い名前付けて
しまうことで、std:: を外すことが不可能になってしまう恐れが有る。
結局なんのための名前空間なのか分からなくなってしまうという。
外せない名前空間なら、std_ でも Std でも Stl を付けた方がタイプ量が
少なく済んだのに。
0198デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:07:18.69ID:zOtmkI/7
>>195
大丈夫だと思って i という一文字のグローバル変数を定義したとしよう。
すると、std::i としている場合には問題ないが、using namespace std;
とした場合、大変な現象が起きる。伝統的な for のループ変数と衝突
するから。
0201デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:10:27.53ID:tRQdKQsJ
別に外さなくとも、その名前空間内で書くときは省略できるんで楽なんだけどな
(ライブラリ書いてるときとか
0202デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:10:40.06ID:zOtmkI/7
>>193
それに、コロン(:)はキーが打ちにくい場所にある上に、同じキーを
二回連打しなくてはならない。これが時間がかかる。
0204デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:14:20.48ID:Baufd8HM
この世の名前空間はstdしかないと思ってるのかな?
mylib::vectorとかyourlib::vectorとかを安心して作れるようにするための機能が名前空間だぞ
0205デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:15:42.09ID:zOtmkI/7
>>201
もしかしてアプリなどでは使わないのにライブラリを作ることだけで
満足している人たちが多いのでしょうか。

なるほど、それで stl や boost が究極にセンスの悪い代物になっているのかも
知れない。コンテナ類は、C/C++のリストの概念が全く理解できて無い人
が作ったとしか思えない。リストは構造がリストであればリスト足りえると
思っているのが頭が悪い。ポインタでアクセスできないリストはリストじゃない。
O(1)で済むところがO(N)になってしまっていて、stlは全くセンスの
悪い欠陥ライブラリ。
0206デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:17:07.37ID:zOtmkI/7
>>204
だったら MylibVector で十分。そのほうが短い。
接頭辞を変えたければ、grep置換すればいいだけ。wz grepで一発。
それともstlの設計者はgrep置換使ったことが無いんだろうか。
とても頭が悪い感じがする。
0207デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:37:49.81ID:Baufd8HM
最初にusing mylib::vector;って書いとけば以後は単にvectorと書いたらmylib::vectorの意味になるんだよ
vectorを100回使うならその方が短いだろ?
後でyourlibやmylib_ver2のvectorを使いたくなればgrep(笑)なんかしなくても最初のusing宣言を一箇所書き換えるだけでいい
名前空間ってのはそういう機能で、ただの接頭辞じゃねえんだよわかったか知恵遅れ
0208デフォルトの名無しさん
垢版 |
2019/08/02(金) 03:53:52.52ID:tRQdKQsJ
>>205
使うから書いてる、というか今後何度もソフト作るのに必要だから書いてるんだが
まぁあんたの言うような変な奴も居るだろうけどな

なんか大事な基本すっとばし過ぎで相手する気力も失せた
0209デフォルトの名無しさん
垢版 |
2019/08/02(金) 04:05:35.16ID:HNnVO++M
>>186
タイプ量を減らすなんてのは開発において些末なことだろ。通常は開発時間の多くは設計、思考に費やして、コードをタイプする時間の比率なんて誤差程度のものだよ。
お前さんのプログラミングではほんの数文字のタイプがそれほど重みがあるのか?もしかして頭使わずに写経だけしてるのか?
0210デフォルトの名無しさん
垢版 |
2019/08/02(金) 04:13:12.69ID:HNnVO++M
>>200
どうして外すか外さないかの二択しかないのか?
外すことでメリットがある使い方をするときは外せばいいよ。
外すための方法がいくつかあるのは分かるか?その書き方の違いや、それを使う場面や文脈で良し悪しが変わるというのは理解できるか?

お前さんは名前空間に関する仕様の理解と現実の開発作業の経験が少ないのにその自覚がなく、自分の考えに凝り固まってるから議論が進まない。
0211デフォルトの名無しさん
垢版 |
2019/08/02(金) 04:26:28.62ID:HNnVO++M
>>206
自分のコードを再利用しやすくするためにライブラリ化する。その歳に名前の衝突を容易に回避できるよう名前空間を使用する。
名前がぶつかるからって安易にコピペして置換するなんて愚の骨頂だろう。
そんなやり方を良しとするというのは、規模が小さく保守の必要もない使い捨てのような小さなプログラムしか作ったことがないのだろうか。
0213デフォルトの名無しさん
垢版 |
2019/08/02(金) 06:16:59.13ID:DB/RmtTt
長文なのに書いてある事はスカスカだな
腐ってもプログラマーの端くれなら言いたい事は短く簡潔に書いてくれ
0217デフォルトの名無しさん
垢版 |
2019/08/02(金) 07:27:30.51ID:uj4cDNt2
だいたい標準ライブラリがvectorとあstringみたいなきわめて衝突しやすい名前を使っているのが悪い
諸悪の根源すぎて死ぬ
std_vectorとかstd_stringとか衝突しにくい名前にすれば済んだ話
しかしそれだと標準ライブラリ内部のコードがダサくなって逝けてないから、という理由で導入されたのがstd名前空間。
所詮センスの問題なためにいつまでたっても議論が収束しない

ここはRustのパッケージのようにパッケージが公開/非公開の唯一の境界、みたいに割り切って
名前空間の設定に論理的必然を持たせたらよかったんじゃ…
0218デフォルトの名無しさん
垢版 |
2019/08/02(金) 07:35:54.09ID:uj4cDNt2
だいたいfoo::some_symbolと書いたときfooがクラスのときご名前空間のときがあって、
それぞれやれることが微妙に違いもあるがだいたいオーバーラップしているとか嫌すぐる…
疑問に思わないのはC++に脳が汚染されている証拠

後方互換性命で変えるな派と後方互換性を失っても改良すべき派の合意が見られない事案については
前者が勝って後者は追加で我慢するというWIN-win決着で永遠に先送りされつつ混迷だけが深まっていくのがC++の宿命
0220デフォルトの名無しさん
垢版 |
2019/08/02(金) 07:42:20.24ID:uj4cDNt2
なにおうnamespaceがイミフな言語機能であることぐらいはよくわかっとるわ!
標準ライブラリ内部のコードにおいてもほとんどがテンプレートであるために、
using std;することが許されない

つまり、std_vectorやstd_stringという風に名前を長くするのに対してなんのメリットも提供されていない
0222デフォルトの名無しさん
垢版 |
2019/08/02(金) 08:15:18.88ID:WBAmTSV/
関数名_ローカル名 ってすれば全部グローバル変数でいいだろっていう主張?
0224デフォルトの名無しさん
垢版 |
2019/08/02(金) 09:13:54.00ID:9zV6XrP/
なんでこういう馬鹿が定期的に沸くんだ
ちょっと調べればなぜこんな機能が必要とされたか位わかるだろ
名前空間の問題なんてC++固有の問題じゃないのに
0227デフォルトの名無しさん
垢版 |
2019/08/02(金) 16:35:01.23ID:aGnTdwVX
インスタンス生成時に絶対に決めなきゃいけない定数をテンプレートパラメータにするかコンストラクタに渡すか迷ってる

両者にはどういう思想の違いがありますか?
0228デフォルトの名無しさん
垢版 |
2019/08/02(金) 16:54:49.60ID:Bzyz7IRB
なんかLinus TorvaldsがC++ディスってる記事でnamespace絡みで
「Cならmy_foo()って名前にするね、やっほー、grep my_fooが機能するぜ!」
みたいな話があったような気がするんだけど検索しても見つからない(´・ω・`)
0231デフォルトの名無しさん
垢版 |
2019/08/02(金) 18:19:12.53ID:zOtmkI/7
>>218
aaa::bbb::ccc::ddd みたいな名前が大量に必要になったりして、
STLの設計者は設計が下手だと思う。
0235デフォルトの名無しさん
垢版 |
2019/08/02(金) 18:51:13.74ID:OZv2fXQJ
今std::chronoとかstd::filesystemとか標準の名前空間も細分化するようにしてきてるからusing namespace std;の影響もそこまで酷くならないかもしれない
0236デフォルトの名無しさん
垢版 |
2019/08/02(金) 18:52:43.15ID:4a7qvAUu
stdの中に全部ぶちこんであるのが問題

std::header名の名前空間に入れて、std内でusing namespace header名していればいいのに

std::xxxでも使えるし、using namespace std::header名すればそのheaderの中身だけが省略して使える
0237デフォルトの名無しさん
垢版 |
2019/08/02(金) 18:56:02.63ID:zOtmkI/7
>>232
なんでも初期状態で使いやすいことが重要。
使いやすくするには各自でやれというのは設計が下手な証拠。
0238デフォルトの名無しさん
垢版 |
2019/08/02(金) 18:59:20.11ID:zOtmkI/7
匿名性掲示板が困るのは、何かの欠点を指摘するとそれを作った当事者らしき人が
全否定をしてしまうことで話が深まらないこと。
同意する人がいればもっと良いライブラリを探す話とかに発展できる
かも知れないのに。
0239デフォルトの名無しさん
垢版 |
2019/08/02(金) 19:00:52.12ID:4a7qvAUu
ABI互換が問題ならextern "C"みたいに
extern ::std
みたいなので、マングリング時の名前空間を強制できる機能つければなんとかならんかね
0240デフォルトの名無しさん
垢版 |
2019/08/02(金) 19:05:43.92ID:TY1gde0p
>>237
お前の「使いやすい」と世間一般の「使いやすい」が一致してないというだけだろう。
お前の「こうあるべき」と世間一般の「こうあるべき」のズレが大きいから、今のC++はお前にとって不満の大きいものになっているんだろう。もしかすると家庭や学校、社会全体も。
0241デフォルトの名無しさん
垢版 |
2019/08/02(金) 19:09:51.86ID:zOtmkI/7
>>240
そういう話がやっぱり、「ポジショントーク」だと思うんだよ。
そこまでして人の意見を全否定するには何らかの背景事情があると
しか思えない。
0242デフォルトの名無しさん
垢版 |
2019/08/02(金) 19:10:14.38ID:TY1gde0p
>>238
C++の仕様策定に関与したような人がこんなスレを覗いて低レベルな指摘にわざわざ反応するわけないだろう。想像力が豊かだな。
0245デフォルトの名無しさん
垢版 |
2019/08/02(金) 19:15:19.48ID:zOtmkI/7
暗に陽にアメリカを褒めちぎって日本をけなすような人が5chには多い。
それで日本はめちゃくちゃに成ったんじゃなかろうか。
例えば「日本製スマホが全然駄目」などという説が5chでは大量に流布
されている。実際、そういう情報を信じて損する人は多かろう。
大問題だ。
0248デフォルトの名無しさん
垢版 |
2019/08/02(金) 23:12:48.91ID:zqhkSChf
誰も書かなかったので仕方無いので漏れが書くが、namespaceの唯一の便利な使い方は(「唯一の」だ
、すでに衝突したあるいは衝突不可避なソースコードAとソースコードAを
namespace a { A }
namespace b { B }
と囲う等して分離できる ( こともある ) というだけやんけ
それとて完全には果たせないというあたりがいかにも行き当たりばったりで中途半端な言語要素感を醸し出してゐる
(中で::fooで呼んでたり入れ子のnamespaceを外から呼んでたりのケースは救われない
0249デフォルトの名無しさん
垢版 |
2019/08/02(金) 23:17:29.32ID:4a7qvAUu
てかnamespaceは色々中途半端な点はあるが、便利に使える機能だろ
無いと物凄く不便
using namespace stdは使わんな
0251デフォルトの名無しさん
垢版 |
2019/08/02(金) 23:37:02.96ID:DB/RmtTt
関数呼び出し時に宣言が必要か否かってCとC++では異なってたりしますか?
規格書読めないマンで申し訳ないのですがgccだとC/C++でそれぞれOK/NGと結果が異なります
0253デフォルトの名無しさん
垢版 |
2019/08/03(土) 02:27:32.85ID:m/VIbHu2
>>222は、FSMとPDAの区別もつかない
くるくる

((ヽ三/)   (ヽ三/))
  (((」) ___ (L)))
 / // ノヽ\\ \
( </ (● ●)\> )
 \| ⌒(_人_)⌒|/
   \   ̄  /

パーだおwwwwww

  n「「「|   「「「h
  |ー ⊃  ⊂ ー|
  >ーノ___ヽー<
 / // ノヽ\\ \
( < o゚(● ●)゚o> )
 \| ⌒(_人_)⌒|/
   \  |┬| /
     ヽノ
0254デフォルトの名無しさん
垢版 |
2019/08/03(土) 07:47:52.71ID:NzOgSHrF
お前らが名前空間で議論したところで何のメリットもデメリットもない事に気づけ、そしてRustを使え
ゴミ言語
0257デフォルトの名無しさん
垢版 |
2019/08/03(土) 10:47:51.13ID:m/VIbHu2
Ristがチューリング完全かどうかについては誰もが口を濁すが
それはそうとして、これからはRustでプロトタイピングしてC++のコードを上司には提出するという
スタイルに移行するのではないかと思う
0260デフォルトの名無しさん
垢版 |
2019/08/03(土) 12:51:32.63ID:oHrDPFKS
名前空間つかうようりは、意味変数を使った方がよい
0263sage
垢版 |
2019/08/03(土) 15:26:08.69ID:dTS2sKLx
>>261
unsafeを使わない場合の話
0265デフォルトの名無しさん
垢版 |
2019/08/03(土) 15:51:00.92ID:bjverAuH
namespaceそんなに不便かのう。
他の言語もやたらとパス掘って面倒なことになってるが。
pythonでも
import matplotlib.pyplot as plt
みたなのあるしな。
C++でやるなら
namespace plt = matplotlib::pyplot
とできるわけで、他の言語とにたりよったり
0266デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:06:05.71ID:dTS2sKLx
>>264
using namespaceによって名前のバッティングのリスクはむしろ増す
なぜなら、namespaceの中身を記述する中の人がnamespaceで守られているつもりで短い名前を使いまくることがあるからじゃ
つまりnamespaceの中の人の思惑に反してusing namespaceしたとき、
namespaceは本来の言語要素としての目的とは真逆の危険なブツ(衝突の加速器)に早変わりする。

ファイルスコープでusing namespaceして書いたコードは他にもっていったとき地獄が始まる

ていうか同じものに複数の表記を許すのはそもそも美しくない

以上の理由によりusing namespaceは(特にファイルスコープでは)使ってはならない
C++から削除したほうが良い
0267デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:11:48.01ID:ve9YLJaL
cout 自体使わないけど、昔のCだったら、#include <stdio.h>さえしとけば、
printf()もputs()もputhcar()もgetc()もfputc()もfprintf()もsprintf()も
vsprintf()もvprintf()もfopen()もfread(), fwrite(), fgetc() もみんな
そのまま短い関数名で使えたのに、今のC++だと、もし、
using namespace std; を使ってはならないなら、

using std::cout;

みたいな事を使う名前の文だけやらなくちゃいけないのはかなり非効率だと思う。
0268デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:15:24.12ID:eeu00PkY
>>267
誤:みたいな事を使う名前の文だけやらなくちゃいけないのはかなり非効率だと思う。
正:みたいな事を使う名前の分だけやらなくちゃいけないのはかなり非効率だと思う。
0269デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:21:38.24ID:dTS2sKLx
>>265
namespace(やパッケージ名やモジュール名)のエイリアスえは安全性とタイピング量の効率の良い妥協点だとは思う
ただし、ファイルスコープでエイリアスしたコードを他に持っていったとき(ry

ちなRustではモジュール名の別名の付け替えはできないが、using namespaceみたいなことを
してほしいのかしてほしくないのかを中の人がモジュール名の末尾の階層を「prelude」にするという慣例で凌いでゐる
0272デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:26:49.27ID:bjverAuH
.cppの方は読み込むヘッダがそこに書き込まれてるんだからusingしようがaliasしようが問題ないだろと。
どこで読み込まれるかわからないヘッダに使うことと分けて考えられへんのかね、このバカは
0273デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:26:57.92ID:dTS2sKLx
>>270>>271
.hでは使わず.cppで使う話してるんだけど…
ひょっとしてファイルスコープでusing namespaceするというのを.hで使う意味だと
この暑さで短絡しているのでは…
0274デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:27:31.31ID:ve9YLJaL
大部分のここの人達の主張は、直接

std::vector, std::list, ・・・ を書くか、それが嫌なら、

using std::vector;
using std::list;
・・・

を延々と書けというんですよね。後者のやり方は、Java の import 文で
import com.sun.xxx.xxx.class1;
import com.sun.xxx.xxx.class2;
・・・

などとするのに似ていますが、それが一番の Java の欠点でも有る部分なんです。
そこを C++ は取り入れてしまった。
0275デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:32:21.74ID:dTS2sKLx
>>274
Javaのimport文も一応「*」でusing namespaceと同じようなことができるはず…
問題なのは、中の人の意図がusing namespaceしてほしくないケース(namespace内で短い名前を使いまくっている(>>266))
においてもusing namespaceできてしまうことにある
0276デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:35:39.76ID:s7JzQoXH
stdつけるのそんなに嫌かね?
1つなら良いじゃないかと思う
長い奴は別名つけりゃいいし
IDE使っているとnamespace付きの方が候補が絞れてむしろ便利じゃね
ADLでつけなくても呼べる場面であったとしても
0280デフォルトの名無しさん
垢版 |
2019/08/03(土) 16:59:59.07ID:bjverAuH
>>275
なにが困るんだっての。
名前が被ったらスコープ内での命名が優先されるが、読み込んだヘッダの中の名前に影響は及ぼさないだろ
そして、隠蔽された名前にはnamespace名を使えばアクセスできるんだから何ら問題はない
0282デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:08:23.80ID:dTS2sKLx
>>280の言っている「問題にならないケース」はusing namespaceしなければ
そもそも名前が被ったりしないことから尻拭いの手間が生じないケースなので
using namespace擁護としては意味がない

既存の型と短い名前の組み合わせでも名前が衝突しないようにnamespaceという仕組みを設けたというのに
その崇高な理念を忘却しし、衝突させておいてから尻拭い可能だからおk、というおよそ合理精神0のが>>280の主張
0283デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:14:33.69ID:eeu00PkY
>>280
その話とは関係ないかもしれないけど、以下のようなことがあった。

その時には、理由は追求しなかったんだけど、昔、Javaで
impot com.sun.xxx.xxx.*;
impot com.sun.yyy.yyy;
・・・

みたいなことをやった時、* を付けたことによって javacでコンパイル時に名前衝突が起きた
ことがあった。それで * を使うのをやめて個別に直したら衝突しなくなった。

最後の方の名前は同じで、それを限定している名前、例えば、
zzz.aaa.ccc;
zzz.bbb.ccc;
みたいなのがあって、ccc の部分が同じだから ccc だけでアクセスできるようにした場合に
衝突が起きたのかもしれない。
0284デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:18:00.03ID:eeu00PkY
>>283
Javaの仕様も忘れてしまったけど、
import zzz.aaa.*; // たまたま zzz.aaa.ccc というのが有ったとする。
import zzz.bbb.ccc;

↑のような場合に、ccc という名前が衝突するのかも。
0285デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:23:56.42ID:L8lVlVkx
>>274
> 大部分のここの人達の主張は、直接
>
> std::vector, std::list, ・・・ を書くか、それが嫌なら、

これはよい
でも

> using std::vector;
> using std::list;
> ・・・
>
> を延々と書けというんですよね。

これを言ってる人いたっけ?
名前空間を明示するというポリシーに反してるからおれは使わないな
0286デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:28:41.36ID:bjverAuH
自分のコントロール下にあるところで機能を使うなってのは自分が上手くつかえないだけの話だわな。
ブロック作ってブロック外と同じ名前の変数作ることすら禁止しそうな勢いだな。
ヘッダで使うなってのは自分のコントロール範囲外でバッティングが生じるからだ。
0287デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:29:59.98ID:rAotfWJY
そもそも名前空間の柔軟性は、C++が最強だから。
文句言うのは筋違い。
0288デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:34:07.35ID:eeu00PkY
そもそも標準のライブラリなので、namespace std の中に入れる必要なかった。
下手に入れてしまったからむしろ std:: を外したときに衝突する問題が
起きる可能性が出てきてしまった。
0289デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:37:28.85ID:rAotfWJY
>>288
標準ライブラリとバッティングさせるようなバカはその場で処刑したほうが良いのでは。
標準ライブラリくらい暗記しとけよ。
0292デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:47:44.86ID:rAotfWJY
>>291
殺せ。
0293デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:48:34.32ID:rAotfWJY
>>290
あれは許せんな。
いや、許してはならない。
いつかレッドモンドに爆撃機を送り込むべき。
0294デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:50:54.20ID:eeu00PkY
そういえば、min(), max() は C の時代、確かマクロ実装版が基本だったり
して複雑なことになっているのかな。よく知らないけど。
0296デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:55:43.43ID:rAotfWJY
マイクロソフト最大のチョンボだよな。
0297デフォルトの名無しさん
垢版 |
2019/08/03(土) 17:59:48.03ID:3VuQ5ICx
関数は関数呼び出しが遅いから使うなマクロにしろ
処理は全部mainに入れろ

という恐ろしい時代から引きずってるから仕方ないといえば仕方ない
0298デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:02:18.88ID:eeu00PkY
だったら STL の方が、std::max とかじゃなくて、
std::smax とかにすべきだったような気がしますが。
0299デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:03:42.44ID:ulHqgYUF
NOMINMAXしたらしたでgdiplusでエラーになったので、仕方なくusing std::min;using std::max;を書いてしまった。
0300デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:03:43.41ID:SSA79Euw
>>288
どんなusingがされている箇所でもstd::をつけさえすれば確実に標準ライブラリにアクセスできるんだから、記述の一貫性を保つのに役立つよ。
0301デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:07:41.16ID:eeu00PkY
元々 min(), max() は非常に古い C時代から #define されているマクロですよね、

std::min(), std::max() と書いても結局マクロ展開されてしまうのでは
ないでしょうか???
0302デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:08:18.92ID:rAotfWJY
>>298
でも実際に引っかかったら、何でこういうことする!マイクロソフト死ね!!っておまえも思うはず。
0303デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:10:37.82ID:eeu00PkY
STL の方の min(), max() を使いたい場合は、
(min)(a,b)
(max)(a,b)
でいけるようです。C/C++ の前処理層によるマクロ展開は
マクロ関数名(
という並びが有る場合にのみ展開されますので。
0304デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:14:26.75ID:eeu00PkY
>>302
いや、むしろ逆に、std::min の設計者の方がCの常識を知らない人だな、
と思ってしまいます。
そもそも、min(), max() マクロは、1980年代のC言語の時代から有るよく
知られたものなので、後から登場した C++ 標準ライブラリは、それが
有る場合にでも当然問題なく使えるようにしなくてはならなかったが、
そうなってません。それはどちらに原因があるかは明確です。
0305デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:19:07.11ID:dTS2sKLx
>>301
左様

.cppのヘッダファイルをインクルードし終わった以降の適当な場所でおもむろに
#undef min
#undef max

インクルードしたヘッダファイルにマクロ版のmin()、max()に依存したマクロが存在せず、
かつマクロ版のmin()、max()を使わない限りにおいてこれでおk、
0306305
垢版 |
2019/08/03(土) 18:26:53.75ID:dTS2sKLx
適用条件訂正orz
正: マクロ版のmin()、max()を使わない限りにおいてこれでおk、

インクルードしたヘッダファイルに含まれるマクロ版のmin()、max()に依存するマクロ経由で
間接的にマクロ版のmin()、max()を使おうとした場合はコンパイルエラーになるからワカル
そうなった場合の処置は知らんが、コンパイルが通ったら>>305の方法で安全なはず
0307デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:29:09.20ID:3VuQ5ICx
一番安全なのはこれだってboostの長年の結論だから
max BOOST_PREVENT_MACRO_SUBSTITUTION (a,b)
0308デフォルトの名無しさん
垢版 |
2019/08/03(土) 18:29:45.19ID:eeu00PkY
マクロ版 min(), max() が #define されている状態でも、
#define smin (std::min)
#define smax (std::max)
としてしまえば、smin(a,b), smax(a,b) と書くだけで
それぞれ std::min(), std:max()
が使えるでしょう。
0311◆QZaw55cn4c
垢版 |
2019/08/03(土) 19:39:31.49ID:NDKzILOT
>>267
ふつうに std::cout << "hello, world!" << std::endl;
と地の文として書いていますが、そういうのは駄目なのですか?
0312デフォルトの名無しさん
垢版 |
2019/08/03(土) 19:47:04.82ID:M1zmWsZu
std::を書くと死ぬ人が発狂してるだけなので、std::を普通に書ける人にはしょうもない話
0313デフォルトの名無しさん
垢版 |
2019/08/03(土) 19:50:41.99ID:XP2vdzkU
これはVisual Studio 2019のバグだろうか?
C++17想定。Wandboxでは問題なし。

namespace user::math::literals {
constexpr double operator""_deg(long double deg) {
return deg * 3.14 / 180.0;
}
};

struct Test {
template<typename T = double>
constexpr double test(T t) {
using namespace user::math::literals;
return 1.0_deg * 8.0;
}
};

int main(){
}

//error C3688: リテラル サフィックス '_deg' が無効です。リテラル演算子またはリテラル演算子テンプレート 'operator ""_deg' が見つかりません

発生条件はクラス内テンプレート関数でユーザー定義リテラルを含んだ式
return 1.0_deg * 8.0;をreturn 1.0_deg;に変えると問題ない
0314デフォルトの名無しさん
垢版 |
2019/08/03(土) 19:58:09.36ID:M1zmWsZu
普通にビルドできたけどプロジェクトのC++言語基準をちゃんとC++17にしたか?
0316デフォルトの名無しさん
垢版 |
2019/08/03(土) 21:04:27.05ID:3VuQ5ICx
using namespace はその名前空間の中の名前を私が責任持って現在の環境に導入しますという宣言だ
中身を把握してないくせにそんな事して事故った奴が全部悪いんであって、使われた側には責任はない
stdとて例外ではない
0317デフォルトの名無しさん
垢版 |
2019/08/03(土) 21:27:39.99ID:dTS2sKLx
>>316
使われた側の未来のふるまいまで予測してnamespaceの中身を理解などしていられない件について:

namespaceの正しい使われ方の下では、aというnamespaceに将来どんな名前が追加されようとも
bというnamespaceの名前とは衝突しないはずである
ところがaとbをusing namespaceしてしまったが最後、誰にも責任が持てないカオスが訪れる

これはnamespaceが無かったころの言語に先祖返りするだけではなく、より悪い状況を招くことに注意。
namespaceの利用によって、open、close、copy、find、vector、list、string、.....といった「自然な」名前がいっぱい使用されるからである。

namespaceは崇高だが、using namespaceはそうされることを意図されたnamespace意外には邪悪すぐる
0318313
垢版 |
2019/08/03(土) 21:32:17.54ID:xzejIjJP
>>314
再インストールしなおしてプロジェクトの設定をC++17なのを確認してもエラーが出た
うちの環境だけか・・・

Visual Studio 2019 Community Version 16.2.0
0319デフォルトの名無しさん
垢版 |
2019/08/03(土) 21:38:58.27ID:M1zmWsZu
>>318
こっちも16.2.0で、ワークロードは「C++によるデスクトップ開発」のオプションに全部チェック
他はQtツール入れただけ
0320デフォルトの名無しさん
垢版 |
2019/08/03(土) 21:51:26.72ID:3VuQ5ICx
>>317
完全に同意
そういう事態が起きないと確信できるほど中身を理解してるnamespaceか、起きても問題ないほど狭いスコープか
そのどちらかでしか使ってはいけないものだ
using namespaceというのはそういう乱暴な機能
0321317
垢版 |
2019/08/03(土) 21:51:59.64ID:dTS2sKLx
訂正;
語: namespaceは崇高だが
正: namespaceは崇高かもしれないが

>>316みたいな無根拠で実害のある精神論に後退するぐらいなら、
namespaceで修飾するかわりに接頭辞をつけた名前を使うという>>228な方策も現実の選択肢足りえる
>>228がネットをgrep my_fooして見つからなかったのは不幸な事故だが
0322デフォルトの名無しさん
垢版 |
2019/08/03(土) 21:54:29.31ID:3VuQ5ICx
>>321
同意した直後に正反対のこと言うのやめて?
316のどの辺が精神論で有害なのさ
C++だけの話でもなくて、pythonのimport * がカスと言われてるのと本質的に同じだろ
0323デフォルトの名無しさん
垢版 |
2019/08/03(土) 22:06:21.81ID:CM1VqrV7
>>316の精神論にはある意味同意するけどな
(ヘッダでの名前空間取り込みも、ある名前空間に別の名前空間を取り込む場合など、合理性があるなら設計上の選択の一つと言えるし
その辺は設計者の責任だと思う)

あと>>298, >>301はバカチンじゃなかった、すまんかった
0324デフォルトの名無しさん
垢版 |
2019/08/03(土) 22:09:28.81ID:bbhz9sWw
using namespaceの話はも止めたら?
使いたい人は使えばいいし
使いたくない人は使わなければいい
でいいじゃん
大した問題じゃないだろ
0327デフォルトの名無しさん
垢版 |
2019/08/04(日) 01:20:42.30ID:6uyvUJES
そもそもプログラミングは間違ったことを信じている人がはっきり損をする世界
(ことあるごとにエラーが多発するとか作成に余分な時間がかかるとか完成品の質が悪いとかの話で)
リアルで誰かと作業するならともかく
ネットの向こうの間違ってる誰かなんて放っておいても損を勝手に積み立てて自らつぶれていくものだ
0328デフォルトの名無しさん
垢版 |
2019/08/04(日) 01:21:14.60ID:uuq2lSJI
おれはね
C++はね
正しく扱うのに本当にコツのいる言語だと思うんよ
そんな中using namespaceは割とどうでも良いよね
俺は使わない派だが、使いたければ使えばって感じ
0329デフォルトの名無しさん
垢版 |
2019/08/04(日) 01:59:42.19ID:xBRRtFJn
確かにどうでもいいな
プルリクで簡単に見つかるから
というかコンパイルや静的解析でエラーにする方法はないかな
0330デフォルトの名無しさん
垢版 |
2019/08/04(日) 09:37:37.80ID:7855nA4b
>>327
正確にはそれをリカバーする人だがな。
バカはリカバーされて成り立ってることすら理解せず同じことを繰り返す。
0331デフォルトの名無しさん
垢版 |
2019/08/04(日) 18:06:02.62ID:24EQJs3u
min(), max() マクロのような件は別として、標準的なライブラリであるところの
std::系の名前は、using namespace std; してもそんなに問題ないということは
無いんですか???

他のライブラリの名前空間 XXX も同時に using namespace XXX; した場合に
もし衝突が起きる場合は、using namespace XXX; だけはしないようにすれば、
特に問題ないような気がします。実際やってみたことが無いので経験者の意見を
聞いてみたいです。
0332デフォルトの名無しさん
垢版 |
2019/08/04(日) 18:48:22.76ID:xBRRtFJn
個人の趣味プログラミングならご自由に
仕事ならコーディング規約にあわせる
コーディング規約作る立場なら、チームにバカが混ざってる前提で非属人的になるようにルールを設ける
で経験を積めば積むほど自分がバカであることが身にしみてわかる
そういうことだよ
0333デフォルトの名無しさん
垢版 |
2019/08/04(日) 18:54:59.65ID:UDvg82p4
>>331
別に衝突しなくても問題は起こる。
using namespace stdで書いたコードをヘッダーのインライン関数に持って行く必要が出た場合とか、

using namespace std;
#inlucde "...."

となってしまっていてたまたま動いていたコードを、別の箇所でincludeしたときにエラーがでまくるとか。
0337デフォルトの名無しさん
垢版 |
2019/08/04(日) 19:06:21.58ID:UDvg82p4
>>336
ところどころについてたり、ついてなかったりするくらいなら、最初からstd::つける方がはるかにマシ。
0339デフォルトの名無しさん
垢版 |
2019/08/04(日) 19:09:16.58ID:6Wul5V0e
普通頻繁に使うライブラリをusingするだけで、名前空間ごとはやらんだろ
chrono使う時はたまにやるけど
0343デフォルトの名無しさん
垢版 |
2019/08/04(日) 20:54:10.96ID:Rn2rET4f
>>341
size_t は大昔からあるのと明らかに型名っぽい名前なのでわざわざバッティングさせる奴もいないからじゃね?
0346デフォルトの名無しさん
垢版 |
2019/08/05(月) 02:02:36.01ID:LDivZuKg
おれも知らんかったなまぁ言われてみればたしかにそうだなsize_tってネィムスペィス上でも定義されてたのか今度から一貫性のためにstd::つけとこうかな
まぁ、editorのちょい設定いじるだけなんだがな(´・ω・`)
0348デフォルトの名無しさん
垢版 |
2019/08/05(月) 14:11:04.57ID:uXNLYXLK
>>342
1ファイルの行数は関係有りません。
要は大きなプログラムを書いているとき、string で済むところを
全ての箇所で std::string と書くのかということです。
void func(std::string &somename, int a, int b) {
std::string aaa;
aaa = somename + "abc";
}
struct Txxx {
 std::string name1;
 std::string name2;
 ・・・・
};
↑のようにタイピングするのは余り賢いやり方だとは思えません。
0350デフォルトの名無しさん
垢版 |
2019/08/05(月) 14:24:57.77ID:nblSLoEW
過度に賢く振る舞おうとして滑ってるパターン
それくらい普通に書けばいいじゃん
0351デフォルトの名無しさん
垢版 |
2019/08/05(月) 14:27:04.00ID:xQVlfAfV
こういう奴って馬鹿丁寧に一文字ずつ全部打ってんのかね
補完って機能の概念がない世界に住んでんのかしら
0353デフォルトの名無しさん
垢版 |
2019/08/05(月) 20:01:38.61ID:s1STjseD
>>348
> 1ファイルの行数は関係有りません。
> 要は大きなプログラムを書いているとき、string で済むところを
> 全ての箇所で std::string と書くのかということです。
俺は書く。

> ↑のようにタイピングするのは余り賢いやり方だとは思えません。
お前の感想はどうでもいい
0354デフォルトの名無しさん
垢版 |
2019/08/05(月) 22:09:13.72ID:B18jZANO
>>348
高々数文字のタイピングに拘って名前空間のメリットが理解できないという主張を繰り返すお前さんの行動は、余り賢いやり方とは思えません。
0355デフォルトの名無しさん
垢版 |
2019/08/05(月) 22:10:29.33ID:7u4aY/7T
>>348
だから何のために名前空間があるのかググれよ
別に好きにやればいいけどお前がいつもstd名前空間取り込んで便利だと思ってるのは
標準ライブラリしか使ってないからだ
0356デフォルトの名無しさん
垢版 |
2019/08/05(月) 22:17:59.20ID:vqN4pUkV
無駄だと思うならtypedefやusingすりゃいいじゃないか
そもそもstringって名前長すぎだろ
0357デフォルトの名無しさん
垢版 |
2019/08/05(月) 22:26:34.39ID:xngMWyKF
usingである程度の広さのスコープでやるんが正解だろ。
まあこのある程度の広さってのが人によってだいぶ違うだろうが。
0358デフォルトの名無しさん
垢版 |
2019/08/05(月) 22:37:46.60ID:vqN4pUkV
少なくともstdは普通using namespaceしないよね
でかすぎる
最近良くやるのは
namespace fs=std::filesystem;
だな

まあこれもヘッダで使うなら独自namespaceに入れてからだが
0359デフォルトの名無しさん
垢版 |
2019/08/05(月) 23:33:53.82ID:/t1yyPXk
using namespace std;をグローバルなスコープでやってしまうと
ソースコードを他に持って行ったとき困る
fooをstd::fooに変換するのはfooの種類が100台になると並みのエディタの置換機能では手間的にアウト
一方std::をとるのなら簡単にできる
std::をつけるのは将来への投資といえる
0360デフォルトの名無しさん
垢版 |
2019/08/07(水) 02:10:18.89ID:/mJrMLHD
初心者除ける、上級勘違い中級者こそ、出て行ってくれないかな。
本当の上級者は、プログラミング初めての人でも、優しくあたってくれますよ。
0362360
垢版 |
2019/08/07(水) 03:17:50.31ID:/mJrMLHD
>>360 = not(>>348)
ですが。
証明方法は無いですから、わかりませんけどね。
0363360
垢版 |
2019/08/07(水) 03:53:56.72ID:/mJrMLHD
>>342
各1万行30ファイルは、セーフですか?
0364デフォルトの名無しさん
垢版 |
2019/08/07(水) 08:04:40.03ID:go9nzBX4
入れ子となったクラスの内側のクラスから外側のクラスのprivateメンバにアクセスできるという
内側のクラスの特権はJavaやC#と同じくC++にもあるから、これを使って大規模なStateパターンでも書いた日には
ソースコードの行数も大規模にならざるおえない
このとき上記3言語の中で唯一大規模にならずに済むのはクラスの分割定義が可能なC#だけ
0366デフォルトの名無しさん
垢版 |
2019/08/07(水) 09:31:41.35ID:ZWXmwdWw
昨今のプログラミング用語における入れ子は界隈に限らず日常的に使われているが
プログラミング業界では特に再帰的構造を指す場合にも多く使われる

そこに非常に現代的な特殊用語たる「出し子」が加わると
一般人は入れ子と出し子が対になっていると思い込む
0369デフォルトの名無しさん
垢版 |
2019/08/07(水) 23:36:21.14ID:gdjRebyd
スコープにあった変数名の長さにするべきとかそういうのお前らは習ってねーの?
0372デフォルトの名無しさん
垢版 |
2019/08/08(木) 03:03:18.83ID:2Zq4F03j
>>370
チェック出来るルールに完璧に沿って書けてるボクちゃん偉い!エッヘン!
ってこと?
ユーザーからしたらクソの役にも立たねーよそれ
0374デフォルトの名無しさん
垢版 |
2019/08/08(木) 05:46:38.89ID:FTUf1Nuq
>>367
1行で2クラス以上定義しないという原則を守る限り、30億状態あったら外側のクラスはどうがんばっても30億行未満では書けない
この場合でも30億行未満で書けるのは分割定義できる言語だけ
また、内側のクラスを使わない普通のStateパターンなら30億ファイルに分割してかけばだいたいおk
(1状態から遷移し得る状態の数による。30億状態のどれにでも遷移しえる状態、
 みたいな極端なやつはさすがに遷移先状態クラスの#includeで30億行になるが

>>368
おk
0376デフォルトの名無しさん
垢版 |
2019/08/08(木) 10:31:27.94ID:llWdm4EH
それは設計の問題でしょ
30億通りのstateパターンで設計する方が悪い
言語の問題じゃあないな
あり得ないヘンな例を持ち出してdisる詐欺師の方法だ
0377デフォルトの名無しさん
垢版 |
2019/08/08(木) 21:15:10.76ID:lDut6bjR
>>359
ファイル単位でそのまま使えや
コピペして改変部分があるとか当たり前のこと言うなよwwww
0379デフォルトの名無しさん
垢版 |
2019/08/09(金) 00:11:55.59ID:LbUkdyT/
c++で想定外の場合にエラーメッセージとその行数を出して終了させたいのですが、
どのようにしたらできますか?
下記のようにしてもexitした行数が出ません。。

::fprintf(stderr, "error.\n");
exit 1;

perlのdie()のようなものをイメージしています。
0381デフォルトの名無しさん
垢版 |
2019/08/09(金) 22:56:01.92ID:nHekiGzf
丁寧にエラーメッセージ出すよりデバッガでバックトレースかけた方が早かったりするのは内緒
0385379
垢版 |
2019/08/10(土) 09:48:42.90ID:bGTBV06s
>>380
その方法で目的の動作ができました。
行の最後にexit入れたら一行でかけて良さげな感じです。
ありがとうございました。
::fprintf(stderr, "error. (line: \d)\n", __LINE__); exit(0)

>>381,384
バックトレースというものを知らなかったのでググりました。
色々なものがあるようですが、gdbの下記程度の使い方なら自分でもできそうなので
これをちょっとづつ使ってみようと思います。

ttps://rat.cis.k.hosei.ac.jp/article/devel/debugongccgdb1.html
0391デフォルトの名無しさん
垢版 |
2019/08/10(土) 16:57:47.58ID:Azv7NalM
いや、多分そこまで考えてないから、コンパイラ上ではintもしくはsize_tで
マクロ展開時は文字列化して接尾の型指定とかつけないだろ

勝手につけられると逆に困るし
0392デフォルトの名無しさん
垢版 |
2019/08/10(土) 17:01:16.99ID:lQ/anG82
int型はターゲットアーキテクチャーで一番自然な型というのが本来の意味なのでソースコードの最大行数と関係する理由が無い
C++の最新規格ではどうなったかわからんが、longは規格上32 bit固定なのに対してintは16 bitのアーキテクチャーが有り得るはず
0395デフォルトの名無しさん
垢版 |
2019/08/10(土) 19:05:34.69ID:bGTBV06s
バイナリファイルを一度に読み込もうとしています。
圧縮ありファイルと圧縮なしファイルを以下のように判定して読み込もうとしているのですが、
ファイルの全てを読み込む方法がわかりません。
@Aはどのようにしたら良いですか?

http://codepad.org/FwYwQ62R
0396デフォルトの名無しさん
垢版 |
2019/08/10(土) 19:14:37.23ID:J81sqFQj
std::
これ自体は大した量ではないとは思うけど
これが何百何千と書かないといけないなら省略できる方法は必要だと思う
省略して且つ安全で簡単な方法が無いのが問題なんだと思う

ここまで読んででusing宣言を書き連ねたファイルを用意して
関数定義の次の行で#includeするのが今の所一番良い様な気がした

const何かも余りに書きすぎるので
これも何らかの形で省略できる記法を搭載できないのだろうかとは思ってる
classのpublic:
みたいに
const:
とかするとその後は記載しなくてもconst宣言になる
みたいな方法を搭載したりはしないのか?
と何時も疑問に思う
0398デフォルトの名無しさん
垢版 |
2019/08/10(土) 19:26:04.25ID:jgcB4xBs
>>396
constこそusing書き連ねたファイル用意してincludeすればいいのでは

using cchar = const char;
using cuchar = const unsigned char;
using cint = const int;
using cuint = const unsigned int;
0399デフォルトの名無しさん
垢版 |
2019/08/10(土) 20:32:30.45ID:pnnBC1tu
>>396
その疑問の答えは、あなたが具体的な提案を標準化委員会に持っていかない理由の答えと同じでしょう。
0402デフォルトの名無しさん
垢版 |
2019/08/11(日) 00:40:56.64ID:khTmYGk1
>>397
ありがとうございます。
とりあえず圧縮なしの方は以下で取得できたようです。
ここで一点疑問です。
mallocの値がぴったり正しいかの確認をしようと、下記5行目のdatasize+1を-2や-3にしたのですが、
printf()で最後まで値が正常に出てきます。
datasize-3としてもたまたま連続して拾っているだけなので問題ありだと思うのですが、
malloc(datasize)ではなく、malloc(datasize+1)でぴったりメモリ確保ができているのでしょうか?

unsigned char* data;
long datasize;
fseek(fp, 0, SEEK_END);
datasize = ftell(fp);
data = (unsigned char*)malloc(datasize+1); // +1を-2, -3にしてもprintf()では最後まで正常な値が出てくる。
if( data == NULL ){
exit(1);
}
fseek(fp, 0, SEEK_SET);
fread(data, 1, datasize, fp);
fclose(fp);
for(int i=0; i < datasize; i++){
printf("%02x\n", data[i]);
}
0403蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/08/11(日) 00:49:51.23ID:KV8Qszx5
割り当てされてない領域に書き込むというのは、C/C++ではあり得る。
そこに他に意味のあるデータがあれば、そのデータは壊れる(データ破壊)。
0404デフォルトの名無しさん
垢版 |
2019/08/11(日) 07:16:49.27ID:bWvktEwN
>>402
処理系によるけど大抵の処理系では指定されたサイズをきっちり確保とかはしなくて16バイト単位くらいで確保する
なのでそのdatasizeの値によっては-15とかしても大丈夫な場合すらあることがある
もちろん動作は保証されない
0405デフォルトの名無しさん
垢版 |
2019/08/11(日) 08:16:38.18ID:8PrAFYrU
> malloc(datasize)ではなく、malloc(datasize+1)でぴったりメモリ確保ができているのでしょうか?
malloc(datasize)で十分、malloc(datasize+1)だと1つ余分
freadでもprintfでもdatasize個までしかアクセスしていないので
0407デフォルトの名無しさん
垢版 |
2019/08/11(日) 10:12:56.60ID:rgBQlH0q
昔みたいにメモリ枯渇なんてそうないし誰かがデータ破壊やらかして休みに呼び出し食らいたくないので16バイトくらい余計に確保しとこ
0411395
垢版 |
2019/08/11(日) 11:36:18.32ID:khTmYGk1
>>404
malloc()は数を指定していて、for分でアクセスしているdataは配列だから最後はdatasize-1ということですね。
僕の理解と合いました。
malloc(datasize)とします。
ありがとうございます。

次にgzipの全読み込みも調べています。
とりあえず下記でout.dbと展開後のaaa.dbのcksum値が一致したのでちゃんと読み込めたと思います。
※1のところで配列に格納すれば良いと思うのですが、最初は配列の数が確定していないので
配列数を決定することができません。
読み込むファイルサイズはギガバイトクラスの大きなファイルなので、なるべく速度を維持したまま
一つの配列に格納したいのですが、どうすれば良いですか?

FILE *wfp;
gzFile rzp;
unsigned char buf[8192*1000] = {0};

rzp = gzopen("aaa.db.gz", "rb");
wfp = fopen("out.db", "wb");

while((cnt = gzread(rzp, buf, sizeof(buf))) > 0){
fwrite( buf, sizeof( unsigned char ), cnt, wfp );
※1 ここで全データを一つの配列に格納したい。
}

gzclose(rzp);
fclose(wfp);
0413デフォルトの名無しさん
垢版 |
2019/08/11(日) 17:00:08.00ID:x7hs8Ubh
qiitaでさC++のタグ検索したらcppreference.comが公式リファレンスと書かれてたけどここ公式なの?
0415395
垢版 |
2019/08/11(日) 18:01:46.19ID:khTmYGk1
>>412
コメントありがとうございます。
全部読む以外に調べる方法は無いんですね。
ということでrealloc()で拡張していくことを考えてみました。
下記で作られた解凍後のデータがgunzipで解凍したものと一致したので大丈夫そうです。
ありがとうございました。

#define MAX_BYTE 8192*1000

data = (unsigned char*)malloc(MAX_BYTE);
rzp = gzopen("aaa.db.gz", "rb");
long data_size = 0;
while((cnt = gzread(rzp, data+data_size, MAX_BYTE)) > 0){
data_size += cnt;
data_new = (unsigned char*)realloc(data, data_size+MAX_BYTE);
if( data_new == NULL ){
free(data);
::fprintf(stderr, "拡張失敗\n");
exit(EXIT_FAILURE);
}
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
}
}
gzclose(rzp);

// 解凍後データを書き込み
wfp = fopen("out.db", "wb");
fwrite( data, sizeof( unsigned char ), data_size, wfp );
fclose(wfp);
0416デフォルトの名無しさん
垢版 |
2019/08/11(日) 18:25:47.16ID:bWvktEwN
>>415
そんなでかい領域をreallocすると何度もコピーするはめになるから>>412の言うように2パスにするか、各領域をリストで繋いて最後に一気にコピーするようにした方がいい
0417395
垢版 |
2019/08/11(日) 19:34:48.78ID:khTmYGk1
>>416
2パスをググってもそれらしいものがなかったのですが、どういうものなのでしょうか?
あと、「各領域をリストで繋いて」というのはvectorに追加しながら最後に連結するということでしょうか?
0418デフォルトの名無しさん
垢版 |
2019/08/11(日) 19:44:47.41ID:bWvktEwN
>>417
> 2パスをググってもそれらしいものがなかったのですが、どういうものなのでしょうか?
1回目(Pass 1)ではデータの格納はせずにサイズだけ取得する
合計サイズ分を確保して2回目(Pass 2)で実際に格納するってこと

> あと、「各領域をリストで繋いて」というのはvectorに追加しながら最後に連結するということでしょうか?
そう言うこと
でかいデータはコピーにも時間がかかるからできるだけコピーしないようにした方がいい
0419395
垢版 |
2019/08/11(日) 20:30:35.16ID:khTmYGk1
>>417
2パス良さそうですね。
gzread(rzp, data+data_size, MAX_BYTE)
のところを下記のようにNULLにしてもちゃんとファイルの最後まで動いているようなのですが、これがデータ格納せずにサイズを取得するということでしょうか?
gzread(rzp, NULL, MAX_BYTE)
0420デフォルトの名無しさん
垢版 |
2019/08/11(日) 20:43:01.53ID:khTmYGk1
すみません、NULLだとそもそも一回も取得できずに終わっていました。。
データ格納せずに一回ファイル精査するのってどうするんでしょうか?
0421デフォルトの名無しさん
垢版 |
2019/08/11(日) 21:37:44.09ID:vST/kP4M
>>420
固定長のバッファを1つ用意して、そこに上書きしながら繰り返し読み込めばいい。内容は上書きされて読めなくなるけど、読み捨てるつもりなので気にしない。
0422デフォルトの名無しさん
垢版 |
2019/08/11(日) 21:42:34.43ID:bWvktEwN
(最終的なところに)格納しないってことな
適当なバッファを1つ用意して毎回そこに格納しとけばいい
0427デフォルトの名無しさん
垢版 |
2019/08/12(月) 09:13:50.21ID:QXujyVaw
でかい領域のreallocで毎回コピーが発生するというのは都市伝説、
と言いたいところだが他のスレッドが動いているとそうとも言い切れないかそうか、
この場合の2パス方式はgzipが2回走るのがいかにも実行時間の無駄でいやすぐる
最初に大きめの領域をmallocして足りんかったら2パスに切り替えるという投機的なやり方のが良い
0428デフォルトの名無しさん
垢版 |
2019/08/12(月) 09:18:32.18ID:QXujyVaw
だいたいいかにgzip様といってもファイルを毎回1/10まで圧縮できるわけはないのだから
読み込むファイルサイズの10倍を確保しておけばほぼ1パスで済む
展開後の実サイズがわかったら展開後の実サイズぴったりにreallocで縮小すれば良い

ちなメモリの断片化はガン無視
実使用サイズの倍のメモリも用意できないようなプアな環境のならmallocやreallocする設計から見直さねばならない
見直すべき
0430デフォルトの名無しさん
垢版 |
2019/08/12(月) 10:19:40.97ID:QXujyVaw
>>429
ヒープメモリはスレッドで共有される
もしヒープメモリを使う他のスレッドが一切無いなら
realloc()でサイズ拡大してもコピーは生じない(後ろに領域伸ばせるから
この説明でまだ疑念が渦巻くのならプログラミング言語Cをきちんと読み直した砲が良い
(あのmalloc()実装例がmalloc()実装の全てとは言わんが基本
0432デフォルトの名無しさん
垢版 |
2019/08/12(月) 10:28:45.76ID:Mc0sgLDk
>>430
断片化って知ってる?
> 後ろに領域伸ばせるから
これ常にできるわけじゃないよ
> この説明でまだ疑念が渦巻くのならプログラミング言語Cをきちんと読み直した砲が良い
お前がなw
0433デフォルトの名無しさん
垢版 |
2019/08/12(月) 10:35:35.84ID:q+3SbcDd
特にこの場合はgzipを使うからね
アウトプット用のメモリを確保した上でgzipを実行するわけだけど
gzipが内部で動的にメモリを確保するかしないかは知らんけど、多分するでしょ
そうすると新たに論理アドレス空間が使われるから
連続したメモリ空間を後ろに拡張できるかって言われるとね
0434デフォルトの名無しさん
垢版 |
2019/08/12(月) 10:43:33.86ID:QXujyVaw
>>431-433
んまーそれはそうやったorz
あと今回のgzip展開ルーチン呼び出し前にmallocした領域がたまたま後ろに居る可能性もあるな!
しかし>>428-428は断片化が生じないと言っているのではないし主目的のgzip読み込みに関しては
断片化による影響を受けにくくしているのだから大枠問題無い
良い良い、良いではないか
0435395
垢版 |
2019/08/12(月) 11:18:22.87ID:lzJUIRtk
色々とご意見ありがとうございます。
どなたかの役にたてばと思い僕が調べた内容をお知らせします。

gzip展開後に5GBくらいになるデータでテストしてみました。

@time ./a.outで簡易的に時間取得
Arealloc方式の場合 >>415 の下記部分でコピーが何回発生しているかをカウントしてみる
// アドレスが変化した場合
if( data != data_new ){
// free(data); // 元オブジェクトは解放済みのため不要
data = data_new;
copy +=1; // コピーした回数をカウント
}else{
not_copy +=1; // コピーせずに拡張できた回数をカウント
}

結果は以下のようになりました。
強力なサーバでメモリが潤沢にあるためか、コピーがほとんど発生しないようで
realloc方式が早かったです。
本日祝日でサーバ使用者が少なく、よりコピー回数が減っていると思います。
個人PCでchromeにメモリ食われたりするとコピーが増えて逆転するかもしれないですね。
環境に合わせて変えようと思います。

# 2パス方式(約27秒)
./a.out 25.12s user 1.27s system 99% cpu 26.479 total

# realloc方式(約15秒)
./a.out 12.73s user 1.46s system 99% cpu 14.263 total
-> コピー 1
-> notコピー 636
0437デフォルトの名無しさん
垢版 |
2019/08/12(月) 12:00:43.69ID:QXujyVaw
malloc()されたりrealloc()されたりするヒープメモリは仮想アドレス空間に対応した普通のOSならプロセス毎に別空間だから
他のプロセス(他のサーバ利用者が居る or chrome)があってもヒープメモリの断片化に関係しないはず…

さらに、2パス方式の時間が1パス方式の倍になるのはメモリコピーよりもgzip展開を2回もやることが利いているでケテーイ
0438395
垢版 |
2019/08/12(月) 16:26:30.60ID:lzJUIRtk
すみません、また疑問が出てきたので相談させてください。
今読み込んだバイナリファイルの解析をしています。
ある一部の8バイトがビッグエンディアン形式で下記になっていて、これが少数点の数値で「2.500000e-04」となるようです。
3e 10 62 4d d2 f1 a9 fc

次に下記URLを参考に調べると今使っているサーバはリトルエンディアンでした。
(CPUはintel)
ttps://qiita.com/ryuichi1208/items/31442f9e8a7a7c94aeec
このため ビックエンディアン→リトルエンディアン の変換が必要と思うので下記のようにしました。

unsigned char t[8];
double little;
for (int i = 0; i < 8; i++) {
t[i] = data[7-i]; // バイトオーダーの変換
printf("%02x ", t[i]);
}
printf("\n");
memcpy(&little, t, 8);
printf(" %e\n", little);

---結果---
fc a9 f1 d2 4d 62 10 3e
9.536743e-10
----------

ちゃんと反転できていますが、結果は期待値「2.500000e-04」ではありませんでした。

>>続きます
0439395
垢版 |
2019/08/12(月) 16:29:26.29ID:lzJUIRtk
次に実際の値を16進数表示したときの確認として下記を実行したところ、結果は以下のようになりました。
int main(){
double data = 2.500000e-04;
unsigned char *p;
int i;
p = (unsigned char *)&data;
for (i = 0; i < 8; i++) {
printf(" %02X", p[i]);
}
printf("\n");
printf("%e\n", data);
return 1;
}

---結果---
FC A9 F1 D2 4D 62 30 3F
2.500000e-04
----------

比較すると、最初の6バイトは同じですが最後の2バイトが違いました。
どうやったらバイナリデータに入っている 「3e 10 62 4d d2 f1 a9 fc」 を 「2.500000e-04」 に変換できるかわかりますでしょうか?
ビッグエンディアン→リトルエンディアン の変換時にもうひと工夫いるのでしょうか?
0441デフォルトの名無しさん
垢版 |
2019/08/12(月) 16:54:28.94ID:dO9cEAMi
>>426
開発っつーか本当にどうしようもないバグの場合は使う。
遅いって言っても5〜10倍くらいだろ。
0442デフォルトの名無しさん
垢版 |
2019/08/12(月) 16:55:20.98ID:L6hDiPeu
2.500000e-04/9.536743e-10≒262144=2^18だからどっかで誰かが18ビットシフトしてないか調べろ
あとはそのバイナリ作った野郎に聞け
0444395
垢版 |
2019/08/12(月) 18:15:44.42ID:lzJUIRtk
>>440,442
データの方が違うんですかね。。
今調べてますがまだわかりません。

>>443
xeonです。
decimal64というのはまだ調べていませんがまたちょっと違う変換になるんですかね?
0446395
垢版 |
2019/08/12(月) 18:32:01.51ID:lzJUIRtk
同じサーバで生成されました。
生成したソフトは販売されているものなので問題はないと思うし、
他のソフトで読み取ってもちゃんと 2.5e-04 が出てくるのでデータに問題はなさそうです。
なぜそう読めるのか不思議です。。
0448デフォルトの名無しさん
垢版 |
2019/08/12(月) 18:34:28.15ID:Mc0sgLDk
>>446
> 生成したソフトは販売されているものなので問題はないと思うし、
なぜそのソフトの名前を書かないの?
> 他のソフトで読み取ってもちゃんと 2.5e-04 が出てくるのでデータに問題はなさそうです。
他のソフトって何よ?
みんなエスパーじゃないんだから出せる情報は出しなよ
0449395
垢版 |
2019/08/12(月) 19:04:19.39ID:lzJUIRtk
>>448
すみません、calmaという大昔のもので今はもう販売されていません。
0451395
垢版 |
2019/08/12(月) 21:13:36.45ID:lzJUIRtk
>>450
数値をバイナリ変換していそうなコードを今見つけました。
ただのビッグエンディアン表記ではなさそうです。
もう少し調べて見ます。
0452395
垢版 |
2019/08/12(月) 22:32:15.08ID:lzJUIRtk
下記で数値からバイナリへの変換ができましたが、何の計算をしているのかさっぱりわかりません……
逆変換できるのでしょうか?

http://codepad.org/oSvOJP1p

---結果---
変換前の値:0.000250
変換後の値:3e 10 62 4d d2 f1 a9 fc
----------
0454デフォルトの名無しさん
垢版 |
2019/08/12(月) 22:47:45.27ID:ikUKzGwn
浮動小数の正規化っぽいけど
( A < 0.0625 ) || ( A >= 1.0 ) ってのが特殊だと思う
何かそういう事情があったんでしょう
浮動小数の正規化ってのは検索すればわかる
別環境でデコードするだけならたぶん気にしなくて大丈夫
0455デフォルトの名無しさん
垢版 |
2019/08/12(月) 22:50:05.37ID:ikUKzGwn
確かに、IBM方式ってやつっぽい
気にしないといかんわw
無駄なこと書いてごめんね
0456395
垢版 |
2019/08/12(月) 23:17:08.77ID:lzJUIRtk
>>453-455
ありがとうございます。
今 IBMフォーマット や IBM方式 でググってますが中々それらしいものが出てきません。
かなりマイナーなものなのでしょうか?
0459デフォルトの名無しさん
垢版 |
2019/08/13(火) 10:45:33.34ID:dVadaxxz
こんな感じかな?保証はせん

uint64_t ibm = 0x3e10624dd2f1a9fcULL

if (ibm == 0x0) { return 0.0; }

uint64_t sign = ibm >> 63;
uint64_t ibmexp = (ibm >> 56) & 0x7f;
uint64_t ibmfrac = ibm & 0x00ff'ffff'ffff'ffffULL;

if (ibmexp == 0x0) { return std::numeric_limits<double>::quiet_NaN(); } //てきとう

uint64_t ieeeexp = (ibmexp - 64) * 4 + 1023;
uint64_t ieeefrac = ibmfrac;
while(ieeefrac & 0x0100'0000'0000'0000)
{
ieeefrac <<=1;
--ieeeexp;
}
ieeefrac ^= 0x0100'0000'0000'0000;
ieeefrac >>= 1;

uint64_t ieee = (sign << 63) | (ieeeexp << 55) | ieeefrac;
return *reinterpret_cast<double*>(&ieee);
0465デフォルトの名無しさん
垢版 |
2019/08/13(火) 18:22:46.77ID:PZEzWgAr
エクセス64か
半導体とかで使われるGDSIIの実数がそれなんだよね。
自力で実装したわー。
4bitを16進数一桁として考えてて、指数部は16^xで表現されててケチ表現なし。
0466デフォルトの名無しさん
垢版 |
2019/08/13(火) 20:43:52.09ID:qE6XkMY1
じゃあどっかにライブラリでもあるんじゃねえの
探したら出てくるパターンだろこれ
0467デフォルトの名無しさん
垢版 |
2019/08/13(火) 21:21:58.48ID:6RsDp/em
>>457-466
コメントやサンプルコードありがとうございます。
こんな複雑なコードになるんですね。。
何やってるのかさっぱりわかりませんが、上記コードを参考に勉強してみます。

しかしエクセス64で検索してもそんなに記事が出てこないですね。
かなりの難易度の予感……
0470デフォルトの名無しさん
垢版 |
2019/08/13(火) 22:00:36.02ID:yoyEPk6p
日本語だと情報が少なかったので英語圏も検索してみたところ、下記を見つけました。
ここのexcess64_to_ieee754が変換できるものかもしれません。
これから調べてみます。

ttps://github.com/ulfgri/gdsii-toolbox/blob/de8deaa5972c1449aacc3eea5dda86472ef721a8/Basic/gdsio/convert_float_generic.h
0471395
垢版 |
2019/08/13(火) 22:02:53.32ID:yoyEPk6p
>>469

かぶりました。
探していただきありがとうございます。
それも調べてみたいと思います。
0472デフォルトの名無しさん
垢版 |
2019/08/13(火) 22:30:02.23ID:b87Bd4Qh
>>467
フォーマットは>>458のリンク先に書いてある
3e 10 62 4d d2 f1 a9 fc の最初の1バイト(3e)は符号ビットと指数
0x3e = (0 0111110) で最初の0は符号(正)
残りの0111110が指数で10進では62
指数は64の時に0と解釈するので62 - 64 = -2
IBM形式では16の指数なので16^(-2) = 1/256
一方仮数部は
1: 1/16
0: 0/256
6: 6/4096
2: 2/65536
:
計 0.064
なので結果は0.064*(1/256) = 0.00025 = 2.5e-4
0473395
垢版 |
2019/08/13(火) 23:33:41.23ID:yoyEPk6p
>>472
わかりやすい解説ありがとうございます。
仮数部の計算がまだいまいち理解できていませんが、符号ビットと指数のところは理解できました。
なんとかプログラム作れそうです。
とても勉強になりました。ありがとうございました。
0474395
垢版 |
2019/08/14(水) 19:36:19.26ID:4qk3klko
>>472
仮数部の計算も理解できました。
ネットで浮動小数点を解説している記事を見るとどこも2進数で書かれていましたが、 >>472 はこのスレで会話に出しているバイト単位(16進数)で計算してもらってるんですね。
この辺の話になるとこのスレの趣旨から外れてきているのでこの辺にしておきます。

以上、お礼を兼ねての書き込みでした。ありがとうございました。
0475デフォルトの名無しさん
垢版 |
2019/08/14(水) 19:42:18.80ID:vrcyV9Lc
bit単位でもいいんだけど元の値との対応が取りにくいから16進の1文字(4bitなのでByteじゃなくてNibbleって言う)単位で計算してる
0476デフォルトの名無しさん
垢版 |
2019/08/14(水) 20:46:53.70ID:4qk3klko
そうでした。4bitでした。
今回バイナリ読みで初めてどっぷり16進数を扱ってますがバイトとニブル?がすぐわからなくなります。。
0478デフォルトの名無しさん
垢版 |
2019/08/15(木) 23:25:44.65ID:ON8CHoCN
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02007.html

上記URLで
・クラスの宣言はヘッダファイルにする
・クラスの実装部はソースファイルにする
・そのクラスを使いたいときはヘッダファイルのみインクルード
とありますが、これが一般的なのでしょうか?
0481デフォルトの名無しさん
垢版 |
2019/08/15(木) 23:34:39.15ID:ON8CHoCN
なるべく基本にのっとった書き方に慣れることで、他の人が書いているプログラムもある程度読めるようになれたら調べるときに助かりそうだと思っています。
0482デフォルトの名無しさん
垢版 |
2019/08/16(金) 00:06:45.60ID:rFeA+cBh
だからさ、そういう疑問を持つってことは
お前なりに考えた別のやり方があるんだろ?
それを書けよ
0486デフォルトの名無しさん
垢版 |
2019/08/16(金) 12:04:34.47ID:agPg59wH
どういう意味や効果があってそうしてるかじゃなくて「一般的」かどうかばかり気にしてるあたりがプログラマ向きの性格じゃなさそう
0487デフォルトの名無しさん
垢版 |
2019/08/17(土) 01:32:10.26ID:hKQWaxIk
iOSのC++の勉強アプリ何個か試してみたんだけど、未だにC++03時代の事までしか教えてないのね。

でも付属の簡易コンパイラはC++17の機能が使えたりする...
0489デフォルトの名無しさん
垢版 |
2019/08/17(土) 11:16:45.62ID:AIpU/gsR
いくら便利なものがあるといってもさすがにC++をナマポや自前RAIIの知識なしで使うのは不可能だから、
初心者は最初はメモリ破壊で苦しんだ方がいいと思うわ
0490デフォルトの名無しさん
垢版 |
2019/08/17(土) 18:58:14.86ID:RHoMoFJP
https://ideone.com/10xlAn
ギャグなんですけど、
これファイル間またいで定義したい時って何か特別な事しないといけなかったでしたっけ?
「日本語C++」書いてみたい人生だった。
0492デフォルトの名無しさん
垢版 |
2019/08/17(土) 19:24:45.74ID:RHoMoFJP
>>491
検証ありがとう。自分はVCなんだけどね。書き忘れてごめん。
VCも無理かな。

最近プリプロセッサは、すたれる流れのようなのでメンテされてないのかなぁ・・・。
0493デフォルトの名無しさん
垢版 |
2019/08/17(土) 20:52:47.23ID:pwn7XyQd
マクロは名前空間に閉じ込めることができないからしょうがない
0498デフォルトの名無しさん
垢版 |
2019/08/18(日) 09:51:15.20ID:aqKQgKLg
もし i == 0 なら
printf(">>497 はちょっと頭悪い");
もしくは
printf(">>497 はちょっと頭弱い");

…なるほど正しいかも

ってそんなわけ無いだろw
0499デフォルトの名無しさん
垢版 |
2019/08/18(日) 10:01:09.98ID:X/aF/qdA
>>80
>Pythonは「CPythonの実装が規格だ」だし

それrubyと勘違いしてないか?
明文化されていない仕様なんてそんなに残っていないと思うが。

あと、MATLABはアカデミック分野では少なくともRやOctaveなんかより
信用されていると思うよ。
0501デフォルトの名無しさん
垢版 |
2019/08/18(日) 10:49:51.48ID:kvaoi5YP
make環境を作ると更新ファイルだけコンパイルしてくれたり、色々便利そうなので
コンパイルコマンド直たたきからmake環境に移行しようと考えています。

下記で正常動作しているので、これでmake環境を作りたいと考えていますが
「c++ make」で検索してもあまり情報がないため苦戦しています。
どのように書けば良いかわかりますか?もしくは参考のURLなどあれば教えていただけないでしょうか。

#!/bin/sh -
export CC=~local/bin/gcc
export CXX=~local/bin/g++

g++ -c -g -Wall -pthread -std=c++11 ./Func.cpp -lm -lz -Wextra -o Func.o &&
g++ -c -g -Wall -pthread -std=c++11 ./Main.cpp -lm -lz -Wextra -o Main.o &&
g++ Main.o Func.o -o main.exe -lz
0504デフォルトの名無しさん
垢版 |
2019/08/18(日) 11:22:19.79ID:aqKQgKLg
>>501
簡単に言えばMakefileに

作ってほしいファイル名: そのファイルを作るのに必要なファイル
(タブ(なぜか空白はダメ))作るためのコマンド

をズラズラ書いておけばいい
なのでその例だと

Func.o: Func.cpp
 g++ -c -g -Wall -pthread -std=c++11 ./Func.cpp -lm -lz -Wextra -o Func.o

Main.o: Main.cpp
 g++ -c -g -Wall -pthread -std=c++11 ./Main.cpp -lm -lz -Wextra -o Main.o

Main.exe: Main.o Func.m
 g++ Main.o Func.o -o main.exe -lz

って書いておいて(わかると思うがg++の前はタブな)
make Main.exe
ってやればいい
毎回Main.exeを指定するのが面倒なら
Main.exe: Main.o Func.m
 g++ Main.o Func.o -o main.exe -lz
の行を一番上に持って行けば make だけで作成できる
(makeは指定がないと最初に見つけた作りたいファイルを作ろうとする)
0505デフォルトの名無しさん
垢版 |
2019/08/18(日) 11:59:20.99ID:XCKtcmfj
>>501
以下の文献とオライリーのGNUmake読んで、あとは自分で考えるのが良い。
http://aegis.sourceforge.net/auug97.pdf
この辺り、まともに理解してる奴が本当に少ないから。
だからconstexprとかboostとかクソみたいなものをありがたがるんだろうなと思う。
0507デフォルトの名無しさん
垢版 |
2019/08/18(日) 12:06:43.92ID:XCKtcmfj
>>506
ビルドと言語機能は綿密に絡み合ってるから。
c++使っててこれだけ当たり前の話を理解できないというのが理解できない。
0508デフォルトの名無しさん
垢版 |
2019/08/18(日) 12:20:14.52ID:aqKQgKLg
> ビルドと言語機能は綿密に絡み合ってるから。
具体例の1つも出せないクズ乙
0515デフォルトの名無しさん
垢版 |
2019/08/18(日) 12:54:48.15ID:rdsOEwya
素のMakefileは最終的なオブジェクトファイルとヘッダファイルの依存関係を書き下すのが大変に面倒臭い
なぜなら、
 Target: Dependencies1 Dependencies2 ...
 (TAB)Command
という記述において、Commandが具体的にTargetお生成しないと事実上立ち行かないので、
インクルードファイルAがインクルードファイルB、Cをインクルードしているという状況を
 A: B C
 (TAB)echo Hello World!
などと書くわけには逝かず、あくまで
 foo.obj : foo.cc A B C
 (TAB)gcc foo.cc
式に.objなターゲットに対して関連付けねばならない
ファイルがあるだけで勝手にヘッダファイルの依存関係を解決させることは
GNU Makeの昨日とシェルコマンドを組み合わせてできた気がするが(忘れた
たかがこれだけのためになんでそんな糞面倒なことをせねばならんのじゃ、というキモス

※ 個人の感想です
0516デフォルトの名無しさん
垢版 |
2019/08/18(日) 13:00:42.47ID:26pp6bRY
Ruby のRake, Thor などのタスクランナーで、コンパイル出来ないのか?

Webpack, Gulp とか
0517デフォルトの名無しさん
垢版 |
2019/08/18(日) 13:02:29.42ID:XgJSnVlI
C++のモジュールシステムはいけてないよね
という話ならわかるが、
constexprとboost?
全く意味がわからねぇ
0519デフォルトの名無しさん
垢版 |
2019/08/18(日) 13:34:10.37ID:jp7+H4+a
一応昔はコンパイル単位がすなわちモジュールとして機能していたはずだったのに、どこで間違えたんだろうな
0520デフォルトの名無しさん
垢版 |
2019/08/18(日) 14:46:24.52ID:aqKQgKLg
>>501
簡単に言えばMakefileに

作ってほしいファイル名: そのファイルを作るのに必要なファイル
(タブ(なぜか空白はダメ))作るためのコマンド

をズラズラ書いておけばいい
なのでその例だと

Func.o: Func.cpp
 g++ -c -g -Wall -pthread -std=c++11 ./Func.cpp -lm -lz -Wextra -o Func.o

Main.o: Main.cpp
 g++ -c -g -Wall -pthread -std=c++11 ./Main.cpp -lm -lz -Wextra -o Main.o

Main.exe: Main.o Func.m
 g++ Main.o Func.o -o main.exe -lz

って書いておいて make Makefile Main.exe
0521520
垢版 |
2019/08/18(日) 14:48:27.09ID:aqKQgKLg
スマン、間違えて二重投稿になっちまった
0522501
垢版 |
2019/08/18(日) 14:57:48.84ID:kvaoi5YP
>>503
CC, CXXは個別インストールしているgccがあり、以前何かのモジュールをインストールしたときに、元からある
/usr/bin/g++
に関連したライブラリパスが使われることがありこれを設定しました。
今回の単純コンパイルには不要かもしれませんが、おまじないで残していました。

>>504
ありがとうございます。
基本はコマンドを並べていけばいいんですね。
何も指定しない時には先頭のものを指定したことと同じになることも参考になりました。

>>505
このあたりもちゃんと理解できるようになりたいです。
少しづつ勉強したいと思います。

>>512
こんなのもあるんですね。
これも調べてみたいと思います。
0523501
垢版 |
2019/08/18(日) 15:01:32.97ID:kvaoi5YP
>>521
いえいえありがとうございます。
まずは単純羅列から入ってCXXFLAGS、OBJS、LIBSなどを使いこなしていこうと思います。
0524◆QZaw55cn4c
垢版 |
2019/08/18(日) 16:31:44.67ID:16gP3sh0
>>512
それらが make に比して優れた点はなんでしょうか?
0525デフォルトの名無しさん
垢版 |
2019/08/18(日) 17:11:35.03ID:ToM84NKx
>>517
横からすまんが意味はわかる
c++はコンパイル時になんでもかんでも解決しようと必死すぎ
フェーズ分けてbinutils使いこなした方が素直と思うことが多々ある
0529520
垢版 |
2019/08/18(日) 19:26:20.54ID:wYOmB27V
>>525
ますます意味わからんw
0531デフォルトの名無しさん
垢版 |
2019/08/18(日) 19:35:39.45ID:ToM84NKx
スキル不足なのに見下してるやつに教えてやる義理はないんだよね
逃げますね
0533デフォルトの名無しさん
垢版 |
2019/08/18(日) 22:23:44.93ID:JoepZ2Id
>>525
国際標準になってないbinutilsなんて使ったら、環境依存でコンパイル通らなくなったりする。
0534デフォルトの名無しさん
垢版 |
2019/08/19(月) 03:39:22.51ID:uhqBoit2
VC++2017で std::string str = "abcd";ってやると
debugモードだとビルドできてるのに
ReleaseモードだとLNK2001エラーが出てしまいます

他に何か宣言かlibがいるのでしょうか
昨日一日この点で一日悪戦苦闘していました

ちなみにプロジェクトはコンソールアプリで
リンカーのシステムは処理の都合上、Windows(/SUBSYSTEM:WINDOWS)にしてあります
0537デフォルトの名無しさん
垢版 |
2019/08/19(月) 07:12:08.46ID:p1963chb
>ファイルがあるだけで勝手にヘッダファイルの依存関係を解決

俺はこれカスタムして使ってます
https://postd.cc/makefile-c-projects/
0538デフォルトの名無しさん
垢版 |
2019/08/19(月) 09:00:35.28ID:uhqBoit2
>>535
いつの間にかReleaseの方ばかり設定いじるというアホなことやらかしてました。
プロジェクトを作り直してソースをコピーすることで解決しました。
0539デフォルトの名無しさん
垢版 |
2019/08/19(月) 09:12:20.21ID:uhqBoit2
VC++2017でコンソールアプリとしてプロジェクトを立ち上げました。
しかし、コンソール(dos窓)を非表示にするべく
構成プロパティのリンカー→システム→サブシステムを
Windows(/SUBSYSTEM:WINDOWS)にしてwindows.hをincludeして
int main(void)からint WINAPI WinMain(void)に変更してビルドすると
「C2731 'WinMain':関数はオーバーロードできません」と言われました。

構成プロパティのリンカー→詳細設定→エントリ ポイントをmainにしてビルドしても
結果は変わらず、int main(void)に戻すと大量にエラーが発生しました。

この場合、どうすればよろしいのでしょう?
0542デフォルトの名無しさん
垢版 |
2019/08/19(月) 09:37:33.04ID:rfX59j2s
>>539
なぜ手でsubsystem変えようとしてんの?
VSのテンプレートそのまま使えばいいじゃん
それができないならその理由を説明すべき
0543デフォルトの名無しさん
垢版 |
2019/08/19(月) 09:40:50.85ID:uhqBoit2
>>540-541
ありがとうございます。
以前ググって見つけたものをだまされたと思って
int WINAPI WinMain(void)から
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* lpCmdLine, int nCmdShow)に
変更したらReleaseモードでも上手くいきました。
でも、元が(void)なんで、引数の設定に釈然としないところありますが…
0544デフォルトの名無しさん
垢版 |
2019/08/19(月) 09:43:45.91ID:uhqBoit2
>>542
普通にやったらどうしても大きなdos窓がしばらく現れるので
(処理の都合上system関数からのexe実行が必要だからです)
ググって調べたらそういう風にいじれと書いてあったからです。
0553デフォルトの名無しさん
垢版 |
2019/08/19(月) 21:23:04.43ID:78Wz1qhX
unifyde call syntax => 邪道。

でも、欲しいのである。
関数型食えると思うんだけどなー。
0554デフォルトの名無しさん
垢版 |
2019/08/19(月) 23:23:04.65ID:ZU65OOaB
バイトデータの比較を高速に行いたいのですが、以下@Aを考えました。
連続したバイトデータを比較するのに下記以外に簡素に書ける方法はありませんか?
memcpyはコピーが発生するのでちょっと遅くなるかなと思っています。

int main(){
unsigned char byte[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
// @1バイトずつ比較
if( byte[2] == 0x03 && byte[3] == 0x04 && byte[4] == 0x05 && byte[5] == 0x06 ){
printf("yes\n");
}else{
printf("no\n");
}
// Aビット演算した結果を比較
if( (byte[2] << 24 | byte[3] << 16 | byte[4] << 8 | byte[5]) == 0x03040506 ){
printf("yes\n");
}else{
printf("no\n");
}
}
0555デフォルトの名無しさん
垢版 |
2019/08/19(月) 23:35:28.83ID:78Wz1qhX
std::int8_t A[]={0,1,2,3};
std::uint32_t* B=(std::uint32_t)A; //care align.

if(*B == 0x03020100){
//yes.
}else{
//no
}
SIMDライクな感じで比較できる気がするけど、おススメはしない。
エンディアン注意。
0556デフォルトの名無しさん
垢版 |
2019/08/20(火) 00:09:06.19ID:C94+kmpU
クヌース-モリス-プラット法とかボイヤー-ムーア法とかやらんかい
ttps://nebuta.hatenablog.jp/entry/20110127/1296115997
0557デフォルトの名無しさん
垢版 |
2019/08/20(火) 01:22:04.58ID:PxgCmY+k
>>554
memcmp とか std::equal とか。速度はどうなるかわからないので推測じゃなくて実測でよろしく。
0560デフォルトの名無しさん
垢版 |
2019/08/20(火) 02:14:14.18ID:HUUEwIaK
>>554
少量のメモリ上の値比較やコピーの処理時間なんて無視できる程度で考える必要もない。
大量のデータの比較を行うとしたら、その大量のデータがメモリ上に存在するために多くの場合はファイルI/Oなり通信なり演算なりしているはずで、そちらのコストの方が桁違いに大きいから単純な比較処理のコストを気にするのは無意味。
ほんとに気にする必要があるのか、まずは確認すべきだろう。つまらない高速化を考えるより、可読性の高い素直なコードを書いた方がいいよ。
0561デフォルトの名無しさん
垢版 |
2019/08/20(火) 13:11:19.02ID:20EaQULd
高速化って言ったら、やっぱりよく使う変数をレジスタに割り当てることが大事だよな
メンバ変数は毎回メモリとやり取りするので遅くなるから
ループ外で自動変数に読み込んでから使うとビックリするぐらい速くなったよ
0564520
垢版 |
2019/08/20(火) 13:57:22.86ID:vf53Ia55
(日記はチラウラに)
0567デフォルトの名無しさん
垢版 |
2019/08/20(火) 14:29:19.64ID:aHZAynoR
よくあるような、
if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') ||
  c == '_' ) {
 ・・・
}
の部分を、条件jmp文が少しでも少なくなるようにと思って、
予め作成しておいたテーブル(配列)を使って、
if ( eiji_or_underscore[c] != 0 ) {
 ・・・
}
として実測してみたところ、何度計測しても後者の方が遅くなった。
アセンブリコードを見てみても、前者だと5つの条件jmp命令、後者だと1つの条件jmp命令と、
後者の方が命令数が少なくっていた。しかし、前者だと、レジスタとcmp命令を使っていたが、
後者だとグローバル変数の配列を読み出しに行っていた。

最近のCPUは非常に複雑で高度な「分岐予測」をしていて、配列は読み出してみないと
値が分からないので、「予測」ができず、分岐予測の「予測間違い」がおきるが、
レジスタをcmpで比較する場合には予測が出来るためだろうか。

しかし、昔より最適化する際にどっちが高速になるかの予想が難しくなってしまってる。
0568デフォルトの名無しさん
垢版 |
2019/08/20(火) 14:39:39.94ID:aHZAynoR
>>567
誤:if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') ||
正:if ( (c >= 'A' && c <='Z') || (c >= 'a' && c <='z') ||
0570デフォルトの名無しさん
垢版 |
2019/08/20(火) 14:48:01.70ID:lOKfo+mN
最近の環境では「実測」の信頼性確保も、また難しいです。
なぜかある時には何度測定しても遅いのに、あらためて別の時に
測ると速く出る事があったりします。
0573デフォルトの名無しさん
垢版 |
2019/08/20(火) 15:08:33.40ID:aHZAynoR
理論上は、メモリがキャッシュに乗っている限り、メモリの読み書きとレジスタ
への読み書きの速度は同一です。

ただし、メモリとメモリは add, sub, mov 命令で2つのオペランドに同時指定は
出来ないのに対し、レジスタは出来るので、確率的にレジスタの方が必要な
命令数が少なくて済むので高速になる場合があります。
あとキャッシュに乗って無い場合はメモリは遅くなります。
0575デフォルトの名無しさん
垢版 |
2019/08/20(火) 15:23:45.52ID:hCU5dYnH
あ、すまん俺の方が間違えてた・・
まさかとは思うけど最適化してないとか無いよね
0576デフォルトの名無しさん
垢版 |
2019/08/20(火) 15:29:52.16ID:lOKfo+mN
>>575
最適化はどちらも同じオプションでしてますし、出力されたアセンブリ・コード
も見て、テーブルを使った方が命令数の少ないコードになっていることも
確認してます。条件jmp命令も少なくなっています。
0577デフォルトの名無しさん
垢版 |
2019/08/20(火) 15:30:02.90ID:hCU5dYnH
あと前者のコードは与えたcの値がA-Zだと分岐の回数2回で済むからじゃないかね
0578デフォルトの名無しさん
垢版 |
2019/08/20(火) 15:36:01.76ID:aHZAynoR
>>577
実はその影響もあると思っているのですが、それだけだと前者の場合には、
命令数から言えば1〜2クロックほど速くなる場合がある程度です。
しかし、実測してみると、後者のやり方の方がもっと遅くなっている
ようなんです。

面倒ですが、マクロスイッチでコードを切り替えられるようにして
短時間の内に二つを切り替えて速度比較してみようかと思っているところです。
0580デフォルトの名無しさん
垢版 |
2019/08/20(火) 16:13:18.12ID:hCU5dYnH
テーブルがキャッシュに乗ってなかったり、
>>561と同じでテーブルがグローバル変数だと書き換えを懸念して最適化ぎ抑制されてんじゃないかな
0582デフォルトの名無しさん
垢版 |
2019/08/20(火) 16:23:55.23ID:lOKfo+mN
マクロスイッチ切り替え方式にして、ほぼ同時に両方を測定してみたら、
テーブル方式の方が速くなっていました。
0584デフォルトの名無しさん
垢版 |
2019/08/20(火) 17:25:38.94ID:lOKfo+mN
>>580
アセンブリコードを見る限り、特に問題なく、人間が単純に書いた場合
と似たようなコードになっています。

ただし、一点、テーブルの c 番目の要素を参照する際、バイト整数の c
をゼロ拡張して32BIT 整数にする必要があるのですが、自分の使ってるVC++
だと、movzx 命令を使わずに、xor eax,eax; mov al,cl のように2命令
を使ってしまっている点が、人間が最適化するより遅いコードになってしまって
います。
0585554
垢版 |
2019/08/20(火) 18:34:23.13ID:4t2XBONQ
コメントありがとうございます。

>>555
エンディアンを気にしないといけないのは後々分かりづらくなりそうですね。。

memcmpというのがあったんですね。
連続バイト比較ができてシンプルで良さそうです。
これを使ってみます。
0586デフォルトの名無しさん
垢版 |
2019/08/20(火) 19:55:32.24ID:otgnf5aI
volatile命令の他にキャッシュ命令とか無いのかよ
ルックアップテーブルをキャッシュに載せときゃ爆速じゃん
もっと言えばテーブルを石に焼いた時一番早い
0587デフォルトの名無しさん
垢版 |
2019/08/20(火) 22:55:27.89ID:C94+kmpU
>>569
>分岐予測はデータの内容関係ないやろ
分 岐 予 測 は デ ー タ の 内 容 (統計的偏り) に 関 係 あ る

>>567
最近のCPUは黒魔術で製造されているからミクロな最適化を下手に人が手を加えるより
単純なアルゴリズムにした方が速いことが多くなた
印象
0589デフォルトの名無しさん
垢版 |
2019/08/21(水) 01:15:10.83ID:X4j3osk/
多分メモリが読めてない状態でも分岐予測して投機的実行はするんじゃないかな
近代的なCPUは
0590デフォルトの名無しさん
垢版 |
2019/08/21(水) 05:42:53.52ID:Vc3YPkYv
>>567の前半部のコード
>if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') ||
>  c == '_' ) {
> ・・・
>}
はCPUレベルの分岐予測+投機的実行では入力データによっては速度向上し難いケースがある
 AaZz_AaZz_AaZz_....
という入力を考えたらワカル(cといして1文字入力される度に||か&&を打ち切る分岐箇所がちがーう
分岐予測キャッシュというのは分岐命令1個につき1状態か2状態記憶がせいぜい(しかもLRU式に記憶が消える
のでこのような場合は投機的実行結果が捨てられ続けかねない

>>598
ハイ論破

>>589
分岐予測と投機的実行が効力を発揮するのは多重ループで内側の分岐条件が大部分の時間変わらないというケース
0591デフォルトの名無しさん
垢版 |
2019/08/21(水) 05:59:08.65ID:Vc3YPkYv
ちゅか&&や||の条件式に関数呼び出しが含まれない単純なケースにおいては、
OoOと分岐予測を備えた今日日のCPUでは途中で打ち切るより全部評価してしまった砲が速い可能性がおおきい
このとき問題になるのは副作用のある式が問題であり、
副作用がある++や--があると、やっぱ言語規格どおり||や&&は条件成立で打ち切らないとソースコードに書かれた気体動作と
オブジェクトコードの動作が別物になってしまうので諸悪の根源
C言語を引きずった仕様のままでは時代について逝けてない

Rustで++や--を式の中で使えないのは故無きことでは無いんじゃ…
0594デフォルトの名無しさん
垢版 |
2019/08/21(水) 07:20:20.39ID:6njIT3pF
>>590
> (しかもLRU式に記憶が消える
知ったか乙
せめて
https://ja.m.wikipedia.org/wiki/分岐予測
くらいは読んでこい

> のでこのような場合は投機的実行結果が捨てられ続けかねない
そりゃ頑張って作れば最悪の状況は作れるよw
だから何?って話だが
0595デフォルトの名無しさん
垢版 |
2019/08/21(水) 10:08:42.06ID:yoKe7uXb
>>590
そういう安価ミスはちゃんと訂正しろよ
あと反論になってない
語弊はあったろうけど配列だから分岐予測が効かないなんて話はないだろうと言いたかっただけだ
0596デフォルトの名無しさん
垢版 |
2019/08/21(水) 20:40:17.99ID:fYY/XStv
>>586
1バイトの即値データとの比較の方が速いに決まってんだろ。
命令デコードする段階で比較対象のデータとってこれるんだから
0597デフォルトの名無しさん
垢版 |
2019/08/21(水) 22:54:56.30ID:Vc3YPkYv
>>594
リンク先のどこにLRUでは無いと書いてあるんじゃ…
分岐予測キャッシュがあふれたときはLRUが基本
これは2次キャッシュを儲けても関係ない(それぞれの中で溢れたらLRU
むしろハードウェア実装の制限でLRUより性能の落ちるしくみを使うこともある
が(nウェイセットアソシアティブの「アソシアティブ」部分は一部アドレス線の固定解釈による簡素化

>>595
分岐予測が性能を発揮しない例が有る以上ハイ論破の訂正の必要は認められぬ
0598デフォルトの名無しさん
垢版 |
2019/08/21(水) 23:02:56.86ID:Vc3YPkYv
もし分岐予測制度を上げるためのキャッシュエントリのn状態化とキャッシュが溢れた場合の話を
混同しているんだとしたらきわめておめでたい話だといえる

あるアドレスの分岐命令に対応するキャッシュエントリがどの状態に居たとしても、
そんあことはお構いなしに溢れたときはどれかのエントリが消される.。
このとき他の制約が無ければ理想解はLRUという話
0599デフォルトの名無しさん
垢版 |
2019/08/21(水) 23:16:22.08ID:Vc3YPkYv
ていうか
>1状態か2状態記憶がせいぜい(しかもLRU式に記憶が消える (>>590
とまで書いたのだからキャッシュエントリのn状態化は機知の前提で話していることぐらいは読み取って
ホスイ
(雑駁なリンク先を示すよりはむしろ「1状態って何だよ2状態だろパーカwwwwwww」ぐらいの反応であれば>>594は知性を疑われずに済んだ
0600デフォルトの名無しさん
垢版 |
2019/08/21(水) 23:18:51.67ID:yoKe7uXb
ただのこじつけじゃねーか
てかそんだけ御託並べて質問者へのアドバイスはゼロかw

(というかこいつの論調どっかで見たな・・・)
0601デフォルトの名無しさん
垢版 |
2019/08/22(木) 00:05:50.83ID:F37ex36A
>>597-599
分岐予測はキャッシュじゃねーぞw
反論するなら分岐予測にLRUアルゴリズムを使ってる奴はCPU挙げてみな
0602デフォルトの名無しさん
垢版 |
2019/08/22(木) 10:59:48.20ID:36M5lMYO
いや、まてまて、そもそも今の話は、分岐予測の精度は関係無いのでは?

>「配列は読み出してみないと値がわからないので、予測が出来ず」

がおかしいって話でしょ
精度はともかく、分岐予測はするでしょ
というか、逆に、値が分からないから分岐予測するようなもので

分岐予測の精度に関しても、if文のかっこの中の計算が終わってない状態で
適当にジャンプするのは同じでしょ、配列が読めてようが読めてなかろうが
0603デフォルトの名無しさん
垢版 |
2019/08/22(木) 11:58:47.76ID:Vlc++9B2
そりゃー予測なんかせず配列まるまる全部をキャッシュに乗せるから早いんだろ
つまり予測しないルックアップテーブルの時が一番早い
そのテーブルがCPUに焼きこんであればもっと早い
0604デフォルトの名無しさん
垢版 |
2019/08/22(木) 13:09:16.96ID:36M5lMYO
いやだから、ルックアップテーブルの結果を受けて分岐する話なんだから・・
おかしなこと言うな
0606デフォルトの名無しさん
垢版 |
2019/08/22(木) 15:51:21.48ID:eMNxtHht
多くのCコンパイラがサポートしてるquadmath (__int128とか__float128とかその関数)がかなり便利なのですが、なぜこれはC++の標準の機能にならなかったのですか?
0607デフォルトの名無しさん
垢版 |
2019/08/22(木) 18:02:39.65ID:/5icwwgo
殆んどのハードでの実装がソフトで遅いし、需要も少ない
使いたきゃboostにあるし

標準化されるとしたら、x86とかでハード実装された後に標準型として対応するんじゃね?
てかlong doubleがワケわからんことになっているのをどうにかしろと
0608デフォルトの名無しさん
垢版 |
2019/08/22(木) 18:28:45.94ID:6PHJNtSf
'A' から 'Z と 'a'から'z' は連続した文字コードである
ここにcpuの速度の秘密がある はず
0610デフォルトの名無しさん
垢版 |
2019/08/22(木) 20:52:16.00ID:KKaRKvsP
>>606
大型計算機にすら倍々精度をハードウェアで扱ってないもんな
命令体系は用意されてるけど
ソフトで十分ってこった
0619デフォルトの名無しさん
垢版 |
2019/08/22(木) 22:59:39.88ID:ywV62E2Z
そういう話じゃない。
金融計算では10進数のどの桁でどういう丸めを行うか決まっているから、
その通りの結果になることが「誤差がない」状態なんだよ。
0621デフォルトの名無しさん
垢版 |
2019/08/23(金) 00:16:10.19ID:/B94cENN
>>611
畳み込み和の計算はフーリエ変換して求めておいて最後に逆変換することで高速化できます (畳み込み定理) が、しばしば誤差の増大がネックになります
こういう問題で出てくる整数はとても大きいということもあります
だから巨大な数を普通に扱いたいのです

数論変換 (整数環上でのDFT) をすれば良いのですが、もっと単純化できないかという試行錯誤です
0622デフォルトの名無しさん
垢版 |
2019/08/23(金) 00:39:49.78ID:CmTDylN7
蒸し返すようですいませんがGNU Makeに取って代わるデファクトスタンダードなビルドシステムってCMakeじゃないんですかね
0624デフォルトの名無しさん
垢版 |
2019/08/23(金) 21:07:50.69ID:1CEPBqe0
>>622
取って代わるというかmakefileをつくるメタビルドツールって方が認識として正しい。
実際cmakeでwindowsでもlinuxでもビルドできるように設定するのはマジ辛いぞ。
0625◆QZaw55cn4c
垢版 |
2019/08/23(金) 21:29:52.90ID:NZyGR+Pl
>>624
そういうのは windows 用と linux 用にわけるんじゃないでしょうか?
0626デフォルトの名無しさん
垢版 |
2019/08/23(金) 21:30:32.32ID:9XBmxzHo
CMakeもAutoconfなんかと比べたら簡単になったんだろうけど、自分で書くならgypだな。
0629デフォルトの名無しさん
垢版 |
2019/08/23(金) 23:21:07.68ID:LHN2h0YB
automake/autoconfに慣れたからcmakeいらんわ
うまくクロス環境みつけてくれないこと多いし
0630デフォルトの名無しさん
垢版 |
2019/08/24(土) 09:02:17.39ID:u6taJwr5
>>625
cmakeとかautomake系のツールのコンセプトはできるだけ分けないで書けるように
ってところではあるが、まあ実際はそれぞれの環境用に色々やるのと大して変わらん。
少なくともデバッグするときはその環境毎のビルドがわかってないとほぼ詰むし。
なんだかんだでまずlinux系統でmakeになれるのが近道だとは思うけどね。
あれでヘッダー依存の取り扱いがしっかり書けるようになれば大抵のビルドシステムにも慣れるだろう。
0631デフォルトの名無しさん
垢版 |
2019/08/24(土) 09:18:12.19ID:+PLwcW2w
最終的にクロスプラットフォームでちゃんとやれることを目指すならmakeもmsbuildも
両方押さえておかなければならないわけで、どっちが先ってことはないと思うがな。
0634デフォルトの名無しさん
垢版 |
2019/08/24(土) 22:40:38.50ID:+PLwcW2w
- >>630>>632に話の脈絡が全くない
- >>632 べつに楽な方から始めるのが良いという根拠もない
- というか>>630はmakeがわかれば他はもっと楽だという、逆のニュアンスだったんじゃないの?
- そもそもmsbuildの情報もMSDNで簡単に調べられるし

ツッコミどころ多すぎ。

>あれでヘッダー依存の取り扱いがしっかり書けるようになれば

いまどきlinuxでもそんなん手書きする奴はいないw
0635デフォルトの名無しさん
垢版 |
2019/08/25(日) 12:27:30.33ID:haXU+hCF
makeじゃなくてmsbuild教える方がいいと思うならお前はそうしろ。
それが本当にいいと思ってんならな。
俺だったらmakeを教えるというだけの話だ。
0636デフォルトの名無しさん
垢版 |
2019/08/25(日) 14:08:01.24ID:Nf3A65/V
また支離滅裂なw
makeとmsbuildの優劣なんて話はしてないんだが、日本語不自由なのか?

>少なくともデバッグするときはその環境毎のビルドがわかってないとほぼ詰むし。

という理由でmakeを覚えなければならないと主張するなら、同じ理由でwindows環境向けには
msbuildを覚えておかなければ片手落ちだろうと指摘しただけ。

まぁどうせ上の理由も後付けで、cmakeを知らない爺が横からmakeを布教しようとしただけなんだろうが。
0638デフォルトの名無しさん
垢版 |
2019/08/25(日) 15:51:39.75ID:hTkFprTS
手で触るもんじゃないけど
一度手で触っておかないと吐き出されたmakefileを見て何がおかしいか理解できない
0639デフォルトの名無しさん
垢版 |
2019/08/26(月) 11:17:55.70ID:mep62E1y
std::condition_variableを使って複数のスレッドが待ち状態の時、
notify_oneで一つだけスレッドロック解除した場合、解除されるスレッドに優先度はある?
例えば、一番最初に待ち状態に入ったスレッドのロックが解除されるとか。
それとも完全に実装依存?
0640デフォルトの名無しさん
垢版 |
2019/08/26(月) 16:25:41.54ID:yDrui9+d
notify_one使ったことないけど解説読む限り実装依存に見える(待機中のスレッドからいずれか一つ、とかあるし)
順序あるならそう書かれると思う
曖昧ですまんけど
0642デフォルトの名無しさん
垢版 |
2019/08/26(月) 20:31:47.24ID:bJVhcqWX
俺は多分カーネルのスレッドのスケジューリングで
たまたま選ばれたやつが走ると思う
しらんけど
0643デフォルトの名無しさん
垢版 |
2019/08/26(月) 22:58:04.80ID:ZsUTwn4r
流れ読まずに申し訳ございません、質問させてください。

非エンジニアのものなのですが、下記のようなオープンソースのコードを使って
メッセージのウェブアプリケーションを創ってみたいのですが、
一番手っ取り早い方法はどういう方法でしょうか?

漠然とした質問で申し訳ございません

▶Telegram
https://telegram.org/apps#source-code
▶Signal
https://github.com/signalapp
▶Rocket Chat
https://github.com/RocketChat/Rocket.Chat
▶Tox
https://github.com/Tox/tox.chat
▶Wire
https://github.com/wireapp/wire
0645デフォルトの名無しさん
垢版 |
2019/08/26(月) 23:21:58.15ID:h9DDya56
>>636
お前ほんとにmsbuildいじったことあるのか?
あんなクソなものを本気で使ってんの?
てかヘッダ依存解決くらい書けなきゃまともなビルドシステムなんて絶対組めねーよ。
こういう誤誘導を平気でするやつってどういう神経してんだろうな。。
0647デフォルトの名無しさん
垢版 |
2019/08/27(火) 00:16:27.36ID:tgTbqYO8
最近C++を学び始めたのですが、
テンプレート引数の型をコンパイル時に文字列に変換する方法ってあるのでしょうか?

できればテンプレートの特殊化やプリプロセス命令を使わずに以下の用な感じでかければよいのですが

template<typename Type>
class Hoge
{
public:
static constexpr char* Text = Typeを文字列に変換して納入したい
};
0648デフォルトの名無しさん
垢版 |
2019/08/27(火) 00:31:42.36ID:EWBBAhUG
無理ゲー
あくまで自動にこだわるならtypeid使え。
自作クラスだけならクラス名を名乗るメンバ関数でも作っとけ
0650デフォルトの名無しさん
垢版 |
2019/08/27(火) 08:26:10.70ID:CO6EoWnq
>てかヘッダ依存解決くらい書けなきゃまともなビルドシステムなんて絶対組めねーよ。

いつの時代から来たんだよw
ソースに #include 書く度にいちいちMakefile書き換えんのか?
0652デフォルトの名無しさん
垢版 |
2019/08/27(火) 17:31:34.79ID:icKeAJ7/
>>649
以前nameofとかいうライブラリ?が同じくgithubにあったけどどっちが便利かな
というかこの手のは他にもあるっぽいな

>>651
いや合ってると思うけど
ウェブなのかネイティブなのか、多分ごっちゃになってるだろうからまずそこを指摘すべき
0653デフォルトの名無しさん
垢版 |
2019/08/27(火) 18:46:31.35ID:idJxRw9J
別にウェブだからって既存のブラウザ上で動くものという定義はあるまい
サーバーサイドもクライアントサイドも両方C++で作ればいい
そもそもブラウザだってC++で作られているんだから
0656デフォルトの名無しさん
垢版 |
2019/08/28(水) 08:42:46.33ID:4Zzob7TG
>>650
書き換えなくていいように書けるようにするってことだよバカ。
てか依存をしっかり見るって意味じゃヘッダを意識するってのは
相当大事なんだがな。
タスク管理を意識した場合、どんなレイヤーで仕事する場合でも重要になる。
0657デフォルトの名無しさん
垢版 |
2019/08/28(水) 08:50:01.49ID:4Zzob7TG
てか想像以上にビルド周りの技術ってc+11から入った輩は理解してないのな。。
またクソシステムの再生産が10年単位で続きそうだわ。。
0658デフォルトの名無しさん
垢版 |
2019/08/28(水) 10:10:28.35ID:mAC2Cq6c
そりゃこのスレでも
「閃いた!stdを usingすれば文字を打つのが少なくなるよ!」って宣う輩がいるくらいだし
0659デフォルトの名無しさん
垢版 |
2019/08/28(水) 10:16:52.21ID:FUc/M6fg
趣味でc++のパズルにはまってる人と
仕事で生産的に使いたい人とでは
言語に期待するものが違うからね
区別しないと
0660デフォルトの名無しさん
垢版 |
2019/08/28(水) 10:25:14.14ID:4pdYY7R1
このビルド周りのクソ仕様のせいで年々インタプリタ型に人が流れていくんだわ
0663デフォルトの名無しさん
垢版 |
2019/08/28(水) 14:10:32.76ID:DpQqY3bZ
そのうちC++ライブラリ用リポジトリとかC++用パッケージマネージャとか作りはじめそう
0664デフォルトの名無しさん
垢版 |
2019/08/28(水) 15:22:40.67ID:A/ckRNOE
車輪の再発明が好きなやつが多すぎてウンザリする
道具ばっか作ってどうすんだ
道具つかって絵描いたり家建築したりするのが仕事なのに
0666デフォルトの名無しさん
垢版 |
2019/08/28(水) 18:52:20.58ID:r3MNaUf0
makefileなんて十数年触ってないしもう忘れたけど
>>656-657には同意するわ
依存関係も考えた上で設計&利用しないとコンパイル時間の増大とかに全く対処できなくなる
新しい機能には飛びつくわりに古い部分(しかも無くなってるわけではない)をおざなりにするのはあかん
0668デフォルトの名無しさん
垢版 |
2019/08/28(水) 20:42:39.92ID:G5Ue/9b7
>>656
これ、依存関係を自分で書くんじゃなくて gcc -M とかで自動的に判断させることを言っているんだろうか?
msbuildを含めて今どきの大抵のビルドシステムでできることなんだが。
0669デフォルトの名無しさん
垢版 |
2019/08/28(水) 20:46:54.49ID:W4Wf3gf+
>>649
こんな良いライブラリーがあるんですね。
非常に助かりました。ありがとうございます!
0670デフォルトの名無しさん
垢版 |
2019/08/28(水) 20:59:56.83ID:4Zzob7TG
>>668
makeが実装が一番ネイティブでわかりやすいってことだよ。
bazelなんか中身はもろにmakeだろありゃ。
ただはじめからbazel使ってたらエラーメッセージ見てもわからんだろうし、
そういうのをはじめに薦める奴は詐欺だろ。
0671デフォルトの名無しさん
垢版 |
2019/08/28(水) 22:02:26.02ID:ieioKQ06
makeがネイティブ?わかりやすい?冗談だろ
暗黙ルールとか特殊変数とか特別扱いのターゲットとかやめろ
アーカイブだの何だのを勝手に推定しておせっかいな処理挟み込むのを全部やめろ
積もり積もったウンコの山を無効にさせろ
0674デフォルトの名無しさん
垢版 |
2019/08/28(水) 22:33:45.39ID:4Zzob7TG
>暗黙ルールとか特殊変数とか特別扱いのターゲットとかやめろ
まあこれはわかる。

>アーカイブだの何だのを勝手に推定しておせっかいな処理挟み込むのを全部やめろ
これは逆に暗黙のルールを使ってるからだろ。

基本的に明示的なmakefileを書いてないのが原因だが、
こんなこと言い出したら他のビルドツールなんて使えんぞ。。
vc compilerなんかもっと暗黙の設定まみれだわ。
0675デフォルトの名無しさん
垢版 |
2019/08/28(水) 23:47:07.56ID:atkmfnSl
マルチプラットフォームで使えて、固定小数点を扱えるOSSっていいのないかな?
0679デフォルトの名無しさん
垢版 |
2019/08/29(木) 21:47:21.89ID:81mive3+
使われていないクラスのstaticメンバ変数って生成されないのでしょうか?
0681デフォルトの名無しさん
垢版 |
2019/08/29(木) 23:00:42.76ID:KkrIMV0W
>>679
多分生成される可能性が高いね
何故ならC++にはコンストラクタがあるから
つまりはstatic変数のコンストラクタで何かしているかもしれないだろう
だからリンカの最適化は削除をしないだろうね
ただ、普通のintとかだとリンカの最適化で削除されるかもしれないけど
まぁ運しだい
ともかく、規格では多分決まってない
0682デフォルトの名無しさん
垢版 |
2019/08/29(木) 23:20:08.64ID:xxmh5CSn
>>679
そのstaticメンバの定義を消してコンパイルしてもエラーにならなければ生成されてない
ちなみにstatic constとかの変数は元々ほとんどのケースで生成されてない
0684デフォルトの名無しさん
垢版 |
2019/08/29(木) 23:29:30.27ID:KkrIMV0W
クラスのstatic変数といっても
コンパイラからしたらグローバル変数みたいなものだからな
使ってないグローバル変数は削除されるのか?
さあな
0685デフォルトの名無しさん
垢版 |
2019/08/29(木) 23:33:23.53ID:xxmh5CSn
visual sutdioというかvc++だと使ってないコードを削除するみたいなオプションあったからもしかしたら消えるかもしれない
他はよく知らない・・・
0686デフォルトの名無しさん
垢版 |
2019/08/30(金) 00:11:27.74ID:fVqdV4kl
libにしなかったらlinkしたobj全て
libにしたらobj単位でシンボル一つでも参照があればlinkされるのが基本じゃね
組み込み用のコンパイラだとそれ以上に頑張ってサイズ削ることもあるだろうけど
0687デフォルトの名無しさん
垢版 |
2019/08/30(金) 00:41:24.99ID:pQR0WkIg
グローバル変数のコンストラクタに起動時処理書いといたら、これが案外呼ばれるタイミングがわからない。
手続きの中で明示的に参照しにいかないとあかんと思った。
0690デフォルトの名無しさん
垢版 |
2019/08/30(金) 00:56:53.55ID:8Dc5lx9D
一見使ってないからと言ってコンパイラが勝手にデータ構造替えちゃったら動的リンク時とか整合性取れなくなっちゃう気がする
0691デフォルトの名無しさん
垢版 |
2019/08/30(金) 08:30:00.34ID:Okk0GWIA
動的ライブラリが元のバイナリの変数を暗黙に触るかはOSによる。
linuxは触れるがmacは触れない。
0692デフォルトの名無しさん
垢版 |
2019/08/30(金) 21:41:54.95ID:OdSxakdr
std::string="あいう";

c++って内部的な文字コードって何になるのかな?
あといまいちwstringの使い分けがわかんない、日本語だとwstring使えばいいのか?
0696デフォルトの名無しさん
垢版 |
2019/08/30(金) 22:18:34.99ID:QpJdGFlG
sringの中の文字コードは入れた文字列の文字コード
普通の文字列リテラルの文字コードはそのソースコードが書かれたテキストの文字コード
文字列リテラルはu8などのプレフィックスをつければUnicodeになる
0699さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/08/30(金) 22:23:12.28ID:ZMew/+Uj
コンパイラによって日本語シフトジスなどのマルチバイト文字列の解釈が違って移植の際にトラブることがある。
0706デフォルトの名無しさん
垢版 |
2019/08/31(土) 12:17:38.05ID:WtWTaSD6
char型および文字列リテラルが何になるのか不定なのがアレなので
もうさいしょからu8""とchar8_tとstd::u8stringを使うように徹底するのは良いのかもしれない
0707デフォルトの名無しさん
垢版 |
2019/08/31(土) 13:49:09.93ID:gI08UaXy
WindowsはTCHARで書くべしみたいなのはまだあるの?
最近Windows使ってないもんでよく分からん
0710◆QZaw55cn4c
垢版 |
2019/08/31(土) 15:03:47.82ID:iA1eP3Lu
>>709
ファイルシステム関係は uft16 で、それ以外は utf8 で分けるしかないでしょうね、"ファイルシステム uft16" はやったことがありますが、utf8 はまだ触ったことがありません…
0711デフォルトの名無しさん
垢版 |
2019/08/31(土) 18:44:11.09ID:IP14yh++
utf8は冗長コードの問題があるから内部処理用コードには向かないんだよね。
0713デフォルトの名無しさん
垢版 |
2019/08/31(土) 18:54:01.60ID:IP14yh++
そうかな、場合にもよるけど、日常使う文字はほぼutf16に収まるし、
utf8だとstd::regexで日本語がまったくつかえないとかあるしで、
俺的にはutf16の方が便利かな。
0716デフォルトの名無しさん
垢版 |
2019/08/31(土) 19:34:37.71ID:oexy9R6b
絵文字はみんなサロゲートペアだもんな
あれのおかげでようやく欧米人どもが真面目にUnicode対応するようになった
0718デフォルトの名無しさん
垢版 |
2019/08/31(土) 21:55:55.82ID:OiY9nyzL
絵文字はやめてほしいわ。そもそも架空の文字は登録しないんじゃなかったのかよ。
21bitも使えてコードポイントに余裕があるからといってロクなことしない。
0726デフォルトの名無しさん
垢版 |
2019/09/01(日) 21:56:38.21ID:csfeG7d1
文字列なんか一番基本的な物の一つなんだから
もっと簡単でもよかったのにね
0729デフォルトの名無しさん
垢版 |
2019/09/03(火) 08:08:26.56ID:/7AcGg3i
オブジェクト指向の3大要素をすべて満たしたプログラム作れって課題なんだけど、じゃんけんでいいかな?
0735デフォルトの名無しさん
垢版 |
2019/09/03(火) 16:47:41.46ID:WZskrpAp
チャットを作ると

カプセル化:ネットワーク部分、チャット部分
継承:継承元からサーバクラス派生、クライアントクラス派生
仮想:TCPクラス-UDPクラス切り替え

完璧じゃね?
0736デフォルトの名無しさん
垢版 |
2019/09/03(火) 17:14:42.83ID:xpzn8aWg
別にじゃんけんだっていいだろ

継承:手の種類
多態性:手の画面出力
カプセル化:しわの数
0737デフォルトの名無しさん
垢版 |
2019/09/03(火) 18:12:16.81ID:S+eQGM/g
タイマーで早出し遅出しの判定とか
ネットワーク対戦機能とか
履歴取ってプレイヤーの手の傾向学習してくるAIとか
色々盛り込んでみればいい
0739デフォルトの名無しさん
垢版 |
2019/09/03(火) 20:42:17.04ID:O03sdIlG
期限が金曜だからあんまり凝ってる時間はないかな。クラス図とシーケンス図とオブジェクト図も作んなきゃいけないし
結局ケイスケホンダのジャンケン作ることにした
0740デフォルトの名無しさん
垢版 |
2019/09/03(火) 21:36:59.59ID:VgehgunL
>>734
三大要素というとよくそんな風に言われるけど、実のところ継承ってオブジェクトの要素とは
言い難いし、多態も要素というより結果として得られる性質に近いと思うんだよなぁ。
0742デフォルトの名無しさん
垢版 |
2019/09/04(水) 09:05:55.41ID:42AhKM7p
>>728
コードポイントで合ってるはず。
文字符号の1つずつの番号の場所をコードポイントと言う。
例えば、ASCIIコードなら、A の文字の番号である 0x41 の占めている
場所みたいなニュアンスがある。
0743デフォルトの名無しさん
垢版 |
2019/09/04(水) 09:20:24.49ID:42AhKM7p
>>742
追伸。なお、0x41の番号そのもののこともコードポイントと言う。
番号に就いては単に「コード」とも言うが、2019年現在において
単に「コード」と言ってしまうと、プログラムの内の命令が並んでいる
部分のことを指すことが多くて混乱が生じやすいので、文字符合の
番号に対しては、「コード」ではなく「コードポイント」という
ことがある。「文字符号」と言ってしまうと、ShiftJISの体系そのもの、
UnicodeやUTF8の体系そのものを指すことも有り、どうしても曖昧さが残る。
そこで、0x41という番号そのものの事を言っていることを曖昧さなく
示したい場合には、文字符号ではなく「コードポイント」ということがある。
0744デフォルトの名無しさん
垢版 |
2019/09/04(水) 10:36:53.55ID:BMbMsP6d
int (*exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT;

上記はtypedef struct内に書かれていた関数ポインタの宣言で、
返り値がint、引数が(struct bContext *, struct wmOperator *)の関数ポインタexecなのは分かりますが
最後のATTR_WARN_UNUSED_RESULTって何でしょうか? 関数宣言って引数宣言の後に何か書けましたっけ?
0747デフォルトの名無しさん
垢版 |
2019/09/04(水) 12:57:05.98ID:/jMgnxhx
いくつか用意した文字列の中から1つをランダムで表示するってどうやればいいかな?
0749デフォルトの名無しさん
垢版 |
2019/09/04(水) 18:37:03.73ID:A7beDSD/
std::minstd_rand mr
std::uniform_int_distribution<> ui(0,StrS.size()-1);

StrS[ui(mr)];//<- what?

大雑把にこういう感じ?
0752デフォルトの名無しさん
垢版 |
2019/09/04(水) 23:10:27.71ID:3YkDCQ2q
>>747
#include <stdio.h>
#include <stdlib.h>
#define STR_MAX 5
const char *pszText_s[STR_MAX] = { "aaa", "bbb", ・・・・・・・ };
int main() {
 int  idx = (int)( ((float)rand()) * STR_MAX / RAND_MAX );
 printf( "mojiretsu = %s\n", pszText_s[idx] );
 return 0;
}
0755デフォルトの名無しさん
垢版 |
2019/09/04(水) 23:29:14.08ID:3YkDCQ2q
なぜCで済むのにC++を使おうとするのか。
何のメリットがあるのか。
基礎が大事。
0757デフォルトの名無しさん
垢版 |
2019/09/04(水) 23:33:21.57ID:3YkDCQ2q
そもそも基本的にCもC++の一部なのでC風に書いたものはC++の回答としても
間違いではない。
「C++でのやり方」と言ってもC++は歴史が長いため、色々なやり方がある。
また最新の仕様を使うことがベストな選択とは限らず、むしろ分かりにくく
なることも多い。
0759デフォルトの名無しさん
垢版 |
2019/09/04(水) 23:36:41.47ID:HOiCfRXh
> また最新の仕様を使うことがベストな選択とは限らず、むしろ分かりにくく
> なることも多い。

自分がわからないだけでしょ
0760デフォルトの名無しさん
垢版 |
2019/09/04(水) 23:36:50.55ID:3YkDCQ2q
C++ は、もともとCにclassの概念を追加したものと言われている。
今回の様にclassを使うメリットが無い場合は、C++の内、
昔からあるCの部分で十分である。エンジニアリングの世界では
「simple is best」
だ。
0761デフォルトの名無しさん
垢版 |
2019/09/04(水) 23:38:38.42ID:3YkDCQ2q
>>759
新しい機能はC++委員会が好き勝手に追加しているだけで、
学ぶ意味が無い。
しかも、あなたも分かってないのに、人を馬鹿にするのはいかがなものか。
まずは動くコードが大事で、最新のやり方を使うことは重要ではない。
変に難しくしても意味がない。
0765デフォルトの名無しさん
垢版 |
2019/09/04(水) 23:57:17.61ID:twmgvXS9
Cで書いてもええけど

> ((float)rand()) * STR_MAX / RAND_MAX );

この乱数に対する意識の低さがくそ
0766デフォルトの名無しさん
垢版 |
2019/09/04(水) 23:58:00.42ID:8IyIvdim
rand()なんか使ってる時点で商用ソフト書かせちゃいけないセキュリティ意識皆無のカスだって自白してるようなもの
0767デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:01:08.35ID:wSq6T90P
>>765
間違えてた。正しくはこうだと思う:
int  idx = (int)( ((double)rand()) * (STR_MAX - 1) / RAND_MAX );

まだ間違いがあるかも知れんが。
0768デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:09:37.75ID:wSq6T90P
>>766
知らなかっただけで、std::uniform_int_distribution のような便利なライブラリが
あるんだったらそっちを使ったほうがいい。
本当は、古いCに昔から入っているような rand() はアルゴリズムが良くなくて
モンテカルロシミュレーションなどでは余り良い結果が出ない。
昔やってみて分かった。ネットに転がってたもっといいアルゴリズムの乱数に
変えてみたら結果が良くなった。
0770デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:12:59.23ID:5Cw7Ao7f
何だこいつ

> 新しい機能はC++委員会が好き勝手に追加しているだけで、
> 学ぶ意味が無い。



> 知らなかっただけで、std::uniform_int_distribution のような便利なライブラリが
> あるんだったらそっちを使ったほうがいい。
0771デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:15:04.65ID:ymsvBiyv
>>769
rand()%Nは最悪のディストリビュータといわれている。
浮動小数でやるほうが幾分かましといわれる程度には。
0772デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:16:17.70ID:wSq6T90P
>>769
剰余で
int idx = rand() % RAND_MAX;
のようにすると均等確率にはならないことがある。
俺の専門は数学に近いので分かる。
0773デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:18:23.32ID:wSq6T90P
>>772
間違い修正:
誤:int idx = rand() % RAND_MAX;
正:int idx = rand() % STR_MAX;

このように書いた場合、直感では、RAND_MAXがSTR_MAXの倍数で無い場合
に均等確率にならないハズ。
0774デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:18:43.26ID:M7+W0IyT
低劣なrand()のさらに劣悪な下位ビットを使うくらいならアホが書いてる形の方がまだましではある
rand()みたいな小学生でも推測できる危険極まりないゴミクズを使ってる時点で目くそ鼻くそだけど
0775デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:21:02.57ID:wSq6T90P
>>771
おっしゃるとおり、そのやり方だと、
N が rand()の最大値 RAND_MAX の約数で無い場合には、均等確率になりませんね。
0777デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:22:46.70ID:wSq6T90P
>>774
質問者は、>>747 と書いただけなので、初心者的質問だとみなして
そんなに高度な乱数は必要ないと思ったので書いてみただけ。
0778デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:25:08.12ID:M7+W0IyT
初心者にこそrand()みたいな絶対に使ってはいけない危険物を紹介したらダメだろうが
お前は初心者が入力読み込みの質問したらgets()を教えるのか?
0779デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:25:11.59ID:wSq6T90P
>>774
>低劣なrand()のさらに劣悪な下位ビットを使うくらいならアホが書いてる形の方がまだましではある
あなたは、% と & を間違えてませんか。

x % y : x を y で整数除算したときの余り。
x & y : x と y の BIT 積 (and)。
0782デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:30:09.80ID:ymsvBiyv
std::minstd_rand は 線形合同法デス。



おわかりいただけただろうか。
mt19937最強!
0783デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:32:23.63ID:M7+W0IyT
>>780
劣悪だからっつってんだろ
あんなもの数個連続で観測されただけで簡単に予想できる
うっかりセッションIDやら初期パスワードやらの生成に使おうもんなら簡単に7pay案件だ
あんたそんな事も知らないでプログラマーやってんの?

>>781
rand()は昔も今もこれからも線形合同法のゴミだから今どきもクソもない
0784デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:33:07.37ID:wSq6T90P
>>781
rand()が 閉区間 [0, RND_MAX] の整数値を均等確率で出力する場合に、
idx = rand() % STR_MAX;
とすると、STR_MAX が RND_MAX の約数で無い場合は端数のような部分が
同じ場所に集中して出現したり、抜けが起きたりして、idx は
[0, STR_MAX] の区間の整数値を均等確率で生じさせません。
0785デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:35:35.65ID:wSq6T90P
>>783
>劣悪だからっつってんだろ
>あんなもの数個連続で観測されただけで簡単に予想できる
>うっかりセッションIDやら初期パスワードやらの生成に使おうもんなら簡単に7pay案件だ
>あんたそんな事も知らないでプログラマーやってんの?

自分の専門は自然科学系で、シミュレーションで使うことはありますが、
パスワード系で使うことは一度も想定したことが有りませんでした。
0786デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:36:33.70ID:wSq6T90P
>>784
誤:[0, STR_MAX] の区間の整数値を均等確率で生じさせません。
正:[0, STR_MAX - 1] の区間の整数値を均等確率で生じさせません。
0787デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:38:32.53ID:M7+W0IyT
自然科学だとしてもあんな偏りまくりのクソ使っちゃダメだろ…
まさかとは思うが2連続で呼んで座標値作ったりしてないだろうな
もしやってたらそのシミュレーション全部カスだから作り直してやり直せ
0789デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:42:23.49ID:wSq6T90P
>>787
実際、rand()を使ってモンテカルロ法をやってみたところ予想通りには行かなくて
かなりはまったことが有ります。その後、確か xor256 法などを使ってだいぶ
ましになりました。
0790デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:45:37.20ID:wSq6T90P
>>788
さっきの例に出ていたキーワードで検索してさっき見てました。

なお、確率の均等性だけでなく、前後の相関が低いという意味において、
rand() より xor256 法は優れているようです。
0791デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:47:57.94ID:ymsvBiyv
モンテカルロやるんだったら、メルセンヌツイスタはグレートな動きするよ。
623次元均等分布とかいうよくわからんものだ。かなりクレイジー。
mt19937がそれだ。
0792デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:51:22.71ID:wSq6T90P
みなさん、最初の質問は >>747 というとても素朴なものであったのを
分かっておっしゃってますか?
0795デフォルトの名無しさん
垢版 |
2019/09/05(木) 01:16:30.46ID:ymsvBiyv
お題: >>794ではvectorを返却値にしているが、これは何バイトコピーしていると考えられるか?

暇だったら考えてみて。
0796デフォルトの名無しさん
垢版 |
2019/09/05(木) 01:26:21.35ID:lN+O1qau
乱数って/dev/randomから取ってもいいんでしょ?
なんか今システムコールもあるみたいだけど
0797デフォルトの名無しさん
垢版 |
2019/09/05(木) 01:28:10.60ID:ymsvBiyv
>>796
うにっくす限定なので標準ライブラリを使ったほうがポータブルですよ。
まぁ、C++98とか使ってるならわからんでもない。
0799デフォルトの名無しさん
垢版 |
2019/09/05(木) 01:51:14.01ID:ymsvBiyv
>>798
逆にメルセンヌツイスタでは秘匿情報を暗号化するのは絶対やめてくれといわれている。
詳しくはWikipedia読んでね。
0803デフォルトの名無しさん
垢版 |
2019/09/05(木) 07:22:17.46ID:TZCSkvxf
パスワード生成とかシミュレーションとかマウント取りたくてしかたない老害だらけだなw
>>747はじゃんけんゲームだろ?
0804デフォルトの名無しさん
垢版 |
2019/09/05(木) 07:25:46.47ID:OtMARD1h
>>802
それマジクソだよな
エントロピー源が作れないなら作れないと例外でも投げろっての
黙ってインチキするなんて最低だ
0805デフォルトの名無しさん
垢版 |
2019/09/05(木) 08:22:51.14ID:4woSX2Eo
線形合同法って下1ビット捨てればだいたい解決するんじゃね?やったことないからわからないけど
0809デフォルトの名無しさん
垢版 |
2019/09/05(木) 10:05:53.05ID:jPhMORz8
unixが何を制御してるか知らんが乱数のデバイスなんだからその先に原子炉の一つでも繋がってるんじゃねえの?
そっからの出力が乱数じゃなくなったらヤバいことになってる
0811デフォルトの名無しさん
垢版 |
2019/09/05(木) 10:34:35.09ID:OtMARD1h
なんで乱数のデバイスに原子炉がいるんだよw
アバランシェでできるだろうが
0816デフォルトの名無しさん
垢版 |
2019/09/05(木) 16:05:03.33ID:OtMARD1h
ずーっと安定して生かさず殺さず飼われている社畜が
肉食獣の食事後のような優雅な暇を知らねえのはまあ道理だ
0818デフォルトの名無しさん
垢版 |
2019/09/05(木) 18:40:46.63ID:zNNFYG19
vc++ でも、linux でも使える、STLライブラリとして、ずっと、STLPORT使っているけど、
今は、どんな状況になっているんだろ?
0819デフォルトの名無しさん
垢版 |
2019/09/05(木) 18:43:11.27ID:ymsvBiyv
コンパイラのSTLでなんか不満あるんかいな。
今後は3年程度で新仕様はいるようになる予定だ。
0821デフォルトの名無しさん
垢版 |
2019/09/05(木) 19:12:25.60ID:ymsvBiyv
>>795
出題した者だが、自分の回答では、3変数程度のコピーで済む。
メモリへのポインタとキャパシティ変数と使用中を保持する変数。
64ビット変数だとして、24バイト程度と考えられる。俺には。
0823◆QZaw55cn4c
垢版 |
2019/09/05(木) 20:17:53.77ID:RTqjgiVl
>>779
% を使う、というのは「下位ビット」を使う、という意味と同じですよ
0824◆QZaw55cn4c
垢版 |
2019/09/05(木) 20:18:27.47ID:RTqjgiVl
>>780
rand() は線形合同法でインプリメントされているので、乱数の質はあまりよろしくないのです
0826デフォルトの名無しさん
垢版 |
2019/09/05(木) 21:59:37.41ID:04ZPpNlH
>>822
ああなるほど
あのアプリはどこかサーバーに送って実行してるというわけではないのね
それとも送った先がおかしいのか?
0830デフォルトの名無しさん
垢版 |
2019/09/05(木) 23:11:16.46ID:dJChsmUT
だれが rand() が危険と教えてるんだろう。
これが日本の教育か。嘆かわしい。
0834デフォルトの名無しさん
垢版 |
2019/09/05(木) 23:16:21.31ID:dJChsmUT
頭の悪い人は、自分が頭が悪い事に気付かない。
それが最大の問題なんだ。
だから学歴フィルターで落とす。
0835デフォルトの名無しさん
垢版 |
2019/09/05(木) 23:22:15.18ID:3AoluiiY
馬鹿だから自分の判断よりも学歴で判断することになる。
あんなもんは足切り以外役に立たん。
0838デフォルトの名無しさん
垢版 |
2019/09/05(木) 23:24:14.66ID:dJChsmUT
& と% の違いもいくら言っても理解できないんだろ。
rand() の質が悪い事を危険と思っていたりとかな。
0840デフォルトの名無しさん
垢版 |
2019/09/05(木) 23:30:31.24ID:mvC8Xt02
mtだってセキュリティ目的で使うべきではないが他に分野では一般的に用いられる優秀な乱数
要件次第で何が良いかは変わる
randは対応できる要件が少なくて大抵の場合xorやmtが上位互換になれる
メモリ周りがキツい環境下ならmtは候補から外れることもある
0841蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/05(木) 23:32:50.72ID:oF7lOGXi
一般に、ビット毎のANDと、剰余(余り)は別の演算だが、最適化によっては剰余がANDになることがある。
0846デフォルトの名無しさん
垢版 |
2019/09/06(金) 00:45:20.09ID:kzddYIGk
つか、事あることにセキュリティって言ってるけど、厳選された乱数を使うような、シビアなセキュリティのプログラム作るような人がここにいるの?
0847デフォルトの名無しさん
垢版 |
2019/09/06(金) 00:54:30.17ID:9umjXXHu
a=b*2^n だった場合、
rand() % a の下位 n ビットには元の rand() の下位 n ビットがそのまま現れる。
2の累乗だけでなく、2の累乗を約数とする場合も下位ビットの影響が大きい。
0848蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/06(金) 00:56:43.20ID:AgDBiA/M
パスワード管理とか通信ソフトとかオンラインゲームとか。数える位は居るだろうよ。
0849デフォルトの名無しさん
垢版 |
2019/09/06(金) 00:58:53.52ID:ZIHlUiP/
>>826
試しにwebのsololearnでも試してみたとろmt19937のデフォルトと同じ乱数列を生成したのでcpprefjpに書いてあるWindowsのGCCと同じ挙動だな。
0850デフォルトの名無しさん
垢版 |
2019/09/06(金) 01:27:15.87ID:TfAw/avA
定義の前にvirtual付ければ仮想関数になるのは分かるんだけど、動的接続の意味がちょっと分からない
0851デフォルトの名無しさん
垢版 |
2019/09/06(金) 01:28:44.78ID:cs8CUE0i
>>849
実行環境Mingwとは思えないので他にも同じことしてる実装があるんか
それとも独自実装なのか、まさか
0853デフォルトの名無しさん
垢版 |
2019/09/06(金) 01:55:47.74ID:cs8CUE0i
sololearnの実行環境、Mingw GCC 7.2.0らしい
Mingw GCCのrandom_deviceが治ったのは9.2から・・・
0854デフォルトの名無しさん
垢版 |
2019/09/06(金) 07:14:39.55ID:ZIHlUiP/
>>853

char_traitsのlengthがconstexpr対応してないのもあるよ。
その為にstring_viewがconstexprに出来ない。
0855デフォルトの名無しさん
垢版 |
2019/09/06(金) 08:33:08.03ID:5s+Nj0ya
constexpr を#if 〜 #endif マクロ で使えるようにできないですか?
0862デフォルトの名無しさん
垢版 |
2019/09/06(金) 20:43:09.72ID:cs8CUE0i
たぶんだけど、rdrand単体は信頼度が低いから必ずシステムの乱数源から取得するようにしてるんだと思う
0865◆QZaw55cn4c
垢版 |
2019/09/06(金) 21:23:41.99ID:ZK4CQ9gu
>>840
純粋に質問です
>mtだってセキュリティ目的で使うべきではない
それはなぜですか?
0868デフォルトの名無しさん
垢版 |
2019/09/06(金) 22:42:43.08ID:/xfj8nPF
>純粋に質問です
>>mtだってセキュリティ目的で使うべきではない
>それはなぜですか?
これはさすがにググレカス言うべきだろ。本人のためにも。
てかググって調べた方が実際本人のためだわ。
0869デフォルトの名無しさん
垢版 |
2019/09/06(金) 22:52:53.67ID:5s+Nj0ya
ちまたでは「丁寧な無視」がトレンドワードですが、C/C++でエラーを丁寧な無視することで得られるメリットを教えろください。
0874デフォルトの名無しさん
垢版 |
2019/09/07(土) 00:19:45.14ID:qWaNgvFq
QZは不備のあるなし関係なしに質問には質問で返してるぞ
マウント取りたいだけなんだろうな
0881デフォルトの名無しさん
垢版 |
2019/09/07(土) 22:23:43.46ID:5djAVjeX
Office2000でのイルカの消し方をイルカに質問する感性を大切にしたい。
0882デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:27:12.03ID:8BL9REyc
文字列で指定したクラスのインスタンスを生成する方法ってあるのでしょうか?
0883デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:30:28.50ID:m+XQHtHp
コンパイル時ならテンプレート
実行時ならDBでも用意してcaseでも使え
0884デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:31:17.61ID:+erxyDXy
pythonのクラスなら可能
0885デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:33:13.25ID:jesnwhA+
あるけど生成したインスタンスを静的に受けとるには生成されるクラスの種類がポリモーフィズムをとれないといけない
0891デフォルトの名無しさん
垢版 |
2019/09/08(日) 16:14:18.54ID:qEJgkL29
>>882
文字列とクラスの対応はtype_info::name()で与えられているが
文字列の形式が処理系定義であることに注意が必要
0892デフォルトの名無しさん
垢版 |
2019/09/08(日) 16:23:33.90ID:m+XQHtHp
>>886
その通りだが
自分で規定を作ってしまえ良い
全てのクラスを単一のメタクラスから派生するルールで統一汁
0895デフォルトの名無しさん
垢版 |
2019/09/08(日) 16:39:53.43ID:x7//igd4
共通の親クラス持たせてmapのキー文字列にして生成用の関数ぶっこめばいいけど
親クラスが共通じゃない場合は難しいのかな
0896デフォルトの名無しさん
垢版 |
2019/09/08(日) 16:48:58.23ID:ijKgjVtQ
全クラスに対応する必要なんてないんだったらこんな感じでいいんじゃないか
enum ClassName{
Hoge,
Hige,
Hage
}
std::any func(ClassName name){
std::any out;
switch(name){
case ClassName::Hoge:
out = new Hoge();
break;
case ClassName::Hige:
out = new Hige();
break;
case ClassName::Hage:
out = new Hage();
break;
}
return out;}

int main(){
//なんか文字列を受け取る
ClassName name;
//文字列をClassNameに変換する
auto fuga = func(name);
if(fuga.type() = typeid(Hoge*)){
auto hoge = std::any_cast<Hoge*>(fuga);
//hogeの処理
} else if 以下略
}
0899デフォルトの名無しさん
垢版 |
2019/09/08(日) 17:58:58.65ID:qEJgkL29
>>882
GUIDで指定したクラスのインスタンスを生成する方法なら
COMのCoCreateInstance()がそれだが参考になるか?

ユニークでなければならないクラス名を文字列で指定はかなりキツいという意味で
0901882です。
垢版 |
2019/09/08(日) 21:55:34.48ID:8BL9REyc
必要な情報が色々と抜けていたのに、色々と情報をいただきありがとうございます。
私が考えていたのは実行時に型を登録するようなクラスを使う方法です。
仮コードですが下記のような感じです。
template<typename BaseType> class InheritanceContainer{
struct IInheritance{
// BaseTypeを継承したクラスを生成
virtual BaseType* Create() const = 0;
};
template<typename Type> struct Inheritance : public IInheritance{
virtual BaseType* Create() const{ return static_cast<BaseType*>( new Type() ); }
};
public:
// 型情報の登録
template<typename Type> bool Add(){
std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( ctti::nameof<Type>().cppstring() ); // ctti::nameof<Type>().cppstring() cttiライブラリーを利用して型の文字列を取得する
if( it != m_InheritanceMap.end() ) return;
m_InheritanceMap.insert( std::make_pair( ctti::nameof<Type>().cppstring(), new Inheritance<Type>() ) );
}
// 文字列に合わせた BaseType を継承した物を生成
BaseType* Create( const std::string& _TypeText ){
std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( _TypeText );
return it != m_InheritanceMap.end() ? it->second->Create() : NULL;
}
private:
std::unordered_map<std::string, IInheritance*> m_InheritanceMap;
};
一応これでも要件は満たしているのですが、
いかんせんこれだと使うクラスを予め手動で登録している必要があり、
保守管理が手間なので皆様のお知恵を拝借できればと思い質問した次第です。
頂いた情報はこれから勉強します。
0903デフォルトの名無しさん
垢版 |
2019/09/09(月) 00:06:19.70ID:9HmBuaOU
基本的な事なのですが教えてください。
memcpy可能なクラス若しくは構造体はどうやって判定するのがスマートですか?
0905デフォルトの名無しさん
垢版 |
2019/09/09(月) 00:22:36.87ID:9HmBuaOU
>>904
1から作られればそうするのですが、c言語のベースがあって、それをコピペでc++で改修して、そいつの改造なんでどうしても必要なんですよ。
手を出せない共通処理がmemcpyを使ってるから、チェック処理が必要だったので
0906デフォルトの名無しさん
垢版 |
2019/09/09(月) 00:23:34.34ID:gU/0Tin3
>>903
自分で解析するかコード書いた人に保証してもらうしかないと思うよ。
基本型だからコピーしても大丈夫と思ったら参照カウンタとして使われていた、なんてこともあるだろうし
0909デフォルトの名無しさん
垢版 |
2019/09/09(月) 02:56:10.10ID:L8mIN3PD
std::is_pod とかってどうやって実装されてるんだろう。
コンパイラのビルトイン? それとも template で作られてる?
0911デフォルトの名無しさん
垢版 |
2019/09/09(月) 03:50:37.41ID:9JOMxNeV
type_traitsはだいたいビルトインでしょ
コンパイラは知ってるはずの情報なんだから変なトリックコードで取る必要もない
0913909
垢版 |
2019/09/09(月) 12:06:40.11ID:L8mIN3PD
>>911
自分で調査してみたところ、以下の様に、あなたのおっしゃるとおり、
中核部分は、__is_pod(クラス名) という「ビルトイン関数」を使っていました:


 // Could use is_standard_layout && is_trivial instead of the builtin.
 template<typename _Tp>
  struct is_pod
  : public integral_constant<bool, __is_pod(_Tp)>
  { };

 /// integral_constant
 template<typename _Tp, _Tp __v>
  struct integral_constant
  {
   static constexpr _Tp         value = __v;
   typedef _Tp              value_type;
   typedef integral_constant<_Tp, __v>  type;
   constexpr operator value_type() const noexcept { return value; }
#if __cplusplus > 201103L
#define __cpp_lib_integral_constant_callable 201304
   constexpr value_type operator()() const noexcept { return value; }
#endif
  };
0917デフォルトの名無しさん
垢版 |
2019/09/09(月) 13:14:59.70ID:By40c52C
>>901
pythonのPyObjectのコード観てみ
0919デフォルトの名無しさん
垢版 |
2019/09/09(月) 13:41:26.48ID:FLVXg6p/
tk > wxWidgets > Qt > electron
0920デフォルトの名無しさん
垢版 |
2019/09/09(月) 14:33:07.01ID:dQ/pGf2B
stringstreamで

std::stringstream ss;
ss << value;
std::string str = ss.str();

こんな感じで数値を文字列に変換すると、valueが3桁以上だった場合
12,000みたいな感じで勝手にカンマがついてしまうんだけど
カンマがつかないフォーマットで出力する方法を教えてください
0925デフォルトの名無しさん
垢版 |
2019/09/09(月) 17:01:25.39ID:dQ/pGf2B
ロケールの設定が原因でした
wstringで日本語を扱いたくて
std::locale::global( std::locale( "japanese" ) );
std::setlocale( LC_ALL, "japanese" );
ってやるとstringstreamでカンマが付くなんて知らなかった
0926デフォルトの名無しさん
垢版 |
2019/09/09(月) 17:05:42.93ID:L8mIN3PD
std::list<int> l = { 7, 5, 16, 8 };

とすると、 l というリスト右辺で指定した要素で初期化した状態で作成されますが、
このときの std::list 自体の実装方法が知りたいです。
最新の C++ の方法論(?)によれば、右辺がコンパイラによって initiailer_list に
なって、list のコンストラクタにそれが仮引数の型として宣言してあるものがあって、
そこで処理しているのかと思い、確認のため、

http://cs.brown.edu/people/jwicks/libstdc++/html_user/stl__list_8h-source.html

で、std::list のソースを見てみると、initiailer_list というキーワードが見つかりません。
ではいったいどういう仕組みで初期化しているのでしょうか。
operator=() は見つかります。
0927デフォルトの名無しさん
垢版 |
2019/09/09(月) 17:07:18.30ID:G9jMTORL
>>926
誤:とすると、 l というリスト右辺で指定した要素で初期化した状態で作成されますが、
正:とすると、 l というリストが右辺で指定した要素で初期化した状態で作成されますが、

誤:initiailer_list
正:initializer_list
0929デフォルトの名無しさん
垢版 |
2019/09/09(月) 17:20:40.83ID:MF4WMKe5
>>926
一応マジレスしておくと、そのサイトの一番下を見よう
> Generated on Fri May 6 01:09:09 2005 for libstdc++-v3
initializer_listが導入されたのはC++11だからね
0930デフォルトの名無しさん
垢版 |
2019/09/09(月) 17:28:46.68ID:pmQvKTaB
stl_list.hなんてコードは標準にはありません。

リンクドリストのよくあると思われる実装は、
struct node{
node* next=nullptr;
node* prev=nullptr;
T value();
}

という構造体の操作等をクラス化したモノ。
なので、インデックサが無いはずである。
0932デフォルトの名無しさん
垢版 |
2019/09/09(月) 18:26:49.77ID:L8mIN3PD
VC2019 の list ヘッダではちゃんと見つかりました。
みなさんありがとうございました。
0933デフォルトの名無しさん
垢版 |
2019/09/09(月) 18:33:38.13ID:G9jMTORL
また質問させてください。
VS2019 の tuple の実装を調べていて、utility というヘッダファイルに以下の
ようなコードを見つけました。自分の直感では、これは、パターンマッチングを
していると思うんですが、実は、以下の (1) にマッチングする場合、
(2) にもマッチングする場合があります。しかし、現実には (1) にマッチングする
場合には、コンパイラは (2) を無視して (1) だけを採用する必要があると
思うんですが、template には、マッチングに優先順位があって、定義した
順にマッチングするかを調べて、一番最初にマッチングしたものを採用して
それ以後のものは無視すると言うような規則があるのでしょうか?

// (1)
template <class _This, class... _Rest>
struct _Tuple_element<_This, tuple<_This, _Rest...>> { // select first element
  using _Check_type = int;
  static_assert(
    is_void_v<typename _Tuple_element<_This, tuple<_Rest...>>::_Check_type>, "duplicate type T in get<T>(tuple)");

  using type  = _This;
  using _Ttype = tuple<_This, _Rest...>;
};

// (2)
template <class _Ty, class _This, class... _Rest>
struct _Tuple_element<_Ty, tuple<_This, _Rest...>>
  : _Tuple_element<_Ty, tuple<_Rest...>> { // recursive _Tuple_element definition
};
0934デフォルトの名無しさん
垢版 |
2019/09/09(月) 19:26:19.32ID:L8mIN3PD
>>933
なお、_Tuple_element は、

tuple tpl;

に対し、get<番号>(tpl) としたときに呼び出される以下のコードから使われます。

結論的には、template を書いた順序ではなく、パターンマッチングおける強弱のような
もので優先順位が決まっているようです。それは丁度、同じ名前に仮引数の型だけが
異なる複数の関数 が overload 定義されている場合に、どの関数が呼び出されるかを
決めるときのアルゴリズムに似ているようです。詳しくは分かりません。


// FUNCTION TEMPLATE get (by type)
template <class _Ty,
  class... _Types>
_NODISCARD constexpr _Ty& get(tuple<_Types...>& _Tuple) noexcept { // get reference to _Ty element of tuple
  using _Ttype = typename _Tuple_element<_Ty, tuple<_Types...>>::_Ttype;
  return ((_Ttype&) _Tuple)._Myfirst._Val;
}
0935デフォルトの名無しさん
垢版 |
2019/09/09(月) 19:28:45.47ID:G9jMTORL
>>934
誤:get<番号>(tpl) としたときに呼び出される以下のコードから使われます。
正:get<型名>(tpl) としたときに呼び出される以下のコードから使われます。
0937デフォルトの名無しさん
垢版 |
2019/09/10(火) 01:40:29.13ID:wmYy4ZD0
>>934
ちなみに、C++ における tuple とは、異なる型のオブジェクトの集合体のような
もので、get<idx>(tpl) とすると idx 番目の要素が参照できます。
動的配列 vector、リンクリスト list は同じ型の集合体ですが、tupleは
char, int, string 任意の順番で任意個数入れたりするようなことが可能です。
tuple は class を次々に継承することで実現され、N個の要素の場合は、
(N - 1) 回継承されて実現されています。
get<idx>(tpl) は、コンパイル段階で静的に型が決まるようになっており、
idx を 1 ずつ減らしながら idxが0 になるまでtemplateを再帰的に具現化(展開)し
て行っています。その際、基本クラスへの「cast」を利用して上手く実装されています。
get<TYPE>(tpl) は、その TYPE 版で、tuple の中の TYPE 型の要素を取り出すもので、
TYPEの要素が一個だけであることを仮定しています。

>>934
using _Ttype = typename _Tuple_element<_Ty, tuple<_Types...>>::_Ttype;
  return ((_Ttype&) _Tuple)._Myfirst._Val;
の部分は、丁度 TYPE = _Ty の場合のもので _Tuple_element<_Ty, tuple<_Types...>>
の部分が、再帰的に template 具現化を使って _Ty の型の要素が先頭になるまで
tuple の要素を減らす処理を行っており、_Ttype には、その tuple の型が入ります。
次の return 文は、cast を行っている部分です。
>>933 の(2)は、再帰的に tuple の先頭の要素を除去して行くマクロで、(1)は、
tuple の先頭が _Type になった場合にマクロ展開の動作を停止するためのものです。
0938デフォルトの名無しさん
垢版 |
2019/09/10(火) 08:37:19.66ID:rSLGtoNV
recursive _Tuple_element definition って書いてあるから
>>933の(1)(2)併せてtupleのバッカス・ナウア記法
0940デフォルトの名無しさん
垢版 |
2019/09/10(火) 17:10:53.21ID:BQ4j7tjI
C#には文字列で指定したメソッドを呼び出す方法がありますが、
C++ではそういった事をしたい場合、どういった方法があるのでしょうか?
0941デフォルトの名無しさん
垢版 |
2019/09/10(火) 17:15:02.60ID:lKNyd4my
なんかこのスレだけ(っていうか特定のレスだけ?)貼られてるソースのフォントが微妙に違う気がするんだが気のせい?
0944デフォルトの名無しさん
垢版 |
2019/09/10(火) 17:16:04.51ID:EA1WacFe
>>940
最近他のスレで同じ質問を観たけどマルチ?
0947デフォルトの名無しさん
垢版 |
2019/09/10(火) 18:30:27.12ID:/IdzRyhX
mapに入れるにしても呼び出す関数の引数戻り値の型が一致してる必要があるくね
0948デフォルトの名無しさん
垢版 |
2019/09/10(火) 18:36:26.12ID:lKNyd4my
>>946
なるほど
何が引っかかってるんだろ
>> とか << が多い程度じゃ判別されないはずだが
0949デフォルトの名無しさん
垢版 |
2019/09/10(火) 21:34:14.67ID:ihR0gUx6
>>940
関数名の文字列ではなく、関数ポインタを使えばやりたいことができる可能性は高い。
または仮想関数。
0950デフォルトの名無しさん
垢版 |
2019/09/10(火) 21:51:01.01ID:ER41jhKS
C++は名前と引数が同じで戻り値が違うくらいでは別物として扱ってくれない。
ドットネットだと大丈夫だった気がする。
0954デフォルトの名無しさん
垢版 |
2019/09/10(火) 22:26:46.90ID:DP4nYdpK
んなめんどいことせんでも関数2つぐらい作って関数ポインタの配列に入れりゃいいだけだろ
0957デフォルトの名無しさん
垢版 |
2019/09/11(水) 00:34:09.53ID:jCX5Zmm7
まあそれ用のレイヤ噛ますのが素直だよね
.netみたいなのがあればそれでいいし、CのGLibみたいなのもちょっと無理を感じなくもないがアリ
0958デフォルトの名無しさん
垢版 |
2019/09/11(水) 01:04:41.71ID:Au6CJXG/
>>953
昔のC++では、確かに戻り値の型は同名関数の絞込みには使用されなかったよ。
今は知らない。
0962デフォルトの名無しさん
垢版 |
2019/09/11(水) 08:37:00.29ID:BcUfEF7y
リフレクションどうやって実装するんだろう・・
現行のC/C++とリンカの仕様と互換性たもったまま実装するのかなり難しそうだけど
0965デフォルトの名無しさん
垢版 |
2019/09/11(水) 11:21:58.81ID:9WrJeA7f
structured bindingで定義した変数をラムダ式でキャプチャするとclang7はエラー、gcc7は通る。
いずれもc++17指定。
使用上正しいのはどっち?

const auto [a,b]=std::make_tuple(1.0,0.0);
auto f=[&](){
return a+b;
};
0966デフォルトの名無しさん
垢版 |
2019/09/11(水) 11:39:01.09ID:KrQUVjgm
>>965
clangが正しい
N4713 8.5.4.2 Capturesの段落8にこう書いてある
If a lambda-expression explicitly captures an entity that is not odr-usable or captures a structured binding (explicitly or implicitly), the program is
ill-formed.
0969デフォルトの名無しさん
垢版 |
2019/09/11(水) 12:13:22.75ID:9+CD8w/u
ちなみに [a,b] は、std::tie(a,b) と書くのと同じですか?
また、[a,b] はなんという名称(概念)ですか?
0973デフォルトの名無しさん
垢版 |
2019/09/11(水) 13:05:17.06ID:zFEVPQj4
tieは良くないmaketuple使え
0976デフォルトの名無しさん
垢版 |
2019/09/11(水) 20:20:32.38ID:jgB/KG+a
Aクラスを継承したテンプレートで型を指定したメンバー変数cを持つ、Bクラスがある。

BクラスをキャストしたAポインタ仮想メソッド使ってBのメンバー変数cを取得したいんだけど、ダウンキャストしかないかね?

class A{};

template<typename _T>
class B : pubulic A{ pubulic : _T c;}

A *a = new B<int>;

int ret = A->???;
0978デフォルトの名無しさん
垢版 |
2019/09/11(水) 20:25:26.05ID:xNhcwpCp
BのインスタンスをAにアップキャストした時点でAにないメンバは破棄されるのでAのポインタからcにアクセスすることはできない
0981デフォルトの名無しさん
垢版 |
2019/09/11(水) 21:01:04.58ID:QpQ1AfFp
cにアクセスしたい人はBを知ってるんだから、ダウンキャストでもなんでもやりゃぁええがな。
0992デフォルトの名無しさん
垢版 |
2019/09/12(木) 07:27:47.36ID:ikyWh7fv
AとBだけじゃなくてどうせAの派生クラスはCやらDやらあってそれらもA*で扱うんでしょ。
ホントの型の判別やって型に応じて処理するんだろうしダウンキャストでええがな
0993デフォルトの名無しさん
垢版 |
2019/09/12(木) 08:25:32.31ID:Ni5TNCQb
それって欲しいのはunionてことじゃね?
それかAにすべてのメンバ乗せたらええやん。
0996デフォルトの名無しさん
垢版 |
2019/09/12(木) 15:18:39.72ID:W8pItA9j
コンパイル時に自身のソースコード解析してリフレクション作ることとかできないですか?
0999デフォルトの名無しさん
垢版 |
2019/09/13(金) 12:32:55.83ID:+6+n/onN
>>988
そんなことやっても結局正体を知った上での個別処理になるわけだから
素直にダウンキャストしとけと
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 52日 23時間 35分 31秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況