18/01/20 09:05:42.21 mJKRg6iz0.net
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part133
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
URLリンク(codepad.org)
URLリンク(ideone.com)
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2:デフォルトの名無しさん
18/01/20 09:07:45.45 mJKRg6iz0.net
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
いつまでこの糞テンプレ張り続けるんだおい
---- テンプレ ここまで ----
3:デフォルトの名無しさん
18/01/20 09:24:34.73 i+Y70H5F0.net
前スレのvectorのsize_tの質問した者だけど
実際gprofでvectorの[]が重い原因になってることを確認してる
次に重い原因がイテレータの比較なんだけど
4:デフォルトの名無しさん
18/01/20 09:35:10.31 CFAgCrzx0.net
>>3
> 実際gprofでvectorの[]が重い原因になってることを確認してる
どんな確認したのか知らんけど、確認しててあんな質問してるなら単なるバカとしか思えないが...
5:デフォルトの名無しさん
18/01/20 09:50:30.10 AVDgMNZq0.net
またトンデモな使い方をしているのだろうな
6:デフォルトの名無しさん
18/01/20 11:02:33.41 Bd+LbacS0.net
メモリ帯域が律速になる処理はわりとあるので
大容量のデータを処理してるならおかしくはない
キャッシュ効かないメモリアクセスするコストに比べたら整数の拡張など微々たるもんだ
7:デフォルトの名無しさん
18/01/20 11:46:34.01 slOCvU7H0.net
>>1乙
↓前スレの続き
std::vector<double> vec((size_t)1000);
...
size_t sz = vec.size();
for (int i = 0; i < (int)sz; ++i) {
cout << i << " " << vec[i] << "\n";
}
の方がiをsize_tにするよりループ命令の部分が軽量化されることにより早いかも試練(x64では気のせい?
およびループ内で他に32 bit演算をやる場合、x64だと全てレジスタ上で賄える可能性が高まるから
速くなるかも試練、
結論: アセンブリコードを確認せよ
8:デフォルトの名無しさん
18/01/20 12:06:11.44 slOCvU7H0.net
いやスマン
例が不適切やったわ;
ループ内でstd::coutみたいな重量のある関数呼び出しをしたら
「全てレジスタ上で賄える」とか
「キャッシュが有効活用で劇速化」とかも糞も無いな
9:デフォルトの名無しさん
18/01/20 12:31:55.30 w1mvJepJ0.net
noexceptってどういうときにつけたらいいですか。
10:デフォルトの名無しさん
18/01/20 13:45:44.65 gdCBjjapd.net
>>3
[ ] が問題なら生ポ使えと書いてるんだけど無視?
11:デフォルトの名無しさん
18/01/20 13:51:38.35 gdCBjjapd.net
>>8
重量の有り無しの前に
数値の文字列変換がsize_tとintじゃ違うだろ
それがなければどっちでも変わらんよ
64bit環境ならレジスタも64bitなんで
12:デフォルトの名無しさん
18/01/20 14:00:41.11 gdCBjjapd.net
>>3
ん?
プロファイラの確認?
だとしたら[ ] が遅いんじゃなくてメモリの読み込みが実際に遅い可能性があるのでは?
そもそも、
[ ] が問題になるような小さなループで
[ ] の時間を正しく測れるのか?
いずれにしろ、生ポと比較してみるのが一番
13:デフォルトの名無しさん
18/01/20 14:02:23.47 gdCBjjapd.net
メモリ帯域の問題なら
もっと大きな視野で最適化をしないとな
複数ループをくっつけてメモリアクセスを減らすとか
細切れに処理をしてキャッシュを効かすとか
14:デフォルトの名無しさん
18/01/20 14:04:10.50 C2bNNCkKM.net
[]が問題になるわけ無いだろ。ソースコード見たのかよ。
ナマポで書き直すなんて無意味。抜本的にアルゴリズム見直せ
15:デフォルトの名無しさん
18/01/20 14:05:12.48 gdCBjjapd.net
あ、可能性だけで言えば
signedよりunsignedの方が速い
32bit から 64bit の符号拡張はコストが微妙にかかることもあるが、
ゼロ拡張はなにもしなくて良いから
レジスタの上位32bitは勝手にゼロになる
16:デフォルトの名無しさん
18/01/20 14:07:10.18 gdCBjjapd.net
>>14
問題になることもある
君こそソースを見たかな?
17:デフォルトの名無しさん
18/01/20 14:50:38.90 CFAgCrzx0.net
>>15
今時のプロセッサでそんな奴見たことないけど?
妄想じゃないなら具体例よろしく
18:デフォルトの名無しさん
18/01/20 14:56:00.07 gdCBjjapd.net
>>17
そんなやつって何だ?
符号拡張にコストがかかってゼロ拡張にコストがかからない例ならx86-64がそうだが
19:デフォルトの名無しさん
18/01/20 19:43:21.88 J+aY78FJ0.net
MOVSXもMOVZXも0クロックでは処理できないと思うんだが
ZXが0クロックで出来るってエビデンスはあるのかな?
URLリンク(stat.ameba.jp)
20:デフォルトの名無しさん
18/01/20 20:07:30.62 aYLVMpQqM.net
32bitデータをレジスタに書き込んだら上位32bitが0クリアされることを言ってるんでしょ
コスト0って言うのはどうかと思うけど
21:デフォルトの名無しさん
18/01/20 20:30:37.09 w1mvJepJ0.net
質問させてください。
以下のコードで push_back 時にコピーコンストラクタが呼ばれます。
URLリンク(ideone.com)
こちらとしては、下のページにあるように、ムーブコンストラクタが呼ばれることを期待しています。
URLリンク(qiita.com)
なぜムーブではなくてコピーになるのか、教えて頂けないでしょうか。
22:デフォルトの名無しさん
18/01/20 20:43:12.42 kYo2uzfm0.net
>>21
ムーブコンストラクタが定義されていないから
A(A &&) = default;
とでもしておけ。
23:デフォルトの名無しさん
18/01/20 20:49:44.91 w1mvJepJ0.net
>>22
ありがとうございます。解決しました。
24:デフォルトの名無しさん
18/01/20 21:07:26.00 w1mvJepJ0.net
追加で質問させてください。
コンパイラが自動生成する関数で、noexceptがついているのは
・デストラクタ
・ムーブコンストラクタ
・ムーブアサインメントオペレーター
の3つでよろしいでしょうか。
よろしくお願いします。
25:デフォルトの名無しさん
18/01/20 21:11:18.68 Z4eZ5+gd0.net
残り3つもデータメンバと基底クラスの同じものが全部noexceptなら付くよ
26:デフォルトの名無しさん
18/01/20 21:18:07.18 w1mvJepJ0.net
回答ありがとうございます。
データメンバと基底クラスのそれぞれのデフォルトコンストラクタが全て noexcept なら、
noexcept なデフォルトコンストラクタが自動生成される。
コピーコンストラクタ、コピーアサインメントオペレーターも同上
という理解でよろしいでしょうか。
また、その条件が成立しないときは、>>24で挙げた3つということになるのですしょうか。
よろしくお願いいたします。
27:デフォルトの名無しさん
18/01/20 21:36:13.58 w1mvJepJ0.net
>>26について自己解決しましたので、質問を取り下げます。
ありがとうございました。
28:デフォルトの名無しさん
18/01/21 11:30:18.34 LU9Vj3hRM.net
>>16
noexceptなしに = defaultで宣言した場合はどうなるの?
29:デフォルトの名無しさん
18/01/21 11:32:32.53
30: ID:LU9Vj3hRM.net
31:デフォルトの名無しさん
18/01/21 13:25:22.34 XRSBBZxr0.net
もちろん宣言通りになる
32:デフォルトの名無しさん
18/01/21 13:32:54.03 LU9Vj3hRM.net
>>30
thx
33:デフォルトの名無しさん
18/01/21 19:49:20.49 FwsOgvVZ0.net
記述上 int* であるが、上書きされた場合に自動的に中身を delete してくれるポインタの入れ物を、
operator= のオーバーロードなしで定義できますか?
ちょっと変な質問なのだけど、native C++なら多分以下コードで出来る。
struct PatHead {
int* ptr;
int* operator=(int* value){
if (ptr) delete [] ptr;
ptr = value;
return value;
}
operator int*(){ return ptr;}
};
void test(){
PatHead ph[10]; // int* ph[10] と同じ記述で通るのがミソ
ph[1] = (int*)1;
int* tgt1 = ph[1];
}
問題はこちらが使っているのはVC++/CLIで、
なぜか value struct では operator= のオーバーロードが出来ず、(C3194)
マネージ配列に直接入るのは value型だけなのでちょっと詰んでいる。
なお ref struct なら出来るのだが、こちらは逆に初期化部分で記述が増えるので、
それなら諦めようかな、って感じ。
というわけで回避策を思いつく人がいればお願いします。
何で値型で禁止されているか分かる人も居ればよろしく。
34:デフォルトの名無しさん
18/01/26 13:51:50.30 duEsoqcC0.net
イテレータでendの一つ前を表すのはありますか。
endからの引き算必須ですか。
35:デフォルトの名無しさん
18/01/26 13:58:16.53 SmrT25am0.net
&back()
36:デフォルトの名無しさん
18/01/26 14:00:31.27 27cZOHeHM.net
>>33
用途に合うかどうか分からないけど
rbegin, crbegin
37:33
18/01/26 14:14:09.94 duEsoqcC0.net
サンクスです。できました。
38:デフォルトの名無しさん
18/01/27 07:12:46.54 ZP0gkUPd0.net
rbeginはちょっとトリッキーな実装になってることがあるから注意
39:デフォルトの名無しさん
18/01/27 11:46:50.10 RraDQJG10.net
実装に依存しないような仕様に沿った使い方をすればいいんでないの?
仕様に合致していない実装ならどうしようもないが。
40:デフォルトの名無しさん
18/01/27 19:12:13.06 Boft2e8Ea.net
SHA256のハッシュをkeyにしたmapを高速で扱いたいんだが、
keyのoperator <,>それぞれでmemcmpしてて、多分このせいで性能悪くなってる
なんか良い解決策ってないですかね?
Linuxのrbtreeと比較すると100万件あたり150msec程度差がついてました
41:デフォルトの名無しさん
18/01/27 19:13:43.71 IajdzWB80.net
simd
42:デフォルトの名無しさん
18/01/27 19:44:42.49 MtS5alc90.net
unordered_mapにsha256の関数渡せばええやん
43:デフォルトの名無しさん
18/01/27 20:08:58.78 6QrTsC7zM.net
fpga
44:デフォルトの名無しさん
18/01/27 22:07:02.09 bqR9C45e0.net
mapじゃなくてハッシュを実装しろとしか
45:デフォルトの名無しさん
18/01/27 22:15:03.18 Im+FAy1Qa.net
>>40
便利そうだと思ったけど、データ構造的にアライメント揃えられないから使えなさそう
>>41
ソート済みデータを扱いたいパターンもあるので使えないです
コード的にさっくり改善する方法がなさそうなので
map諦めてそこだけ完全自作することにしました
レスしてくれた方々サンクスです
46:デフォルトの名無しさん
18/01/27 22:53:57.64 ZP0gkUPd0.net
Compareの自作で何がいけなかったのかわからないけど解決おめ
47:デフォルトの名無しさん
18/01/27 23:05:46.83 r2gR5oNyd.net
赤黒木ってスマートポインタを使って実装できますか?
親を弱参照で書いたらわけわかめに
48:デフォルトの名無しさん
18/01/28 01:55:54.91 B1112Jntd.net
ハッシュをソートかあ
49:デフォルトの名無しさん
18/01/28 03:22:06.75 vIDP+sWr0.net
コピーしたくないオブジェクトへのポインタ(ていうか全体をシリアライズするの可能性も考えたらindexがマジお勧め)の配列おソートすれば良い
そういった実装の詳細はクラスの中に隠すことができる 何のためにC++を使っているのやヽ(`Д´)ノ!!!11!1
50:デフォルトの名無しさん
18/01/28 08:17:39.92 abHZXNlp0.net
>>47
なんかモヤモヤするなそれw
51:デフォルトの名無しさん
18/01/28 11:41:38.50 /ypN0hd6M.net
>>39
hashは値に対してユニークじゃないけどいいの?
52:デフォルトの名無しさん
18/01/28 14:41:11.23 .net
そりゃハッシュ衝突用のフィールドくらい作ってるだろうよ
質問にないことは心配しなくていいよ
53:デフォルトの名無しさん
18/01/28 15:09:59.60 RaXbFAH70.net
心配してるんじゃなくてバカにしてるんだよw
54:デフォルトの名無しさん
18/01/28 15:44:58.16 C2Jb//yt0.net
バカにしようとして失敗してるとしか見えないけど w
55:デフォルトの名無しさん
18/01/28 20:33:36.08 NzqukFwp0.net
Impliment.h
class Impliment
{
public: base;
};
Interface.h
class Interface
{
56:デフォルトの名無しさん
18/01/28 20:42:03.84 NzqukFwp0.net
すいません。途中で書き込んでしまいました。
以下のようなクラスを作ったのですが、
derivedがImp::baseを継承しているため、
インクルードの順番が固定されてしまいます。(Impliment.hが先でないといけない)
こういったクラスは使う人から見て嫌がられるでしょうか。
ご意見をいただけるとありがたいです。
Impliment.h
class Impliment
{
public:
class base {}
};
Interface.h
template<class Imp>
class Interface
{
private:
class derived : public Imp::base {}
}
57:はちみつ餃子
18/01/28 20:56:07.47 Xl/BPHGJ0.net
>>55
「XXの実装とインターフェイスが分かれている」ということをユーザが意識しないといけないのは抽象化の不足だと思う。
分離した形のデザインで開発するのはかまわないけど、ユーザに対してはなるべく隠すのが望ましい。
#include<Implement.h>
#include<Interface.h>
と書いたヘッダファイルを用意しておく程度のことでもだいぶんマシになる。
(インクルードガードはしておくこと)
58:デフォルトの名無しさん
18/01/29 02:50:08.46 gQcv+kbG0.net
>>55
普通は interface.h の冒頭で implement.h をインクルードしておく
59:デフォルトの名無しさん
18/01/29 05:39:18.37 +mqzfkB+0.net
>>55
このコードだけならインクルード順が逆でも問題ない。
60:デフォルトの名無しさん
18/01/30 20:17:26.27 fsahOVUj0.net
レスありがとうございます。
>>56
Implimentは複数あって、ユーザーが選ぶことができる
というのを想像して作っていました。
>>57
template化する前はそこでインクルードしていました。
>>58
たしかに、このコードだけでは大丈夫ですね。
正確にはこのコードだけではないので、他に原因があるのかもしれません。
ご指摘ありがとうございます。
61:デフォルトの名無しさん
18/01/30 21:08:08.01 VkcoBYQV0.net
Implement入れ替えさせたいならユーザーに適当な所で
template Interface<MyImplement>;
って書かせりゃいいだけじゃないの?
62:デフォルトの名無しさん
18/01/30 21:19:19.29 Lbh+cCVN0.net
typename imp::base
63:デフォルトの名無しさん
18/02/04 11:20:04.76 r6E1M8790.net
質問ですが
「このクラスはバイト列としてコピーできる」ということを明らかにするために
明示的にコピーコンストラクタを書くとして、
どう書けば処理系に依存することなくデフォルトのコピーコンストラクタ以上の性能になることを保証できますか
(もしくは、「このクラスはバイト列としてコピーできる」ということを明示する構文はありますか)
64:片山博文MZ
18/02/04 11:26:54.06 i7yJvuTcd.net
>>62
MyClass(const MyClass&) = default;
65:はちみつ餃子
18/02/04 11:36:31.71 H9FebDBN0.net
デフォルトのコピーコンストラクタはメンバのコピーコンストラクタを起動するので、
そのクラス (に属するオブジェクト) 全体がバイト列としてコピーするわけではない。
trivially copyable class の要件を満たすように書けばバイト列としてコピー可能と保証される。
コンストラクタの書き方だけでは保証できない。
66:デフォルトの名無しさん
18/02/04 13:04:56.23 WecC8o2P0.net
memcpyするコピコンをユーザー定義すればええやん
67:デフォルトの名無しさん
18/02/04 13:46:35.82 r6E1M8790.net
>>63
なるほど「= default;」のありがたみがわかりた
>>64
なるほどそれだと安全性の点でイマイチ…
バイト列としてそのままリモートPCに送ったりするクラスに誰かが
バイト列としてのコピーが可能でないコードを追加したとしても
コンパイラで検出する術が無いっぽいように読める
68:デフォルトの名無しさん
18/02/04 13:47:37.01 r6E1M8790.net
訂正
誤:バイト列としてのコピーが可能でないコード
正:バイト列としてのコピーを不可能にするコード
69:デフォルトの名無しさん
18/02/04 13:47:46.54 HBpG+TPK0.net
>>62
std::is_trivially_copyable<T>がtrueになるように書いて
URLリンク(cpprefjp.github.io)
トリビアル型とは何かは検索して
70:デフォルトの名無しさん
18/02/04 13:52:58.38 HBpG+TPK0.net
>>66
なおさらtype_traitsで条件に合わなければコンパイルを失敗させればよい
71:デフォルトの名無しさん
18/02/04 14:08:05.83 r6E1M8790.net
>>69
おk
72:はちみつ餃子
18/02/04 16:47:05.72 H9FebDBN0.net
>>65
まあ書こうと思えば書けないことはないが、
やった結果に整合性がとれるかどうかは別問題なのでな……。
73:はちみつ餃子
18/02/04 17:24:06.38 H9FebDBN0.net
流れをぶった切って質問するんだけど、
配列の一部をとる参照とかって作れない?
実際にはコンパイルが通らないけど、やりたいことはこんな感じ。
int a[3];
int (&b)[2] = static_cast<int (&)[2]>(a);
74:デフォルトの名無しさん
18/02/04 18:06:17.19 B+seqFts0.net
reinterpret_castすれば?
75:デフォルトの名無しさん
18/02/04 18:22:52.47 HJ1AdVlZ0.net
ポインタにして剥がせばいい
76:デフォルトの名無しさん
18/02/04 18:28:31.26 HBpG+TPK0.net
配列型はポインタではないので途中からとかない
77:デフォルトの名無しさん
18/02/04 18:55:06.41 i/oNqC3f0.net
一応うまく行ったけど規格で保証された挙動かどうかはよくわからない
URLリンク(ideone.com)
78:デフォルトの名無しさん
18/02/04 19:14:07.38 NcR26d4z0.net
でもポインタにしてしまうと困るシチュエーションなんてありうるの?
マクロの中でsizeofしてるとか?
79:デフォルトの名無しさん
18/02/04 20:30:26.18 WecC8o2P0.net
>>71
意味わかんねえ
どーゆーこと?
80:デフォルトの名無しさん
18/02/05 23:20:37.74 y5vbQcAP0.net
メンバのコピーコンストラクタを起動すべきところをmemcpy()しかしない手製コピーコンストラクタで済ませようとしたら破滅が訪れる
MyClass(const MyClass&) = default; なら勝手にやってくれるのでその心配が無いので安心
81:デフォルトの名無しさん
18/02/05 23:28:20.73 QTKEhMlZ0.net
しかしまあ >>68 なんていう便利なモノがあるとは
フラフラこういうスレ読んでるのもためになるなあ
82:デフォルトの名無しさん
18/02/06 07:54:17.35 CtmFRYuD0.net
>>79
>>62
83:デフォルトの名無しさん
18/02/06 08:05:48.85 cp/uvOeq0.net
>>62
処理系に依存することなく「
84:保証」なんて出来ない 以上
85:デフォルトの名無しさん
18/02/06 08:27:38.08 rGp9SuaC0.net
>>63で解決している
もしくは以下への回答も>>69で出ている
86:デフォルトの名無しさん
18/02/06 09:14:20.61 CtmFRYuD0.net
バイト列コピーが = default; なわけねーだろアホ
87:デフォルトの名無しさん
18/02/06 11:45:28.85 rGp9SuaC0.net
よく読め
バイト列コピーでokの保証は>>69
遅くならないコンストラクタの書き方が>>63
88:デフォルトの名無しさん
18/02/06 11:48:04.39 rGp9SuaC0.net
そもそも「どうコンストラクタを書けば」ってのを質問してるんで
バイト列コピーでコンストラクタを書けってのは単に>>65の珍解答に過ぎない
89:デフォルトの名無しさん
18/02/06 11:51:41.68 CtmFRYuD0.net
すまんが日本語でたのむ
90:デフォルトの名無しさん
18/02/06 11:54:37.03 rGp9SuaC0.net
元の質問>>62は
・処理系に依存せずデフォルトより遅くならないことが保証されているコンストラクタの書き方
もしくは
・バイト列コピーでokと明示する構文
だろ。
前者は>>63
後者は>>68-69
91:デフォルトの名無しさん
18/02/06 12:36:57.61 CtmFRYuD0.net
元質問: デフォルトのコピーコンストラクタ以上の性能
おまえ: デフォルトより遅くならないこと
よく読めをそのまま返す
92:デフォルトの名無しさん
18/02/06 12:57:03.34 bHMYZ9Vj0.net
以上っていうのは等しいかまたはそれを越えるという意味だぞ
93:デフォルトの名無しさん
18/02/06 14:01:35.47 rGp9SuaC0.net
そもそも memcpy は前者の性能保証も後者の仕様の保証もどちらも満たしてない
仕様が保証されてるなら多分性能的に大丈夫だろうという程度
間違いを認めると死ぬ病気なんだろうからもうこれ以上は言わない。
94:デフォルトの名無しさん
18/02/06 14:38:54.29 CtmFRYuD0.net
バイトコピーでmemcpyより高性能な手段を1つでも例示したらどうなんだ
> 間違いを認めると死ぬ病気なんだろうから
ああ、おまえがか
95:デフォルトの名無しさん
18/02/06 18:18:02.35 cp/uvOeq0.net
URLリンク(stackoverflow.com)
96:62
18/02/06 22:02:19.27 MckGyr3K0.net
memcpy()より速いコピー手段Xが仮にあったとして
論理的にmemcpy()で済むケースについてコンパイラが提供する
デフォルトのコピーコンストラクタがコピー手段Xにならない理由がわからん…
個人的には「=default;」と書いたら最高性能なんなら毎回手でmemcpy()とか書きたくないカンジ
97:デフォルトの名無しさん
18/02/06 22:06:49.77 CtmFRYuD0.net
>>94
class A {
public:
A() {}
A(A const&) { std::cout << "aho"; }
};
class B {
public:
A a;
B() = default;
};
int main()
{
B b, c = b; //this will call you.
}
98:デフォルトの名無しさん
18/02/06 22:09:42.68 MckGyr3K0.net
>>95は「論理的にmemcpy()で済むケース」では無いからちげう
99:デフォルトの名無しさん
18/02/06 22:29:22.47 CtmFRYuD0.net
だから日本語でたのむって言っただろ
100:デフォルトの名無しさん
18/02/06 22:29:24.08 MckGyr3K0.net
どうした?
訂正はよ
101:デフォルトの名無しさん
18/02/06 23:07:57.82 hdfY5rL3M.net
間違いを認めて・・・死んだのか?
102:デフォルトの名無しさん
18/02/06 23:21:41.18 MckGyr3K0.net
仕方ないので漏れが訂正するわ;
URLリンク(ideone.com)
↑のコードの
(*1)は「=default;」でデフォルトのコピコンの使用を明示
(*2)は手でmemcpy()でコピーするように書いたコピコン
次の条件で試したら(*1)も(*2)も同じコードになったわ
x86-64 gcc 7.2
-O2 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra
こことかで試せるが保存と公開方法がわからんかったのでideoneを使わせてもろうた
URLリンク(gcc.godbolt.org)
漏れの国語力ではようわからんが、さすがに多分>>84は間違いなんジャマイカ、
103:デフォルトの名無しさん
18/02/06 23:34:18.80 Ur4dB7lv0.net
Cから来た連中ってどうしてmemcpyやmemset使いたがるんだろうな
104:はちみつ餃子
18/02/07 04:09:18.59 OAPGz/K+0.net
>>76
reinterpret_cast でなければ通らないときはだいたい駄目なときやわ。
105:はちみつ餃子
18/02/07 04:
106:22:37.75 ID:OAPGz/K+0.net
107:デフォルトの名無しさん
18/02/07 05:00:09.29 1UF8v8gcM.net
開始アドレス、終了アドレス、サイズが64bit等で割り切れれば
バイトコピーより早いコピーはあるだろうね
108:デフォルトの名無しさん
18/02/07 07:27:28.65 .net
頭のいいコンパイラなら勝手にベクトル処理とかしてくれるんじゃないの?
知らんけど
109:デフォルトの名無しさん
18/02/07 22:28:51.20 MTpdY7NJ0.net
"!"!"!MOHYO!"!"!"2"
1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]]
2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL!
3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{
41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0
.3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end
{
110:片山博文MZ
18/02/10 19:52:35.19 x9I4Wn6Pd.net
C++では、
int i;
for (i = 0; i < 9; ++i) { ... }
が、
for (int i = 0; i < 9; ++i) { ... }
って書けるのは知っているだろう。( )の中で、変数を宣言できる。
だが、ifやwhileの( )の中で、変数を宣言できることを知らない人は多い。
111:デフォルトの名無しさん
18/02/11 04:31:12.99 9irhhPDg0.net
C++17では
if ( auto v = n; conditions ) {
...
}
が可能になるし、これからは広がってくれるかのう
112:デフォルトの名無しさん
18/02/11 06:11:03.22 l3GMmVaq0.net
>>108
これホント待ち遠しい
113:デフォルトの名無しさん
18/02/11 17:00:15.07 RGzNlubj0.net
それほど待ち遠しいか?
114:デフォルトの名無しさん
18/02/11 17:27:44.93 QA9xO9uU0.net
待ち遠しくない
115:デフォルトの名無しさん
18/02/11 17:34:07.64 A61Ds/EIM.net
for( ) の制御変数はそのループでしか使わないことが多いから意味あったけど、if( ) でそんなケースはまれだしなぁ
あれば使うけど待ち遠しいって言うほどじゃない気がする
116:
18/02/11 17:36:34.68 bT0HWvJB0.net
理想主義的な文法ですが、実効性はあるのか疑問ですね
117:デフォルトの名無しさん
18/02/11 17:40:12.67 KWDwqk940.net
一瞬意図が分からなかったが
()の中が;で区切れるという話?
118:デフォルトの名無しさん
18/02/11 17:41:52.24 rD0gl3AiM.net
dynamic_castとの組み合わせで使うとかどうよ
119:デフォルトの名無しさん
18/02/11 19:11:10.58 av7bQMHG0.net
結構あると思うけどね
if(DWORD err = GetLastError(); err != NO_ERROR)
この場合NO_ERRORが0だって分かってるから
if(DWORD err = GetLastError())
で済むから無意味だけど
120:デフォルトの名無しさん
18/02/11 19:17:28.82 yo2OB3cP0.net
>>116
前者の方が意図が明確だし意味はあると思う
121:デフォルトの名無しさん
18/02/11 20:06:43.52 .net
>>116
>if(DWORD err = GetLastError(); err != NO_ERROR)
普通こうやろ
if((DWORD err = GetLastError()) != NO_ERROR)
変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと)
複文書けるのは特にメリット感じないわ
122:デフォルトの名無しさん
18/02/11 20:41:29.80 Ag9E1Urq0.net
それ通らんよ
こうだろ
DWORD err;
123: if((err = GetLastError()) != NO_ERROR) if内でしか使わないerrが外部に漏れてるのがよろしくないってこと
124:デフォルトの名無しさん
18/02/11 20:56:03.30 .net
>>119
それが通るという変更だと思ってたわ
こう書けるPerlのほうがまだ優位性あるね
if((my $err = GetLastError()) != NO_ERROR)
125:デフォルトの名無しさん
18/02/11 22:10:23.49 p+z832PL0.net
if(init ; expr)だと初期化と式が関連していなくてもいいので>>120とは違う構文になる
だからこんなのでもよい
if(int err = GetLastError(); hoge.aho())
lock_guardもしておける
if(std::lock_guard<std::mutex> lock(m); flag)
構造化束縛も使える
if(auto [a, b, c] = f(); b > c){ std::cout << "b > c" << std::endl; }
126:デフォルトの名無しさん
18/02/12 12:22:30.52 sATukCOa0.net
Cでは名前空間っていうのをすごい扱っていた気がするんだけどC++は名前空間扱うことってないの?
一つのアプリケーションも完成させたことがないど素人の質問ですまんが
127:デフォルトの名無しさん
18/02/12 12:43:48.54 qekpeHDJ0.net
>>122
まずは"C"の入門書を読んで、何を見間違えたのかはっきりさせてからにしようか。
128:デフォルトの名無しさん
18/02/12 14:08:57.84 sGdsmrZD0.net
初心者スレに池
129:デフォルトの名無しさん
18/02/12 20:44:41.93 gfcybQxo0.net
>>122
気のせい。
130:デフォルトの名無しさん
18/02/13 00:10:36.10 YGwN9DGw0.net
>>122
Cにnamespaceは無いだろ
131:はちみつ餃子
18/02/13 17:30:20.31 tUR5ZBgZ0.net
構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
132:デフォルトの名無しさん
18/02/13 17:45:08.06 a1RYP/Gm0.net
こんな名前空間もあるね
int x;
int main(void)
{
x = 1;
int x;
x = 2;
{
int x;
x = 3;
}
return 0;
}
133:デフォルトの名無しさん
18/02/13 17:55:17.58 Xr6xvVy+M.net
それはスコープでは
134:デフォルトの名無しさん
18/02/13 18:15:03.36 a1RYP/Gm0.net
変数だよ
代入でもあるね
135:デフォルトの名無しさん
18/02/13 20:09:02.02 NNOtJgpO0.net
謎すぎワロタがそこから上のスコープのxを参照してくれ
136:デフォルトの名無しさん
18/02/13 20:19:22.41 Za/EZbH7M.net
ブロックって言ってる
137:デフォルトの名無しさん
18/02/13 21:49:01.90 a1RYP/Gm0.net
アホばっかり
がっかり
138:デフォルトの名無しさん
18/02/15 12:08:37.28 Sgd3BwBT0.net
std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、
キャッシュのような機能を実装したいのだけど、
C++でそのような仕組みを作れるクラスはないですか?
139:デフォルトの名無しさん
18/02/15 17:00:44.45 GbCJk+7h0.net
自分で実装するならどうにでもなるだろ
そのための道具は全て標準で揃っている
140:デフォルトの名無しさん
18/02/15 18:15:51.96 6url8MQd0.net
バックグラウンドならスレッド使うしかないんじゃないかな
141:デフォルトの名無しさん
18/02/15 19:13:27.39 CSnzpiZpM.net
C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ
142:デフォルトの名無しさん
18/02/15 19:34:35.63 95vLe5Bi0.net
>>137
どんな点が、性格悪い、と思わせるのですか?
143:デフォルトの名無しさん
18/02/15 20:03:21.73 qihnyYvs0.net
それだよそれ
144:デフォルトの名無しさん
18/02/15 21:14:35.68 MoAPifjS0.net
C++は多分チューリング完全だと思う
145:デフォルトの名無しさん
18/02/15 21:20:32.50 6nYos/bmM.net
>>136
要素数が閾値を超えるのは要素が追加される時だからその時に古い奴を削除すりゃいいだけじゃね?
146:デフォルトの名無しさん
18/02/15 23:50:52.95 fG1U9Z3qM.net
>>135
簡単で良いのでサンプルコード書いてもらえませんか?
147:デフォルトの名無しさん
18/02/16 00:43:14.82 uaG+5sVQ0.net
>>135じゃないけどシンプルにいくなら
{
map<key,value> data; // 本来のデータ
map<key,list<key>::iterator> lruindex; //
list<key> lrulist; // LRUリスト
... // mapと同じインターフェイス
}
みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい
148:デフォルトの名無しさん
18/02/16 03:16:29.76 DpsRPWWQ0.net
辞書・線形リスト・2分木を、組み合わせる。Ruby で書くと、
class LRU_hash
def initialize (max_size = 3)
# ary は、hash に追加・アクセスした順
@hash = {}; @ary = []
@max_size = max_size
end
def push (key)
if @hash.has_key? key
# 一旦、要素を削除してから、最後尾に追加しなおす
@ary.delete key
else
if @max_size == @hash.size
# 先頭要素を削除してから、最後尾に追加する
@hash.delete(@ary.shift)
end
@hash[key] = true
end
@ary.push key
end
def print_buf
puts @ary.join ', '
end
end
ary = ["あ", "a", "あ", "い", "b", "あ", "c"]
hash = LRU_hash.new 4
ary.map { |key| hash.push key }
hash.print_buf #=> い, b, あ, c
149:デフォルトの名無しさん
18/02/16 04:31:51.17 .net
>>144
> # ary は、hash に追加・アクセスした順
参照のたびに最後尾に追加しなおすの?
150:デフォルトの名無しさん
18/02/16 06:27:04.53 HICjIKnm0.net
プログラムを作っていて困っています。
プログラム動作環境、windows 7 x86_x64
プロセスをExplorerを親として、
起動したプロセスにファイルの存在するディレクトリを作業ディレクトリとして
割り当てたい。
ただし、プロセスへのアタッチによる変更は禁止とする。
ようするにファイルをダブルクリックして起動するのと同じ状況を再現したいのです。
例
C:\hoge\fuga.exe
[現状]
Explorer C:\hoge\fuga.exe
親
explorer.exe
カレントディレクトリ
C:\Windows\System32\
[理想]
Explorer C:\hoge\fuga.exe
親
explorer.exe
カレントディレクトリ
C:\hoge\
151:144
18/02/16 07:56:00.35 DpsRPWWQ0.net
>>145
>>134
で、LRU と書いてあるから、Hash に追加しようとした度に、
すでに存在する場合でも、配列の最後尾に追加しなおした
どういう意味か、正確にはわからないけど
152:デフォルトの名無しさん
18/02/16 08:03:01.53 TOIQut300.net
>>146
explorer.exeへのショートカットを作ってプロパティで作業ディレクトリを指定するか、
COMでIShellLink::SetWorkingDirectoryを使って同じことをするあたりか?
153:134
18/02/16 09:56:21.20 +b2iJMK40.net
みなさんありがとうございます。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも
無いかと思ったのですが、標準ではやっぱり無いですか。
>>143のように、std::mapをメンバの一つに持たせた独自クラスを
一から作っていくことになるんですかね。
154:デフォルトの名無しさん
18/02/16 10:11:55.71 JoalkiMd0.net
amazonランキングの謎を解く とか言う本でmove-to-frontを見た
本の紹介「Amazonランキングの謎を解く」
URLリンク(www.kenkyuu.net)
>「move-to-front規則」(最後に売れた順に並べる、つまり、注文のたびに1位にジャンプする)
Move To Front - Wikipedia
URLリンク(ja.wikipedia.org)
155:
156:デフォルトの名無しさん
18/02/16 10:54:10.09 TOIQut300.net
ageだね
157:デフォルトの名無しさん
18/02/16 14:25:37.67 UjPhOEUu0.net
>>149
「c++ lru map」でググったか?
いくつかサンプルになりそうなコードが見つかるんだけど
158:デフォルトの名無しさん
18/02/16 18:05:58.99 GGXfeEqkM.net
江添さんのC++17本予約しようかな
159:デフォルトの名無しさん
18/02/16 18:26:06.12 waI0am5S0.net
予約しなくても売れ残るからいつでも買える
160:デフォルトの名無しさん
18/02/16 20:04:35.13 1Lr9lxEpa.net
C++を勉強しようと思ってる者ですが書籍を探しております。Cはある程度書けるのでそれを前提とした書籍が欲しいです
161:デフォルトの名無しさん
18/02/16 20:33:50.33 Rc+MuzY40.net
C++ クイック入門&リファレンス
プログラミング言語C++ 第4版
162:デフォルトの名無しさん
18/02/16 20:36:34.10 9b60nRDg0.net
>>155
C++11 以前だが accelerated c++, ここでフォローするよ
163:デフォルトの名無しさん
18/02/16 20:37:11.23 TOIQut300.net
禿4は俺も推奨する
C++11の良本だ
164:デフォルトの名無しさん
18/02/16 21:09:12.34 +EaaPhKWa.net
めっちゃ高いけどその価値あるのね
165:デフォルトの名無しさん
18/02/16 21:46:03.21 5AmFsIq1M.net
こっちはフッサフサやでURLリンク(images-na.ssl-images-amazon.com)
166:デフォルトの名無しさん
18/02/16 22:03:34.89 qDhjnryl0.net
誰がハゲやねん
167:デフォルトの名無しさん
18/02/17 09:43:48.64 Lqib7/b9F.net
以下のようにconst char*型の文字列でchar*型の変数を初期化したいときに
strcpyやstrlenを書かずにstd::stringを利用して短くかけないかと思うのですが
msvcだとエラーにならず、clang, gccだとdeleteでセグメンテーション違反になります。
どうすればより良い感じになるでしょうか?const_castはできれば使いたくないです。
#include <string.h>
#include <string>
#include <iostream>
int main()
{
const char* asdf = "asdf";
// char* psz2 = new char[strlen(asdf)+1];
// strcpy(psz2, asdf);
std::string *psz = new std::string(asdf);
char* psz2 = &(*psz)[0];
std::cout << psz2 << std::endl;
delete psz2;
return 0;
}
168:デフォルトの名無しさん
18/02/17 09:51:35.08 mykV+fTk0.net
delete psz2なんてしちゃだめconst関係ない
169:デフォルトの名無しさん
18/02/17 10:21:38.22 4SqFrjwY0.net
何故stringそのものじゃなくて内部データをdeleteしようと思ったのか
newで確保した配列じゃないからdeleteはできない
stringの内部データは静的な配列と動的な配列を組み合わせて表現されている
mscvの場合先頭16文字はchar[16]でそれ以降は動的な配列に入るようになっている
psz[0]のアドレスはchar[16]の先頭アドレスなので当然deleteできない
msvcはdeleteに失敗しても落ちないのかな
170:デフォルトの名無しさん
18/02/17 10:47:53.57 IU1gsQgu0.net
>>155-159
本格的な本なら、ロベール、ハーバート・シルトの独習
軽めの本なら、柴田 望洋、林 晴比古、猫
171:デフォルトの名無しさん
18/02/17 11:22:13.08 ++v6vSjK0.net
ハンガリー人まだ絶滅してないのか。
stringはnull terminatedでないからpszはおかしい。
psz2もnull terminatedの保証がないからc_strを使うべき。
うまくいったらstrdupも調べとこうな。
172:デフォルトの名無しさん
18/02/17 11:25:45.81 szUqPRvW0.net
>>162
char* psz2 = &(*psz)[0]; って
char* psz2 = psz->c_str(); と同じなのかな?
いずれにせよ delete psz; は出来る(するべき?)だけど、
delete psz2; は出来ないんじゃないかな。
173:デフォルトの名無しさん
18/02/17 11:30:29.43 mykV+fTk0.net
必要ないところでnew/delete使う人は根本からして
174:何も分かってない
175:デフォルトの名無しさん
18/02/17 15:18:23.73 YAgvIyFy0.net
>>162
お前はstringがただの配列だと思っているのか?
このトンチキ野郎!
176:デフォルトの名無しさん
18/02/17 16:50:38.35 Q4Uv6cZz0.net
>>162
弁護士の唐沢です
しっかり「char* const」と「const char*」の違いを認識しなさい
const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね?
最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ
177:デフォルトの名無しさん
18/02/17 17:22:58.60 0j+aLKWi0.net
>>162
strdupという手があるが何がしたいのか今一つ分からない
const char* asdf = "asdf";
char *p = strdup(asdf);
std::cout << p << std::endl;
delete p;
178:デフォルトの名無しさん
18/02/17 17:31:15.32 CLg9GPlRM.net
>>170
それ誰に指摘してんの?とりいそぎ。
179:デフォルトの名無しさん
18/02/17 17:34:22.09 4SqFrjwY0.net
>>167
データは連続しているので同じになる
16文字まではスタックを使い、それ以上の長さになるとヒープにコピーされる
実装ではメンバの配列には何かしらのエスケープ文字が入る
ちなみにmsvcでは実装の都合上free(&str[0])で強引に解放できる
180:173
18/02/17 17:49:08.26 4SqFrjwY0.net
補足
スタックとヒープを使い分けるかどうかは実装依存
gcc、clang、msvcでは行われている
したがって短い文字列でnewを避けるためにstringを使わないというのは意味が無い
181:デフォルトの名無しさん
18/02/17 18:06:03.81 .net
>>171
strdupで確保した領域をfreeでなくdeleteするのは正しいの?
182:デフォルトの名無しさん
18/02/17 18:09:26.31 Lp1rq1Kt0.net
良いみたいだ
中でmallocで確保している
183:デフォルトの名無しさん
18/02/17 18:10:04.88 Lp1rq1Kt0.net
違う、freeで開放する
184:デフォルトの名無しさん
18/02/17 18:14:21.37 Q4Uv6cZz0.net
>>175
弁護士の唐沢です
mallocとdeleteは併用厳禁です。freeを使用してください
185:デフォルトの名無しさん
18/02/17 18:18:24.62 DOQJ47ER0.net
昔から気になってるんだが「解放」だよね...
186:デフォルトの名無しさん
18/02/17 18:25:00.27 Lp1rq1Kt0.net
そうでした、ごめんね
187:デフォルトの名無しさん
18/02/17 18:25:45.10 JVoP/9zU0.net
>>176
良くねえだろ ぼけ
>>179
開放はpublic的なニュアンスだよな
188:はちみつ餃子
18/02/17 18:45:39.74 uBckbaXI0.net
>>162
ぶっちゃけた話、 strcpy が一番短いと思う。
189:デフォルトの名無しさん
18/02/17 18:59:50.35 .net
>>182
strdup という答えが出てるのに何言ってるの?
190:はちみつ餃子
18/02/17 19:05:58.96 uBckbaXI0.net
>>183
strdup は C++ の仕様の範囲内ではないので……。
POSIX と MSVCRT に有るからほとんどの場合に十分といえば十分なのかもしんないけど。
191:デフォルトの名無しさん
18/02/17 19:07:20.59 u7LZaTzx0.net
>>166
接頭辞を見ればデータ内容の属性がワカルというメリットは他に代え難い
URLリンク(local.joelonsoftware.com)間違ったコードは間違って見えるようにする
あといちいちthis->xと書くよりも、すすんでm_xと書きましょう
192:デフォルトの名無しさん
18/02/17 19:21:01.63 u7LZaTzx0.net
strdup()だと明示的に開放コードをどっかに書かなくてはならなくて必ず忘れるので
せっかくC++なのでスマポ的にwrapすると良いと思う
193:デフォルトの名無しさん
18/02/17 19:37:41.81 JVoP/9zU0.net
ホワイトボックスなCでは許せるが
ブラックボックスなC++の流儀には全く合わない
それがstrdup
194:167
18/02/17 19:53:11.68 szUqPRvW0.net
>>173-174 教
195:えてくれてありがとう。 返されるアドレスは等しい値なのか、という単純な質問だったんだけど、 読み直してみたら分かりにくい質問文だと思っていた次第。 それにしても &(*psz)[0] って結構ややこしいのね。 オーバーロードされた[]演算子が返すcharへの参照、 に対してアドレス演算子&を作用させた結果、て感じかな。
196:162
18/02/17 20:37:30.76 uaRb1j8RM.net
すみません、たくさんレスありがとうございます。
_strdupにしてみたら期待の動作ができました。
ありがとうございました。
197:162
18/02/17 21:27:34.68 uaRb1j8RM.net
また質問してすみません。
msvc(vs2017)だとコンパイラをC++17にしても以下のプログラムで
C2664 'void (T *&)': 引数 1 を 'hoge *' から 'hoge *&' へ変換できません。
となってしまうのですが、コードにバグが有るでしょうか?msvcのバグでしょうか?
GCCやClangではコンパイルできます。
#include <memory>
struct hoge {};
template <class T>
inline void safe_delete(T*& p) {
if (p) {
delete p;
p = nullptr;
}
}
int main() {
std::unique_ptr<hoge, decltype(&safe_delete<hoge>)> sp{new hoge(), safe_delete<hoge>};
return 0;
}
198:デフォルトの名無しさん
18/02/17 22:11:53.16 IU1gsQgu0.net
(T *&)
そもそも、ポインタ・参照を、同時に使えるのか?
199:片山博文MZ
18/02/17 22:23:52.63 EwTJGG8Pd.net
new hoge()は変数じゃないから、代入できない。
200:
18/02/17 22:35:58.53 I0BNlfaX0.net
>>165
独習C++ はいいですね、特に演習問題「std::stringを再実装する」を絶賛します
これが書けるようになったらC++初級者をかたってもいいかもしれない、もしかすると解答は載ってなかったかもしれないけれども
201:デフォルトの名無しさん
18/02/17 22:35:58.70 ++v6vSjK0.net
>>185
どこから引用したのか知らんけど、そのページ読んでないだろ…
システムハンガリアンはまるで役に立たないって書いてあるぞ。
202:
18/02/17 22:43:42.94 I0BNlfaX0.net
>>194
(システム)ハンガリアンってそんなに悪いものなんですかねえ
いや、win32api がバンバンハンガリアンしているので、そんなもんか、と思っていましたが
203:デフォルトの名無しさん
18/02/17 22:51:12.84 ++v6vSjK0.net
>>195
OOPともTMPとも型推論とも相性が悪いからね。
MS自身ももう使うなって言ってる。
204:デフォルトの名無しさん
18/02/17 22:52:19.16 YAgvIyFy0.net
頭悪いヤツが多様するハンガリアン
205:デフォルトの名無しさん
18/02/17 22:54:25.25 YAgvIyFy0.net
嫌いだからハンガリアン意地でも使わなかった
dwやらszやらせっかくのフリーフォーマッとが台なしだよ
206:デフォルトの名無しさん
18/02/17 22:59:56.16 Q4Uv6cZz0.net
フリーフォーマットはクソコードの温床ナリよ
207:デフォルトの名無しさん
18/02/17 23:03:12.11 4SqFrjwY0.net
型を変えるたびに変数名も変えるのか
ごくろうやな
208:
18/02/17 23:08:35.57 I0BNlfaX0.net
>>191
それは「ポインタ変数の参照」で、たしか便利に使えた気がしますが…
明日にでもちょっと書いてみます、今日は疲れました…
209:デフォルトの名無しさん
18/02/17 23:22:18.45 2kmwzB0g0.net
>>195
システムハンガリアンは弊害ばかりだろうけど、アプリケーションハンガリアンは適切に使えば有益だよ。
210:デフォルトの名無しさん
18/02/17 23:25:09.87 4SqFrjwY0.net
mとかいらなくねってなって削ったら_から始まるようになった
211:デフォルトの名無しさん
18/02/17 23:38:55.74 u7LZaTzx0.net
データの属性としてサイズとか型そのものを明示したいときはシステムハンガリアンするしかないし、
よってWIN32APIがシステムハンガリアンを使って定義されるのは全く正しい
問題なのはアプリケーションハンガリアンすべきときと
システムハンガリアンすべきときが区別できない香具師が適当に使うと
被害甚大だということやがな…
212:デフォルトの名無しさん
18/02/17 23:41:05.97 YmD9lIL
213:j0.net
214:デフォルトの名無しさん
18/02/17 23:42:44.53 u7LZaTzx0.net
>>205
なぜシステムハンガリアンが有り得ないのかkwsk
DWORDを渡すABIがある日突然気まぐれにUSHORTに変わったりしたら困りはしまいか
215:デフォルトの名無しさん
18/02/17 23:49:32.45 YmD9lILj0.net
ググればいいだろ
積極的批判
システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、同時に変数名も変更するコストがかかる。変更を怠ると、たちまち不整合となり、保守の障害となるだけで一利もない。
C++やC#のような言語では型付けが存在するためにシステムハンガリアンを使用することによる利点はない[3]。
移植性を阻害する。
総称型、メタプログラミングとの相性が悪い。
消極的批判
いわゆる良書と呼ばれるようなC++本で、現在[いつ?]システムハンガリアンを採用している例が皆無。
かつてWindows API/MFCにおいてハンガリアンを全面的に採用していたMicrosoft自身が、.NET Frameworkではハンガリアンを禁止[1]している。
216:デフォルトの名無しさん
18/02/17 23:52:28.19 YEFSbrC50.net
申し訳ないがコピペディアからのウィキペはNG
217:デフォルトの名無しさん
18/02/17 23:54:40.85 4SqFrjwY0.net
型なんてマウスオーバーなりすれば表示されるだろ
変数名に書いておかなきゃわからないとかメモ帳で書いてるのかよ
218:はちみつ餃子
18/02/18 00:10:56.39 OOIPfNvY0.net
>>190
デリータはポインタが指す先のリソースを後始末するのが仕事であって、
ポインタが無効になるという処理は unique_ptr の側でやってくれるので、
ヌルを代入する必要はない。
むしろ unique_ptr 内で管理しているものをデリータが勝手に弄るのは好ましくないので、
参照で受けるのはやめてさしあげろ。
私なりに仕様を読んでこの場合をエラーにする根拠は発見できなかったが、
エラーになってくれる方がありがたい場面だと思う。
219:デフォルトの名無しさん
18/02/18 00:16:38.53 Ct2k6iqr0.net
デリータに渡されるのは左辺値と限らないからだろう。
220:はちみつ餃子
18/02/18 00:25:54.07 OOIPfNvY0.net
N3337 だと 516 ページの説明がデリータの要件だと思うんだけど、
デリータ d の型が D で ptr の型が unique_ptr<T, D>::pointer のとき式 d(ptr) が valid であることと書いてあって、
ptr が rvalue か lvalue かってのは特に指定がない。 (どこかに書いてあったりする?)
この説明で言ってる ptr が変数名なのだとしたら暗に lvalue とほのめかしてるようにも思えなくもないし、よくわからん。
わからんことは避けて通りたい。
221:はちみつ餃子
18/02/18 00:30:57.46 OOIPfNvY0.net
私なりの見解としては未定義だと思ってる。
未定義ならばやったらエラーになる方向にしてくれる方がありがたいという思い。
222:デフォルトの名無しさん
18/02/18 00:35:36.09 ju8BsRCFM.net
>>206
ABIにシステムハンガリアン関係ないだろ…
APIを指してるとして、呼び出し側はリファレンスマニュアルなりIDE機能なりを利用して引数の型情報も
システムハンガリアンが付いている仮引数名と同時に参照しているはずだよね?情報重複してるけど本当に必要?
仮引数名のシステムハンガリアンの有無に関わらず、APIのシグネチャは用意に変更してはならないものだけど、
そもそも仮引数名はシグネチャじゃないからシステムハンガリアンがついていたって何の保証にもならないよ?
223:はちみつ餃子
18/02/18 00:51:32.90 OOIPfNvY0.net
重複する情報をコンパイラの支援なく一致させ続けることが出来るだろうか。 いや、できない。
って話よね。
まあ世の中にはそういうのを検査するツールとかもあるんだろうけどさぁ、
そういうツールを導入できる環境ならまともな IDE だって使えるだろう。
224:162
18/02/18 08:06:35.40 F3zIry6ZF.net
>>210
>>211
レスありがとうございます。
shared_ptrだと行けるのでなんかすればコンパイル通るのではないかと
思ったのですがだめなんですね~。
普通に使う用とカスタムデリータに使う用と二種類用意してやり過ごしてみたいと思います。
template <class T>
inline void safe_release(T*& p) {
if (p) {
p->Release();
p = nullptr;
}
}
template <class T>
inline void custom_deleter(T* p) {
p->Release();
// p = nullptr; no meaning
}
225:デフォルトの名無しさん
18/02/18 12:41:44.81 OWXn9djh0.net
>>207
藻前はレスをきちんと読んでいないのではないか
>システムハンガリアンを使っているソースコードを修正してデータ型を変更した際、同時に変数名も変更するコストがかかる。(>>207)
に直接対応する元レス>>206は、
>データの属性としてサイズとか型そのものを明示したいとき(>>204)
について述べているのでデータ型変更時のコストを言い立てても批判にならない
消極的批判については、アプリケーションハンガリアンすべきときと システムハンガリアンすべきときが
区別できない香具師の的外れな批判がクソウゼーからそうなったのかもしれん、
(ちな両者を区別できない香具師への警戒も>>204で言及済み
226:デフォルトの名無しさん
18/02/18 12:42:38.82 OWXn9djh0.net
>>214
十分賢いIDEが人間のミスを完璧に排除してくれるんならそうかもしれんが
システムハンガリアンをしてはいけないという積極的理由にはやはりならないのであった
それとも「間違ったコードは間違って見えるようにする 」(>>185)の効能を全否定する?
APIの定義は変わらなくとも、それを利用するソースコードがころころ変わり得るわけで、
byStrLength
にある日だれかがDWORD型の値を突っ込んだとしたら…
こういうケースを考えたら、「接頭辞を見ればデータ内容の属性がワカルというメリット(>>185)」は
ありえないぐらい賢いIDEでも使わないと他に代え難いと思うがどうか、
>>198
>嫌いだからハンガリアン意地でも使わなかった
おk ようやく建設的な議論に着手できる、
227:デフォルトの名無しさん
18/02/18 13:01:54.53 Tc3/Tap60.net
あり得ないくらいバカなプログラマのことなんか考慮してない
228:デフォルトの名無しさん
18/02/18 13:02:14.72 hSV7DJYb0.net
マウスオーバーで変数の型を確認できたり、縮小変換に警告を出してくれたりする程度のありふれた機能が、ありえないぐらい賢いとな
お前さんはメモ帳でコーディングしてるのか
229:
18/02/18 13:06:54.12 AAhzNgFK0.net
>>220
emacs にもそんな機能がほしいと思うことがあります
230:デフォルトの名無しさん
18/02/18 13:20:53.92 y51LwXumd.net
システムハンガリアンでミスを減らせるなんて事はない
むしろ害悪
231:デフォルトの名無しさん
18/02/18 13:27:53.30 Tc3/Tap60.net
>>221
俺のemacsには搭載されてるんだが
環境構築もプログラマの腕のうちだからな
232:はちみつ餃子
18/02/18 13:30:05.77 OOIPfNvY0.net
>>221
有るよ。
irony-eldoc や company-mode を入れろよ。
Emacs こそ最強の IDE だろうが。
233:デフォルトの名無しさん
18/02/18 13:38:55.48 R2RwPqEs0.net
今時システムハンガリアンを使うやつはあり得ないくらいのバカだということが決定しました
234:デフォルトの名無しさん
18/02/18 13:41:43.01 IMbK2zhKM.net
>>218
間違ったコードは間違ったように見えるようにする、について、
あなたが指し示した引用元が言及してるのはアプリケーションハンガリアンについてなんだけど…
システムハンガリアンについては否定的意見。
ちゃんと読んだの?
235:
18/02/18 14:10:40.14 AAhzNgFK0.net
>>223 >>224
thanks a lot!!
236:デフォルトの名無しさん
18/02/18 14:15:44.65 IMbK2zhKM.net
>>218
APIの仮引数にシステムハンガリアンをつけたことで、間違ったAPI呼び出しが間違ったように見えるのはいつ?
APIのリファレンスなり宣言文なりを自分のコードと見比べたときでしょ?その時必ず型情報も見てるよね?情報重複してるよ?
あとIDEが自動でミスを排除してくれるなんて書いてないよ?ちゃんと読んで
237:デフォルトの名無しさん
18/02/18 15:46:49.02 Tc3/Tap60.net
入れる変数の型と引数の型を確認しない奴とかいるのか
暗黙の型変換は警告を出せばいいし
どうしても見落とすのならコンパイルエラーにしてしまえばいい
あとメンバ変数もテキストの色を変えればいいからm_もいらない
238:デフォルトの名無しさん
18/02/18 16:01:36.00 dLlRK2Wa0.net
m_はホント見苦しい
239:デフォルトの名無しさん
18/02/18 20:07:07.34 8oVyjimH0.net
m_だけならまだ我慢できるけど
this->を必ず付けるルールと併用するのは本当にやめろどっちかにしろ
240:デフォルトの名無しさん
18/02/18 20:15:52.43 eae4wPFh0.net
> this->を必ず付けるルール
破門だろ
C++使うなそんなボケどもは
241:デフォルトの名無しさん
18/02/18 21:14:42.68 SQcbDAgv0.net
ちげえんだよなぁ
thisというキーワードが存在してるから、その存在そのものが、それを書かねばならないような強制力を産み出してる
「存在するが、書かなくてもいい」っていうどっちつかずが、一番論争になる
その反対が「存在しないから書けない」だ
これだと単純明快だ
なんせ、書けない
「書くべきか書かざるべきか」のどーーーでもいい二択に迫られると、とたんに宗教になる
242:デフォルトの名無しさん
18/02/18 21:16:52.71 eae4wPFh0.net
キーワードが存在するのと実体が存在することの違いがそんなに大事なのか?
じゃあvtableのキーワードが存在しないことを、おまえはどう考えている?
243:デフォルトの名無しさん
18/02/18 21:33:09.71 Pbt6vSqU0.net
>>231
オケツに_をつけてますわ
244:デフォルトの名無しさん
18/02/18 21:33:14.46 dLlRK2Wa0.net
おれがそのソースを引き継いだらまず初めにやることは一つ
「this->」から「」への全ソース一括置換
245:デフォルトの名無しさん
18/02/18 21:56:25.56 Ct2k6iqr0.net
「m_」はダメで「_」ならいいってのはなんというか、合理的な理由よりも感覚・感情的なものかね。
246:
18/02/18 21:57:31.39 AAhzNgFK0.net
this-> つけるほうが分かりやすくていいと思うのですが、変てこな接尾辞・接頭辞よりも
247:デフォルトの名無しさん
18/02/18 22:00:36.01 tWqaO5mz0.net
m_xxx も xxx_ もなんの保証にもならんからな
this->は必ずメンバになるけど
248:デフォルトの名無しさん
18/02/18 22:37:59.28 UEE7OeWn0.net
_はグーグルスタイルの圧力
249:デフォルトの名無しさん
18/02/18 22:42:10.00 WjKwYRHz0.net
余計な命名規約を作るくらいなら言語機能を使った方が良いわな
this->派だわ
250:デフォルトの名無しさん
18/02/18 23:21:23.43 AjuHfv4B0.net
thisで明示した方が所在がハッキリして良いナリ
当職は名前空間もusingせずに明示しろ派ナリ
安易な省略はタイプ数を減らすという軽微なメリットと引き換えに可読性を落としケアレスミスを誘発するという恐ろしいデメリットを孕むナリ
251:デフォルトの名無しさん
18/02/19 00:00:39.93 hDVR9PRD0.net
>>237
「m_」はいらないな
↓
ローカル変数とかと名前が被ってめんどくさい
↓
キャメルケースにはしたくない
↓
「_」だけ残る
252:デフォルトの名無しさん
18/02/19 00:14:25.92 o8qstbSZ0.net
_付けるなら変数の後ろだろ
253:デフォルトの名無しさん
18/02/19 00:18:14.94 .net
C/C++なら必然的に末尾に付けるしかない
先頭に_付けるような情弱は死ねばいい
Perl/Pythonだと先頭に付けるけどな
254:デフォルトの名無しさん
18/02/19 00:42:17.66 SSx66hQd0.net
やらんけど、前一つなら規約には引っかからないんじゃなかったけ
255:デフォルトの名無しさん
18/02/19 00:57:15.60 hDVR9PRD0.net
未定義なのは
_始まりでグローバルスコープにあるもの
_始まりでアルファベットの大文字が続くもの全て
__で始まるもの全て
1番目の_始まりなだけならローカル変数、引数、メンバで�
256:ヘ予約されていないので使ってもよい
257:はちみつ餃子
18/02/19 01:15:36.25 gMMBYzvP0.net
>>238
名前に変なルールを導入するか this を付けるかの二択であれば this の方がマシというのはわかる。
わかるが、必ずつけるルールにしちゃうとかなりウザいわって話。
258:はちみつ餃子
18/02/19 01:20:40.79 gMMBYzvP0.net
>>242
わかるんだが、そういうルールってすぐに教条主義に陥るからうんざりする。
技巧として使う using にまでグダグダ言うやつが絶対に出てくる。
259:デフォルトの名無しさん
18/02/19 02:05:55.66 hDVR9PRD0.net
コーディング規約はうろ覚えだけど自由度の高いBoostスタイルを薦める
publicな識別子はstdに合わせて小文字スネークケース
マクロはBOOST_から始める
インデントはスペース、一行の文字数は80文字を推奨
意味のある名前を付けることを推奨
ファイル構成に関するもの
その他細々としたもの
ライブラリごとのローカルルールがある場合もある
あとは自由
thisを付けろだとか改行の仕方だとかは一切書かれてない
260:デフォルトの名無しさん
18/02/19 02:37:36.58 SEa8F8NC0.net
>>248-249
お互いにマナーを守る世界は過ごしやすいがマナーの厳守を要求し出すと途端に息苦しくなるナリ
自分にも他人にも読み易いコードを書こうという気遣いが見て取れるなら細かく突っ込んだりはしないナリ
261:デフォルトの名無しさん
18/02/19 05:40:18.76 wBFQMwB50.net
this->で必ずメンバというやつら
じゃあ必ずブロック内変数という表記もしたらどうだ
262:デフォルトの名無しさん
18/02/19 12:45:29.69 yTAVcy/Ya.net
使うライブラリや開発環境の内部のスタイルに合わせるけどな。
派生クラスとかAPIのラッパークラスとか作り始めると、
どうしても内部の書き方に合わせておいた方が読みやすいし。
今でもWin32とかMFCでやることもあるけど、
そのときはm_とかpとかhとかdwとかバンバンつける。
263:はちみつ餃子
18/02/19 13:19:17.15 gMMBYzvP0.net
使う側の都合に合わせろよ。 ラップしてるのに中身のスタイルが漏れてるんじゃラップの甲斐がなくね?
中身を知ってる人がちょっとした便利のためだけに薄いラッパを作る場合ならそういう選択もあるだろうけど。
264:デフォルトの名無しさん
18/02/19 14:36:30.11 00nJVfHA0.net
コンバータにあわせろよ。C#で作ってコンバータかけた方が綺麗スッキリするんだから。
265:デフォルトの名無しさん
18/02/19 19:36:41.65 2cNNs3G6M.net
>>253
そりゃAPIに渡す構造体でdwSizeとか使われてたらそこだけは合わせざるを得ないけど自分のコードスタイルを合わせる必要はないだろ
266:デフォルトの名無しさん
18/02/19 20:29:38.46 czaD+lHv0.net
>>230
m_のmは目立つのm、
>>228
ここ構造体メンバとか、
267:
18/02/21 00:43:21.00 jU0tYaxw0.net
Windows メインで作業されている方で、
valgrind を併用している方はおられませんか?
もしよろしければ使用感をお聞かせいただけませんか
operator new()/operator delete() 乗っ取りデバッグに限界を感じてしまっている状況です
(cl や bcc32/bcc32c/bcc64 では new/delete 乗っ取りができません)
いや、さっさと入れればいいのですが、仮想環境とかよくわからないし…Vine Linux 以来触ってないし…
268:デフォルトの名無しさん
18/02/21 01:13:14.52 wPLJFyuu0.net
windowsならapplication verifier使えば?
269:デフォルトの名無しさん
18/02/21 09:49:28.54 8k15W99L0.net
以下のURL
270:のプログラムでSFINAEを試してみていて https://wandbox.org/permlink/LqKmn50PaPbtohs5 BOOST_TTI_HAS_MEMBER_FUNCTIONを使えば has_funcというメタ関数を使わずに済んで、短くできないかと試行錯誤中なのですが うまく行きません。 どうやったらビルドが通るようになるでしょうか?
271:デフォルトの名無しさん
18/02/21 18:31:01.90 8+abUSIR0.net
まずはそのうまく行かないコードを示したら?
272:片山博文MZ
18/02/21 19:26:19.92 UifE8nP3d.net
>>260
URLリンク(stackoverflow.com)
273:260
18/02/21 19:34:37.06 EmINyJBAF.net
すみません、BOOST_TTI_HAS_MEMBER_FUNCTIONを使って短くする以前に元々が間違っていました。
以下の3つでオーバーロードしたかったのでした。
・funcというメンバ関数を持つダブルポインタ
・funcというメンバ関数を持たないダブルポインタ
・それ以外
それで思ったのですが多分、Boost.TTIライブラリで
〇〇というメンバ関数を持つクラス、を識別するメタ関数は作れても
〇〇というメンバ関数を持つクラスのダブルポインタ、は無理な気がしてきました。
一旦諦めようと思います。
274:260
18/02/21 23:10:49.37 EmINyJBAF.net
msvcでもGCCでもビルドできるのが
どうにかできました。お騒がせしてすみませんでした。
URLリンク(wandbox.org)
275:デフォルトの名無しさん
18/02/22 10:26:41.79 qwLRFwLN0.net
>>263
あと2年待てばconceptできるかもよ
276:デフォルトの名無しさん
18/02/22 21:31:34.66 SOkZDC9P0.net
(VBみたいな名前付き引数が実現されたら
システムハンガリアン否定論者をぎゃふんと言わせられるのに…
277:デフォルトの名無しさん
18/02/22 21:55:24.65 qwLRFwLN0.net
システムハンガリアン発祥の会社が何か作ったら否定論者がぎゃふんと言うのか?
おまえの頭の中は論点先取だか循環論法だかがグルグル回っているようだな
278:デフォルトの名無しさん
18/02/23 22:10:42.23 XlnyEs6k0.net
↑
想像してごらん全ての人々が
dwRet = ::WaitForSingleObject( hHandle = m_hThread, dwMillisecond = m_hTCTmo )
と書く世界を、
279:デフォルトの名無しさん
18/02/23 22:11:40.62 XlnyEs6k0.net
ごめ
誤: m_hTCTmo
正: m_dwTCTmo
見れば間違いがワカルのがハンガリアンの極めて良いところ
280:デフォルトの名無しさん
18/02/23 22:21:40.17 R3lraTlNM.net
>>269
>>196
281:デフォルトの名無しさん
18/02/24 10:44:07.22 mn7A8TMg0.net
一分間で間違いに気づいてはいるものの
そもそもの書く瞬間にはどうやら人智を用いても気付けないらしいから
IDEにエラー出してもらった方が早いんじゃあねえの
実は人間の集中力を超えたところにある方法論で、実践するとストレスが溜まるっぽいから、機械任せにした方がいい
それに、書いてる最中は変数の型まで考えたくない
見て分かることは、機械任せにすれば見なくても分かるから、
今のご時世、人間の有限の集中力を目視チェックなんかに使いたくない
脳みそのリソースはもっと別のところに使うべきだ
つまりは、書いてる最中は脳みそが「それが正しい」と思い込んでるから、
間違いは自分自身では絶対に分からない
これがバグを作り込む
h
282:だったかdwだったかを脳が自動的に混同してるから、その分だけ余計に脳のリソースを使っている 「なんで書いている最中に自分自身で気付かないのか」、これ、とても重要だよ
283:デフォルトの名無しさん
18/02/24 11:11:20.01 51zBno3Kd.net
変数名と型が一致してるという保証がゼロだからシステムハンガリアンなんて無駄以外の何物でもない
無駄というか悪
284:デフォルトの名無しさん
18/02/24 12:15:45.87 mm9B9rZ50.net
>>272
俺のレスもプログラムも表現と意図が一致してるという保証がゼロ、
まで読んだ
285:デフォルトの名無しさん
18/02/24 12:23:50.23 b3ZDZ7IS0.net
その場合、やめられる方だけやめればいいな
つまりハンガリアンを。
286:デフォルトの名無しさん
18/02/24 12:27:42.98 pqM6ijVV0.net
まともな開発環境使っていれば必要ないのでは
287:デフォルトの名無しさん
18/02/24 12:34:43.53 B9f7/evx0.net
ハンガリアンはもうだめだ。
ポーランドを使おう。
288:デフォルトの名無しさん
18/02/24 12:51:07.68 d7+fd25J0.net
>>272
そういう事言い出すと「関数名と機能が一致してる保証がゼロ」や「クラスメンバの隠蔽が完璧である保証がゼロ」などといくらでも難癖を付けれるナリ
ヒューマンエラーを理由に不要と結論付けるのならあらゆるコーディング規約が不要という結論になってしまう、これはいけない
命名規則は可読性の向上に結びつくものでなければならない、規約を違反する事で起きるトラブルはプログラマ側の責任、それは分かるよね?
289:デフォルトの名無しさん
18/02/24 13:26:14.86 b3ZDZ7IS0.net
ヒューマンエラーが起きる部分は極力排除して機械任せにできる部分は機械任せにすればいい
ハンガリアンを導入する理由はもはや無いな。可読性悪いし。
290:デフォルトの名無しさん
18/02/24 14:24:10.94 yWQ45jBy0.net
>>278
いや、ハンガリアンは可読性はよくなる方だよ
整合性維持に難があるだけで
291:デフォルトの名無しさん
18/02/24 14:29:08.35 mm9B9rZ50.net
可読性ぐらいテンプレートによる高度なメタプログラミングに慣れた諸兄なら
ハンガリアンごとき目を慣らして解決できるはずなんじゃ…
292:はちみつ餃子
18/02/24 15:03:19.72 ohURjCBl0.net
URLリンク(www.google.co.jp)
293:はちみつ餃子
18/02/24 15:06:09.97 ohURjCBl0.net
>>276
Lisper「せやな!」
294:デフォルトの名無しさん
18/02/24 17:03:03.20 agv5rOmv0.net
>>276 >>282
両者は共存不可能な対立概念ではないけどね。
細かいことを言わせてもらえば、
「ハンガリアンとポリッシュ」か「ハンガリーとポーランド」と
並べてくれた方が座りがいい気もするけど…。
「ハンガリアン記法とポーランド記法」だとあまり気にならない不思議。
295:デフォルトの名無しさん
18/02/24 17:08:35.75 4JIC+wG/M.net
なぁにその内、ロシアが併呑してくれるさ
296:デフォルトの名無しさん
18/02/25 14:16:53.97 8l5JrV0a0.net
>>266
名前付き引数イディオムとenable_if<is_same<...>::value>が最強と言うことだな
※プログラマが、使用者が型を間違えないようにと気を使うのが正しいなら、間違えたらコンパイルエラーになるこれが最強だろ?
297:デフォルトの名無しさん
18/02/25 14:35:24.31 zhzj1IkW0.net
>>277
ちげえんだよんぁ
可読性じゃねえんだよ
>>268を見てみろよ、
読む時じゃなくて書く時のヒューマンエラーだ
なんで入り込んだのか全く分からんようなミステイクだ
プログラミングが工業的生産の一種なら、その手のヒューマンエラーは無い方がいい
で、改めて>>268を見てみると、「可読性」があってプレフィクスの間違いに気付いてはいるものの、
そもそも書く段でなんで間違えたのか、それが全く分からない
他人はおろか本人すらも自覚できない謎の理由でプレフィクスを間違えてる(これがヒューマンエラーなんだけどな)
な
298:んで、後だしジャンケンだと、「プレフィクスが最初から無ければ、間違いも発生しえなかった」、とも言える もしかすると、書く時に間違える/読む時に間違える の比率を考えると、ハンガリアン記法は書く時に間違えやすいが読むときに間違いにくい……のトレードオフなだけかもしれん 要するに、可読性と生産性のトレードオフだけなんじゃあねえのか? それに、読む時のヒューマンエラーと書く時のヒューマンエラーをわざと混同してるのはいただけない
299:デフォルトの名無しさん
18/02/25 16:15:03.29 s5td7qK+0.net
void func(int a)
{
300:デフォルトの名無しさん
18/02/25 16:15:31.06 s5td7qK+0.net
void func(int a)
{
//aが何型かわからない
//アホかおまえは
}
301:デフォルトの名無しさん
18/02/25 16:46:37.12 s5td7qK+0.net
template <typename T>
void func(T lpszA)
{
//lpszって書いてあるからTはLPSTR型だな
//アホかおまえは
}
302:デフォルトの名無しさん
18/02/25 19:14:43.19 4jIr3vvu0.net
>>288
func()が常に1画面に収まって1万行の関数とかでありえないという根拠は
>>289
テンプレート定義時の引数に対して引数内容固有の命名が難しいのは
ハンガリアンに限ったことではないからハンガリアンに対する批判になんね
テンプレート批判論者には考える力がないのかね…
303:デフォルトの名無しさん
18/02/25 19:15:39.42 4jIr3vvu0.net
ごめ
×:テンプレート批判論者
○:ハンガリアン批判論者
304:デフォルトの名無しさん
18/02/25 19:29:08.16 s+qaK1zS0.net
テンプレートに対してはハンガリアンは全くの無力だよなあ
一貫性の観点からやっぱりハンガリアンは無い方がいいわ
305:デフォルトの名無しさん
18/02/25 19:48:52.19 4jIr3vvu0.net
.>>290のレスを見てテンプレートの実体化時までハンガリアンが無力なことにされてはかないませんなあ…
306:デフォルトの名無しさん
18/02/25 20:11:05.52 fbPK05Px0.net
そもそも関数が長い場合は型情報を持たすのもありだよな
システムハンガリアンをやめさせようとして先に関数を短くしなきゃだめだなと追う結論に至って放置した
307:デフォルトの名無しさん
18/02/25 20:37:38.24 s5td7qK+0.net
//1万行の最長不倒関数を書く
//アホかおまえは
308:デフォルトの名無しさん
18/02/25 21:00:14.67 s5td7qK+0.net
void func(int lpszA)
{
//lpszって書いてあるからLPSTR型だな
//アホかおまえは
}
309:デフォルトの名無しさん
18/02/25 21:58:30.83 qLuvVokt0.net
システムハンガリ理解してない人の例上げてね?
310:デフォルトの名無しさん
18/02/25 22:45:03.97 4jIr3vvu0.net
>>295
「1画面に収まらない」を都合よく無視しないように
311:デフォルトの名無しさん
18/02/25 23:43:59.89 yscCG2q60.net
システムハンガリアンはDWORDをintに型名変更するだけでその変数名全部終わるからなしかも一瞬で
312:デフォルトの名無しさん
18/02/25 23:57:37.89 .net
>>299
dwをiに置換するだけだからリファクタリングが楽っていう意味?
313:デフォルトの名無しさん
18/02/26 00:59:51.78 VDQLjiDS0.net
まったく逆だ
dwからiに全部置換していかないと変数名の意味を為さなくなるからシステムハンガリアンは愚かさ甚だしいと云うておる
314:デフォルトの名無しさん
18/02/26 01:02:48.27 VDQLjiDS0.net
アンパンマン調で例えるなら型名変えるだけでメンテ百倍みたいな
315:デフォルトの名無しさん
18/02/26 01:10:40.33 jQ6YvoyL0.net
組み込み型はいいけどクラスはどうすんのさ
意味の分からないサフィックスを付けられても困るぞ
316:デフォルトの名無しさん
18/02/26 01:11:26.04 VDQLjiDS0.net
ハンガリアン!新しい型だよ!
有難う!デザパタ娘ちゃん!
メンテ百倍!ハンガリアン!
317:デフォルトの名無しさん
18/02/26 01:55:04.49 4PPe6ndQ0.net
そもそもDWORDをintに変えることが滅多にない
318:デフォルトの名無しさん
18/02/26 02:10:59.71 jQ6YvoyL0.net
dwとか書かれてもDWORDの定義を知らないと意味不明だし
やるなら符号の有無とサイズが分かるように書かないと意味ないでしょ
319:デフォルトの名無しさん
18/02/26 04:56:46.87 lxlU26hn0.net
>>298
おまえは間違いなく1万行と書いた
その史実を誤魔化すことはできない
「ありえないという根拠は」という問いを反論として用いるのは
俺が「ありえない」と言った(事実と違うが)ことが
おまえが「ありうる」と思っているのと違ったからだろう
いずれにせよ「アホかおまえは」にふさわしいハチャメチャだな
320:デフォルトの名無しさん
18/02/26 08:02:35.99 SPD4iDfM0.net
ポインタのpとか参照のrとかは今でも使ってる
321:デフォルトの名無しさん
18/02/26 08:09:57.39 .net
>>307
史実とか言っちゃうのって。。。
322:デフォルトの名無しさん
18/02/26 08:16:32.18 TvC1o7QC0.net
>>307
もうちょっとまとめて喋れ
読みづらい
323:デフォルトの名無しさん
18/02/26 09:55:53.14 lxlU26hn0.net
>>308
俺も使う
ただし名前そのものをポインタっぽくするだけで
ハンガリアンのプリフィックスとしてではない
324:デフォルトの名無しさん
18/02/26 09:56:14.50 lxlU26hn0.net
>>310
ニホンゴワカリマスカ?
325:デフォルトの名無しさん
18/02/26 10:44:04.77 U+kFnN5D0.net
ハード直叩きのドライバ屋はデータバスやレジスタの幅を間違えると大変だから
物理層の実装ではハンガリアン使うこともあるよ
326:デフォルトの名無しさん
18/02/26 10:55:31.04 n/n1Eejna.net
>>313
むしろそれはアプリケーションハンガリアンじゃね?
327:デフォルトの名無しさん
18/02/26 11:21:30.74 mt/mMzV6d.net
間違えると大変だからハンガリアンを使ってはならないんだよ
偽の情報に頼るんではなくて元を逐一確かめないと
328:デフォルトの名無しさん
18/02/26 11:33:14.68 yfGCkThX0.net
今勉強してるんだけどC++ではポインタを使わずに参照で書くのがデフォルトなの?
329:デフォルトの名無しさん
18/02/26 11:36:50.47 TvC1o7QC0.net
>>315
不一致が存在しない事が保証されてれば問題無いんやな
そういう事ならつまり変数宣言とプレフィックスが全て一致してるかチェックするスクリプトとかがあれば満足って事でええんか?
330:デフォルトの名無しさん
18/02/26 11:38:09.46 n/n1Eejna.net
>>316
ポインタも必要に応じて使うけど、メモリ管理の煩雑さとミスの危険性を避けるために参照やスマートポインタやコンテナ、イテレータなど他に適切な物がある時はなるべくそちらを使うのが流儀かな。
331:デフォルトの名無しさん
18/02/26 11:51:17.55 lxlU26hn0.net
>>316
デフォ・・・まあ、そう言えなくもないか
参照でもポインタでもどっちでもいい用途には参照
ポインタでしかできないことはNULLに++や絶対番地指定
参照でしかできないことは一時オブジェクトやコピコン類
332:デフォルトの名無しさん
18/02/26 12:15:47.61 z/vehsiL0.net
書き込むときは参照ではなくポインタにしろと言ってた人がいた。
理由を聞いたら「なんか書き込んでる感がない」だった。
333:デフォルトの名無しさん
18/02/26 12:17:18.65 lxlU26hn0.net
std::cin >> &a;
やだよ、こんなの
334:デフォルトの名無しさん
18/02/26 12:21:09.58 W3q5coR10.net
グーグル規約だと書き込む引数は参照ではなくポインタにしろってなってる
でも標準ライブラリが普通に参照で書き込んでるので意味ないかなと思う
335:デフォルトの名無しさん
18/02/26 13:05:03.30 LqmnPPXld.net
やC++糞
336:デフォルトの名無しさん
18/02/26 13:30:49.55 jQ6YvoyL0.net
好きな方使えとしか言いようがない
ただ参照はnullポインタが無いという特性はある
337:デフォルトの名無しさん
18/02/26 13:42:09.37 z/vehsiL0.net
>>322
自分もその人の気持ちは理解できた。
func(a, &b);
と書かれていると、bに結果を書き込んでいる感があるし。
338:デフォルトの名無しさん
18/02/26 13:44:00.32 yfGCkThX0.net
レスサンクス
cからだからポインタで書いちゃいそうだわ
339:デフォルトの名無しさん
18/02/26 18:25:47.85 aHz4HBvIM.net
ローカルで宣言したunique_ptrを他のメソッドに渡してデータをつめたいばあいってどういう引数で渡せば良いの?
unique_ptr<Hoge> ptr(new Hoge);
hogehoge(ptr);
Hogehoge::hoge(const unique_ptr<Hoge>& ptr){
ptr->aaa = 123;
}
これでいける?
なんかウェブサイトみてると&&二つとかあったりするの見かけて混乱してきた
340:デフォルトの名無しさん
18/02/26 18:46:48.22 6OgFttId0.net
&&は所有権ごとぶん投げる時に使う
渡した後も呼び出し元で使うんだったらそれて合ってるぞ
341:デフォルトの名無しさん
18/02/26 19:00:19.12 r2m2Cr000.net
>>327
それだったらunique_ptrじゃなくて参照渡せば良いだけじゃ
342:デフォルトの名無しさん
18/02/26 19:31:15.52 NcBRNf650.net
知らない間に、&& みたいな参照渡しもできた
Rust の所有権ムーブの事
343:デフォルトの名無しさん
18/02/26 19:58:16.47 jQ6YvoyL0.net
何年も前からある
344:デフォルトの名無しさん
18/02/26 21:01:42.73 k0ghrbBh0.net
所有権を渡すのってstd:move()だと思ってたんだけどconst &&でもいけるの??
345:デフォルトの名無しさん
18/02/26 21:42:25.99 adcc2IaV0.net
C++17でstd::iteratorが非推奨ってなっているみたいだけど代わりに何使うの?
346:デフォルトの名無しさん
18/02/26 23:56:58.87 4PPe6ndQ0.net
[]
347:デフォルトの名無しさん
18/02/27 00:00:22.09 o+FKgYKC0.net
>>333
自分で実装する
348:はちみつ餃子
18/02/27 02:00:32.40 +XEdVvf40.net
>>332
std::move は rvalue にキャストするだけで、それ自体にはムーブする機能はない。
実際にムーブの処理をするのはムーブコンストラクタやムーブ代入演算子の方やで。
349:はちみつ餃子
18/02/27 02:10:59.44 +XEdVvf40.net
&& は単純に右辺参照って意味しかないから、 rvalue を受け取れるってだけ。
だけど lvalue でもムーブしてぇってときは std::move で rvalue にキャストすんの。
350:デフォルトの名無しさん
18/02/27 02:19:45.35 o+FKgYKC0.net
そこら辺はめんどくさいからテンプレート使え
351:デフォルトの名無しさん
18/02/28 18:07:41.72 IZRayiSM0.net
右辺値参照とか難しいなー
最近ようやくC++11使えるようになったから全然いってることがわからん
352:片山博文MZ
18/02/28 18:34:51.95 jmOf6Upnd.net
右辺値参照が使えなかった頃は、std::swapでスピード最適化していた。ポインタとメモリー確保を含む構造体は、
単純にスワップしたり、単純にバイト単位コピーしたりするのはまずいことがある。
そういうときに、std::swapを使う。右辺値参照は、それよりちょっと速くて賢いが、テンプレート型を理解してないと多分理解できないと思われる。
353:片山博文MZ
18/02/28 18:43:18.32 jmOf6Upnd.net
右辺値参照の型はテンプレートを使った特殊な型だと考えるのが自然。
T&& === rvalue_ref<T>.
std::move(T&)はrvalue_ref<T>という型。
354:片山博文MZ
18/02/28 18:44:28.64 jmOf6Upnd.net
訂正。
std::move(T&)の戻り値はrvalue_ref<T>という型。
355:片山博文MZ
18/02/28 19:01:47.21 jmOf6Upnd.net
すみません、テキトーなことを書いたので、銃殺されます。
356:はちみつ餃子
18/02/28 19:18:07.29 7ezW7mFb0.net
実際のところヘッダファイルから std::move の定義を抜き出すとこんな感じ。
template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept {
return static_cast<typename std::remove_reference<_Tp>::type&&>(__t);
}
テンプレートの都合で面倒くさくなってるけど、実態としては static_cast してるだけ。
357:片山博文MZ
18/02/28 19:24:03.59 jmOf6Upnd.net
そのstd::remove_reference<T>::typeはTから左辺値参照や右辺値参照をはずした型になるね。それに&&を付けるんだから、左辺値参照が右辺値参照になる。
358:片山博文MZ
18/02/28 19:25:31.22 AZJp7LrB0.net
やはり、constexprやnoexceptを付けた方が性能がいいんだな。
359:はちみつ餃子
18/02/28 19:35:33.38 7ezW7mFb0.net
C++17 では noexcept は型の一部という扱いに変更された。
例外を投げないなら投げないと書いておかないと他のライブラリとの組合せで型エラーになったりすることもあるかもしれんぞ。
360:片山博文MZ
18/02/28 19:43:54.33 jmOf6Upnd.net
やっぱ江添亮様ってスゲーや。
361:デフォルトの名無しさん
18/02/28 21:22:30.07 BlsGZA5I0.net
江添本にこの辺りのチートシートと問題集いれたら100部くらい売り上げ増えるのでは
362:デフォルトの名無しさん
18/02/28 21:27:43.47 LDTKKB+20.net
江添ってあれか
363:。ニートの時にやることないからたまたま目についたC++の仕様書を読み込んでたら いつの間にかすごく強くなったという、ホリランみたいな。
364:デフォルトの名無しさん
18/02/28 21:32:34.60 eOQjYTv40.net
おまえそれをバカにできるのか?
仕事ってそういうもんだぜ
目の前の案件のために必死こいても付け焼き刃にできることは知れてるんだよ
「ヒマ」なときに遠くを見て投機的にコツコツ努力したことが
あとで花咲くことがあるし咲かないこともある
賭に勝った者を、降りたやつがバカにできるのか? え、おい
365:デフォルトの名無しさん
18/02/28 22:02:12.40 debsNNov0.net
>>320
>>322
書き込むときポインタ渡しにするのは
C++には参照渡しがin/out/refのどの意味なのか表すシンタックスが現状無いから
というのが主要な動機だと思うが
inならconst T& aというのは比較的読み筋だが
T* pと書いただけだとoutなのかrefなのかやっぱりわからん…
366:デフォルトの名無しさん
18/02/28 22:22:45.57 n9jVMobsM.net
>>352
outは**だろ
367:デフォルトの名無しさん
18/02/28 22:38:47.40 ugxprRf80.net
&& は、Rust のmove の事。
所有権移転。移転元が空になる
基本的に数年は、ドワンゴ江添と共に、山ごもり!
江添が空海なら、漏れは最澄w
悟りを開くまで、空海・最澄の一問一答が、延々と続くw
368:はちみつ餃子
18/02/28 23:03:26.56 7ezW7mFb0.net
rvalue reference 自体はムーブしねぇつってるだろ。
369:デフォルトの名無しさん
18/03/01 02:40:44.97 Cta7ST2f0.net
&&は所有権付き参照オブジェクトのようなものだな
370:デフォルトの名無しさん
18/03/01 07:05:17.46 /bb7E7Gp0.net
&&参照は「このオブジェクトもういらないからぶっ壊してもいいよ」というサイン
言うなれば肉屋へ行く馬車
野生のオブジェクトは誰に断る必要もないので勝手に連れてかれて解体される
家畜を渡す時は解体に同意するサイン(std::move())が必要
371:デフォルトの名無しさん
18/03/01 07:13:49.75 YKLxBKOvM.net
Fooクラスのunique_ptrがつまったvectorを作って、他クラスのメンバ変数にセットするときはどう渡すべき?
作った元ではもう使わないから所有権放棄していいとする
const参照渡しにして、渡された側でvectorの中身を全部std:move()して新しいvectorにつめるのが一番最初に思い浮かんだ
そんなことしなくても最近ここででてる、&&つけて渡してそのままセットすれば解決するのかな?
372:デフォルトの名無しさん
18/03/01 07:20:14.18 /bb7E7Gp0.net
vectorを丸ごとmove付けてコンストラクタに渡せばいいよ
出来上がった後で渡したいならswapすればいい
373:デフォルトの名無しさん
18/03/01 08:22:01.82 YKLxBKOvM.net
なるほどー
コードにするとこんな感じかな?
std::vector<std::unique_ptr>vec_hoge;
...
Hoge hoge;
hoge.setHoge(std:move(vec_hoge))
Hoge::setHoge(vector<unique_ptr>&& vec_hoge) {
this-> vec_hoge = vec_hoge;
}
374:デフォルトの名無しさん
18/03/01 08:51:22.88 Z75vpagFM.net
>>360
最後にmove必要
375:はちみつ餃子
18/03/01 08:54:17.19 1485DW7Q0.net
せやな。
rvalue reference は lvalue だぞ。
376:デフォルトの名無しさん
18/03/01 10:38:08.68 YKLxBKOvM.net
ありがとう!勉強になりました
377:デフォルトの名無しさん
18/03/01 22:06:37.33 fp7iC0tG0.net
>>353
ちげう
378:デフォルトの名無しさん
18/03/02 07:10:33.20 GbvR6g/La.net
noexceptにtrue,falseがある理由については
#include <type_traits>
template<typename T>
void test(T t)noexcept(is_unsigned<T>){
//Tの型がunsignedの時だけは例外は投げない
}
こういう事が出来ると書いてあ�
379:チたけど、c++17以降も問題なく使えるだろうか?
380:デフォルトの名無しさん
18/03/02 07:15:24.27 bNTu0vGw0.net
is_unsigned_vだろ
なぜC++17以後で廃止になると思ったんだ?
381:デフォルトの名無しさん
18/03/02 07:38:40.59 GbvR6g/La.net
stdも抜けてた。。。
廃止になるじゃなく面倒な事になりそうだと。
382:デフォルトの名無しさん
18/03/02 08:07:40.62 mIGjbFX+0.net
unsigned は組み込み用だろ
0 ~ 255 のカウンターなどで、無限にループする。
255の次に、0が来る
overflow にされると困る
383:デフォルトの名無しさん
18/03/02 08:51:13.35 Du7whmdSM.net
>>368
組み込みでなくても極々普通に使うし、標準ライブラリ使ってれば知らぬ間に使ってる。
384:デフォルトの名無しさん
18/03/02 09:14:23.17 vziGgrtU0.net
size_t
385:デフォルトの名無しさん
18/03/02 09:29:49.65 bNTu0vGw0.net
それを言うなら
uintptr_t
386:デフォルトの名無しさん
18/03/02 12:01:58.77 D+SIA0G1d.net
普段は uint_xxt と size_t しか使わんわ
int と ptr あんまり相互に変換しないし
387:デフォルトの名無しさん
18/03/02 22:27:40.22 3pZ6Fb9JF.net
visualstudio2017 でスタックトレースがしたいのですができません。
最初はBoost.StackTraceで試みたのですがMSVCでは行数やファイル名の出力が非対応で
アドレスまでしか取れませんでした。
次にWinAPIを使って解決させようとしたのですがこれもうまく行きません。
SymGetSymFromAddrを使うとどうやってもエラー126が帰ってきてしまいます。
以下のプログラムがVisualstudio2017で動作している人はいないでしょうか?
URLリンク(github.com)
388:デフォルトの名無しさん
18/03/02 23:27:18.83 KYEHMUiK0.net
スタートレックと空目した
389:デフォルトの名無しさん
18/03/02 23:40:43.96 vziGgrtU0.net
>>373
こうなった
---- BEGIN BACKTRACE ----
1 : 0x00e76873 : Project1 : mycode::foo : c:\users\\source\repos\project1\project1\main.cpp(116) :
backtrace();
2 : 0x00e76513 : Project1 : mycode::bar : c:\users\\source\repos\project1\project1\main.cpp(120) :
foo();
3 : 0x00e76563 : Project1 : mycode::baz : c:\users\\source\repos\project1\project1\main.cpp(124) :
bar();
4 : 0x00e76b33 : Project1 : mycode::hoge : c:\users\\source\repos\project1\project1\main.cpp(128) :
baz();
5 : 0x00e76f0d : Project1 : main : c:\users\\source\repos\project1\project1\main.cpp(134) : try {
6 : 0x00e7870e : Project1 : invoke_main : f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl(78) : ?
7 : 0x00e785b0 : Project1 : __scrt_common_main_seh : f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl(283) : ?
---- END BACKTRACE ----
390:片山博文MZ
18/03/02 23:47:44.16 7K8TE86Qd.net
URLリンク(stackoverflow.com)
未確認
391:373
18/03/03 01:05:16.48 7bxI8Ps/M.net
>>375
プロジェクトの設定はdbghelp.libを追加しただけでしょうか?
あとWindows10ですか?7ですか?
>>376
自分もそれを読んでx86とx64両方試したのですがダメでした、、、
392:デフォルトの名無しさん
18/03/03 01:52:28.21 e0EB+SLu0.net
>>377
Windows10で実行
ライブラリは追加したのと
このFileNameがchar*でmsvcでは通らないから適当に文字列のバッファを作って渡した
>94 line.FileName = "?";
393:373
18/03/03 07:43:32.07 MjEj/kk+F.net
>>378
自分はWindows7&VisualStudio2017なのですが
dbghelp.lib、dgbhelp.hを探すと以下の場所にあるのでWin10でしか対応していないのかなと…
C:\Program Files (
394:x86)\Windows Kits\10\Lib\10.0.16299.0\um\x86 C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um C:\Program Files (x86)\Windows Kitsの下には8.1と10 という名前のフォルダがあるのでOSの番号ぽいです。 dbghelp.dllならそこらじゅうにあるのでLoadModule関数で呼べばいけるのかも
395:373
18/03/03 08:51:25.52 MjEj/kk+F.net
VisualStudio Installerで構成の変更をしようとすると
'Windows XP Support for C++'というのがあって
これがWindows7用のSDKらしいです。(どんな名前の付け方だ…)
これをインストールするとめでたくdbghelp.libとdbghelp.hが追加されるので
それでコンパイルしようとすると
#include <dbghelp.h>
とかくだけでコンパイルエラーになってしまいました。
エラー C2760 構文エラー: トークン '識別子' は予期されておらず、'型指定子' が予期されています scratch c:\program files (x86)\microsoft sdks\windows\v7.1a\include\objbase.h 239
Windows10を買うかVisualStudio2015をインストールするかしかないのかもしれません;;
396:デフォルトの名無しさん
18/03/03 09:17:35.93 iGrPHQq30.net
>>380
Visual Studio 2017 スレの919あたりから話題になっているけど、
VS2017 の Windows 旧バージョンサポートはおかしいみたい。
2015と同じツールセット、SDKを用いても動作が違う。
2015をインストールするのがいい気がする。
参考
Visual Studio 2017 Part4 ・
スレリンク(tech板)
URLリンク(www.visualstudio.com)
397:デフォルトの名無しさん
18/03/03 10:29:47.52 eUUf6Fhxd.net
コンパイラを作っているんですが、char 10bit short 18bitの時はsizeofはいくつを返せばいいんですか?
398:デフォルトの名無しさん
18/03/03 10:36:52.34 /0Rk5gcF0.net
>>382
アドレス単位を返す。ワードアドレッシングなら通常全て1になる
399:デフォルトの名無しさん
18/03/03 10:42:04.53 iGrPHQq30.net
メモリ上のレイアウト次第
その18ビットを隙間だらけでchar8個分のメモリに置いてるなら8だし、
詰めて2個分で置いてるなら2
400:デフォルトの名無しさん
18/03/03 10:51:46.74 sKvL+uoJ0.net
sizeof(char)は必ず1じゃなかったっけ?
401:デフォルトの名無しさん
18/03/03 12:49:02.99 .net
sizeofが小数を返しちゃいけないって誰が決めたの?🙄
402:はちみつ餃子
18/03/03 13:15:05.21 uc6Z/AdW0.net
>>386
仕様。
C99 だと 7.17 に size_t は sizeof 演算子の結果の符号無し整数型って書いてある。
C++11 だと 5.3.3 に sizeof 演算子の返却値の型は size_t って書いてあって、
18.2 に size_t は符号無し整数型って書いてある。
403:デフォルトの名無しさん
18/03/03 13:20:00.43 Yc5zIgYv0.net
sizeof(bool) == 0.125 であって欲しいのかw
404:はちみつ餃子
18/03/03 13:43:14.93 uc6Z/AdW0.net
どうせ汎整数昇格で int になることばかりなので、
アドレス単位以下の小さなオブジェクトにする意味なんてないよ。
大きな配列で扱いたいときは std::bitset が有るし。
405:デフォルトの名無しさん
18/03/03 14:56:24.32 .net
>>387
ありがとう🤣
406:デフォルトの名無しさん
18/03/03 15:45:51.52 +GZAkR500.net
>>389
もしsizeofが小数を返したら汎整数昇格は適用されないんじゃない?
407:デフォルトの名無しさん
18/03/03 16:09:32.75 e0EB+SLu0.net
使用者が混乱するような仕様はちょっと
408:デフォルトの名無しさん
18/03/03 18:28:41.77 OIzMcqKj0.net
この板に書いてあることがほとんどわかっていないようなクソ素人ですみませんがちょっとお聞きしたいことがあります。
Windows 7でOpenCVをTDM-GCCにて動かしたいと思っているのですが、どなたかこの設定で動かされている方など居られ�
409:ワすでしょうか? もしくは素直にVisualStudioなど使ったほうが良いのでしょうか? 昨日からあれこれ試しているのですがまったく動かないです。
410:片山博文MZ
18/03/03 19:01:36.20 ZgUZF4A1d.net
>>393
俺ならパッケージマネージャがあるMSYS2+MinGW使うよ。
パッケージマネージャがないTDM-GCCなら、まず、OpenCVをビルドして、リンクできるようにしないといけない。
まあ、めんどうくさい訳で。
411:片山博文MZ
18/03/03 19:37:06.06 ZgUZF4A1d.net
初心者はVSやるとよろし。NuGetというパッケージマネージャがあるよ。
412:デフォルトの名無しさん
18/03/03 20:12:29.49 OIzMcqKj0.net
片山様
レスありがとうございます。
そうですね、VSは重いという理由で避けていましたがやはりまずはちゃんと王道からやっていこうと思います。
慣れたらソースからビルドもしてみたいですが、まずはOpenCVであれこれしたいのでやりやすい環境で頑張りたいと思います。
ありがとうございました。
413:はちみつ餃子
18/03/03 20:37:52.59 uc6Z/AdW0.net
VS の統合開発環境を外したツールセットだけの SDK もあったはず。
でもまあ初心者は統合開発環境があった方がいいってのは同意だな。
414:デフォルトの名無しさん
18/03/03 21:19:46.86 oo1zjTPVa.net
C++の文字列、u16やu32stringとか乱立してるけど今時TCHARとか使わないでしょうか?
string,wstring,u16string,u32string...どれか決め打ち?