C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part149
https://mevius.5ch.net/test/read.cgi/tech/1581974381/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://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/ (日本語)
テンプレここまで
C++相談室 part150
レス数が1000を超えています。これ以上書き込みはできません。
2020/03/24(火) 00:04:33.93ID:YFRNwZnv
2020/03/24(火) 02:17:13.57ID:9OEj9KSc
「ちんちんプラプラソーセージ」という言い伝えがあるがの、
それは、「C + + 双生児」、つまり、C++と双璧をなす言語の出現を予言したものだったのだよ。
それは、「C + + 双生児」、つまり、C++と双璧をなす言語の出現を予言したものだったのだよ。
2020/03/24(火) 13:19:52.34ID:j37mJqK4
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
---- テンプレ ここまで ----
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
---- テンプレ ここまで ----
2020/03/24(火) 14:30:36.92ID:dZNjE6fy
すげーSTLで外出しされると思ってる馬鹿がいるぞ
https://mevius.5ch.net/test/read.cgi/tech/1581974381/937
https://ideone.com/Jso95a
江添さんが間違って「末尾再帰である」と断定した記述方法 f() を、
正しく末尾再帰で記述すると g() になります。
これを最適化して h() とするのには、関数 g() を特別に解析することなく機械的に変換するだけでいいのです
最適化に機械的に変換するだけでいい、というのが末尾再帰の本質です
したがって >>934 の制限は妥当でしょうね
https://ideone.com/Jso95a
江添さんが間違って「末尾再帰である」と断定した記述方法 f() を、
正しく末尾再帰で記述すると g() になります。
これを最適化して h() とするのには、関数 g() を特別に解析することなく機械的に変換するだけでいいのです
最適化に機械的に変換するだけでいい、というのが末尾再帰の本質です
したがって >>934 の制限は妥当でしょうね
2020/03/25(水) 07:20:29.52ID:2w2fR+tZ
941 自分:デフォルトの名無しさん[sage] 投稿日:2020/03/21(土) 19:59:14.68 ID:uResqVEz [3/3]
「末尾再帰」という情報処理用語を定義しているJIS規格票もしくは
"tail recursion" という情報処理用語を定義しているISO規格票の
条項を出せるやついるの?
これだけ上から目線でマウント取っといて
あげくオレ用語だったら恥ずかしいぞ
「末尾再帰」という情報処理用語を定義しているJIS規格票もしくは
"tail recursion" という情報処理用語を定義しているISO規格票の
条項を出せるやついるの?
これだけ上から目線でマウント取っといて
あげくオレ用語だったら恥ずかしいぞ
7はちみつ餃子 ◆8X2XSCHEME
2020/03/25(水) 17:42:48.23ID:lGt7vmdl JIS X 0007 に「再帰」に関連するいくつかの用語があるけど、
その周辺に「末尾再帰」は書かれていないので情報処理用語の規格として
定義されたものはたぶんないんだろうと思う。
用語として定義されてはいないけど、
DSSSL の規格 (JISX4153) に「実装は、正しく末尾再帰を扱えなければならない」という文言として
現れているのは見つけた。
DSSSL がベースにしているのが R4RS (← Scheme の規格の第4版の通称) であることも書いてあるから
ここでいう末尾再帰は R4RS が言う末尾再帰だと考えていいと思う。
だけど R4RS だとどういう場合が末尾再帰なのかようわからんのよなぁ。
(形式的意味論で書いてあるところを読み解ける人にはわかるのかもしれない。)
R5RS 以降だとだいぶん分かりやすく書いてあるんだけど。
その周辺に「末尾再帰」は書かれていないので情報処理用語の規格として
定義されたものはたぶんないんだろうと思う。
用語として定義されてはいないけど、
DSSSL の規格 (JISX4153) に「実装は、正しく末尾再帰を扱えなければならない」という文言として
現れているのは見つけた。
DSSSL がベースにしているのが R4RS (← Scheme の規格の第4版の通称) であることも書いてあるから
ここでいう末尾再帰は R4RS が言う末尾再帰だと考えていいと思う。
だけど R4RS だとどういう場合が末尾再帰なのかようわからんのよなぁ。
(形式的意味論で書いてあるところを読み解ける人にはわかるのかもしれない。)
R5RS 以降だとだいぶん分かりやすく書いてあるんだけど。
2020/03/25(水) 18:35:34.29ID:iLx6+8HG
8コアマシンでninja -j4 -l4すると固まるんだけどninja何してんの
2020/03/25(水) 19:58:22.06ID:qvXjJ9lz
汚いことに決まってんだろ
2020/03/25(水) 21:43:33.64ID:JWtS3Wj0
アイエエエエエ
2020/03/25(水) 21:45:30.88ID:uGR4bFBq
ninjaずるい
2020/03/25(水) 21:50:47.15ID:lUBLXJbP
ninjaだいすき
2020/03/26(木) 00:08:16.23ID:fd5gxTEt
忍者だが、電車に乗っていたら下痢したのでそおっと席を立ち駅に向かったらしい
2020/03/26(木) 03:05:23.06ID:7mWqVwqc
汚いなさすが忍者きたない
15デフォルトの名無しさん
2020/03/27(金) 12:47:40.21ID:yDbWAejo 禿げや江添さん見て分かる通り。
禿げてる。
禿げてる。
2020/03/27(金) 21:04:21.22ID:MA/4mtFY
禿が作った言語は長生きするんだっけ?
2020/03/27(金) 22:52:04.36ID:eQxgR1y2
ウルセー ハゲハダマッテロ
∧___∧ / / / /
⊂( ・∀・) 、,Jし // パン
(几と ノ ) て.彡⌒ ミ
//'|ヽソ 彡 Y⌒Y( ´;ω;`)
/ノ / | \ 彡 l r Y i|
ヽ/、/ヽ/ ヽ/ U>>3|:_|j
∧___∧ / / / /
⊂( ・∀・) 、,Jし // パン
(几と ノ ) て.彡⌒ ミ
//'|ヽソ 彡 Y⌒Y( ´;ω;`)
/ノ / | \ 彡 l r Y i|
ヽ/、/ヽ/ ヽ/ U>>3|:_|j
2020/03/28(土) 02:01:55.47ID:8uQkqVES
髭だろ
ハゲが作った言語なんてc++しか思い浮かばない
ハゲが作った言語なんてc++しか思い浮かばない
19デフォルトの名無しさん
2020/03/28(土) 09:50:32.23ID:laMmnOq7 ハゲが作った移動通信会社なんて知らない
20デフォルトの名無しさん
2020/03/28(土) 16:10:38.05ID:jYzb+dLM Visual Studio C++ 2019 にて、パフォーマンスプロファイラーを使うと、
__CheckForDebuggerJustMyCode
という関数が呼び出されていて結構な負荷になっています。
デバッグ時にこれをOFFにしたいのですが、どうやって消せばよろしいのでしょうか?
__CheckForDebuggerJustMyCode
という関数が呼び出されていて結構な負荷になっています。
デバッグ時にこれをOFFにしたいのですが、どうやって消せばよろしいのでしょうか?
21はちみつ餃子 ◆8X2XSCHEME
2020/03/28(土) 16:39:28.55ID:FOAUxWzd >>20
私は Visual Studio を導入していないので試してないけど公式な情報があるやが。
https://docs.microsoft.com/ja-jp/cpp/build/reference/jmc?view=vs-2019
私は Visual Studio を導入していないので試してないけど公式な情報があるやが。
https://docs.microsoft.com/ja-jp/cpp/build/reference/jmc?view=vs-2019
22デフォルトの名無しさん
2020/03/28(土) 17:20:15.83ID:jYzb+dLM 江添氏 C++ 入門にまた誤りを見つけました
https://ezoeryou.github.io/cpp-intro/#nannot-a-number
> int main() {
> double NaN = std::numeric_limits<double>::quiet_NaN() ;
> // true
> bool b = NaN != 0.0 ;
> // false
> bool a = NaN == 0.0 ;
> bool c = NaN == NaN ;
> bool d = NaN != NaN ;
> bool e = NaN < 0.0 ;
>}
こちらで試してみると、bool c = NaN != NaN の値は true でした。
https://ideone.com/dzmyeq
>整数であれば、'a == b'がfalseであるならば、'a != b'なのだと仮定してもよいが、こと浮動小数点数の場合、NaNの存在があるために必ずしもそうとは限らない。
残念ながら、a, b, のいずれかまたは両方が Nan であっても、a == b が false ならば a != b true であることを確かめました
江添さん、だいじょうぶですかね?
https://ezoeryou.github.io/cpp-intro/#nannot-a-number
> int main() {
> double NaN = std::numeric_limits<double>::quiet_NaN() ;
> // true
> bool b = NaN != 0.0 ;
> // false
> bool a = NaN == 0.0 ;
> bool c = NaN == NaN ;
> bool d = NaN != NaN ;
> bool e = NaN < 0.0 ;
>}
こちらで試してみると、bool c = NaN != NaN の値は true でした。
https://ideone.com/dzmyeq
>整数であれば、'a == b'がfalseであるならば、'a != b'なのだと仮定してもよいが、こと浮動小数点数の場合、NaNの存在があるために必ずしもそうとは限らない。
残念ながら、a, b, のいずれかまたは両方が Nan であっても、a == b が false ならば a != b true であることを確かめました
江添さん、だいじょうぶですかね?
失礼
×bool c = NaN != NaN の値は true でした。
○bool d = NaN != NaN の値は true でした。
訂正箇所は他にはなく、「a == b が false ならば a != b true であることは、double a, b が NaN であってもいえる」
×bool c = NaN != NaN の値は true でした。
○bool d = NaN != NaN の値は true でした。
訂正箇所は他にはなく、「a == b が false ならば a != b true であることは、double a, b が NaN であってもいえる」
2020/03/28(土) 23:03:59.81ID:TAn8n6A3
3/14は円周率の日
とくに2015年はアメリカ式日付表記で3/14/15なので100年に1回だったという、
■ Googleの円周率31兆4000億桁までの計算について、きちんと解説
https://www.blog.umentu.work/google-circle-3-14/
■ 多倍長計算の技法(3章)
http://www.kurims.kyoto-u.ac.jp/~ooura/pi04.pdf
とくに2015年はアメリカ式日付表記で3/14/15なので100年に1回だったという、
■ Googleの円周率31兆4000億桁までの計算について、きちんと解説
https://www.blog.umentu.work/google-circle-3-14/
■ 多倍長計算の技法(3章)
http://www.kurims.kyoto-u.ac.jp/~ooura/pi04.pdf
2020/03/28(土) 23:04:23.60ID:TAn8n6A3
誤爆すたorz
2020/03/29(日) 00:16:32.66ID:t2YV962W
江添のことはほっといてやれよ。。
2020/03/29(日) 01:26:13.46ID:sawiSEmu
>>23-24 少しでも被害者を減らすために issue 立てといてもらえませんかね?
2020/03/29(日) 01:55:28.30ID:tSgWoZoj
村上原野が死亡。
Sprout はど〜なっちゃうの〜
Sprout はど〜なっちゃうの〜
30デフォルトの名無しさん
2020/03/29(日) 01:57:11.38ID:KAJzXRPk デザインパターンのブリッジパターンやストラテジパターンのようなケースで
インターフェースクラスを継承して実装クラスを作る場合、
class If() /* interface */
{
public:
If() {}
virtual ~If*( {}
virtual void func() {}
};
class Impl() : public If
{
public:
Impl() {}
~Impl() {}
void func() {}
};
のようにすると思いますが、Implクラスをさらに基底クラス(ImplBase)と2種類の派生クラス(ImplA, ImplB)に分けたい場合、
多重継承以外でやるには、どうするのが良いでしょうか?
まず If を ImplBase に継承させて、次に ImplBase を ImplA と ImplB に継承させる事になるでしょうか?
その場合、純粋仮想関数func()はどのように書くべきでしょうか? ImplBase も virtual void func()としておいて
ImplA で実装するのでしょうか?
インターフェースクラスを継承して実装クラスを作る場合、
class If() /* interface */
{
public:
If() {}
virtual ~If*( {}
virtual void func() {}
};
class Impl() : public If
{
public:
Impl() {}
~Impl() {}
void func() {}
};
のようにすると思いますが、Implクラスをさらに基底クラス(ImplBase)と2種類の派生クラス(ImplA, ImplB)に分けたい場合、
多重継承以外でやるには、どうするのが良いでしょうか?
まず If を ImplBase に継承させて、次に ImplBase を ImplA と ImplB に継承させる事になるでしょうか?
その場合、純粋仮想関数func()はどのように書くべきでしょうか? ImplBase も virtual void func()としておいて
ImplA で実装するのでしょうか?
2020/03/29(日) 02:19:11.85ID:p3fh4h77
constexprの中二女子亡くなってたのか・・・
2020/03/29(日) 02:26:21.63ID:p3fh4h77
2020/03/29(日) 08:26:45.65ID:zFUy7lJg
>>29
え、持病でもあったの?
え、持病でもあったの?
2020/03/29(日) 09:05:51.82ID:GFdzppn9
中二で死ぬって早すぎないか
2020/03/29(日) 10:02:27.83ID:+/sFre8I
>>23
NaNが「不定」を意味するなら、理論的には
> // false
> bool c = NaN == NaN ;
> bool d = NaN != NaN ;
が正しいんだろう
仕様は上のようになってて、実装依存ということはないか?
NaNが「不定」を意味するなら、理論的には
> // false
> bool c = NaN == NaN ;
> bool d = NaN != NaN ;
が正しいんだろう
仕様は上のようになってて、実装依存ということはないか?
2020/03/29(日) 10:26:02.28ID:zyhHBMyS
NaNとの!=以外の比較演算は常にfalse、!=は常にtrue
ってするのが普通みたいだけど
ってするのが普通みたいだけど
2020/03/29(日) 10:36:40.12ID:oQB7eLYm
そもそも非数に「等しい」なんて場合があるのか?
数学的におかしくね?
数学的におかしくね?
2020/03/29(日) 10:49:11.16ID:+/sFre8I
本来は「非数」なら「等しくない」も議論できない気がするのでなんとも
0/0->NaNなら「不定」と解釈してもおかしくないし、その場合、
NaN!=NaNは「ほとんどの場合に正しい」としか言えない
0/0->NaNなら「不定」と解釈してもおかしくないし、その場合、
NaN!=NaNは「ほとんどの場合に正しい」としか言えない
2020/03/29(日) 11:12:19.09ID:CNNBvMSR
!=は==の否定だから、NaN == NaNはfalseなので
NaN != NaN -> !(NaN == NaN) はtrue
ほかの等値比較の意味論に合わせてるんだと
NaN != NaN -> !(NaN == NaN) はtrue
ほかの等値比較の意味論に合わせてるんだと
2020/03/29(日) 11:22:58.32ID:sawiSEmu
>>35
std::numeric_limits<T>::is_iec559 (IEEE 754) の場合は NaN!=NaN に定まる模様。
https://stackoverflow.com/questions/38798791/nan-comparison-rule-in-c-c
> I read the IEEE-754 rules on NaN, which states:
>> The comparisons EQ, GT, GE, LT, and LE, when either or both operands is NaN returns FALSE.
>> The comparison NE, when either or both operands is NaN returns TRUE.
C++の規定はこう。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf [expr.eq]
(C++14でも同じ https://timsong-cpp.github.io/cppwp/n4140/expr.eq#5 )
> If two operands compare equal, the result is true for the == operator
> and false for the != operator. If two operands compare unequal,
> the result is false for the == operator and true for the != operator.
> Otherwise, the result of each of the operators is unspecified.
これだけなら「equalでもunequalでもない」として結果を不定とする実装もあり得る。
ただしCの規定には以下のものがある。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2454.pdf Equality operators
> The == (equal to) and != (not equal to) operators are ...
> For any pair of operands, exactly one of the relations is true.
これによれば NaN==NaN, NaN!=NaN を両方 false とするCの実装は許されない。
わざわざこれに反するようなC++の実装が作られる理由は無さそうだし、受け入れられることも無さそう。
std::numeric_limits<T>::is_iec559 (IEEE 754) の場合は NaN!=NaN に定まる模様。
https://stackoverflow.com/questions/38798791/nan-comparison-rule-in-c-c
> I read the IEEE-754 rules on NaN, which states:
>> The comparisons EQ, GT, GE, LT, and LE, when either or both operands is NaN returns FALSE.
>> The comparison NE, when either or both operands is NaN returns TRUE.
C++の規定はこう。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf [expr.eq]
(C++14でも同じ https://timsong-cpp.github.io/cppwp/n4140/expr.eq#5 )
> If two operands compare equal, the result is true for the == operator
> and false for the != operator. If two operands compare unequal,
> the result is false for the == operator and true for the != operator.
> Otherwise, the result of each of the operators is unspecified.
これだけなら「equalでもunequalでもない」として結果を不定とする実装もあり得る。
ただしCの規定には以下のものがある。
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2454.pdf Equality operators
> The == (equal to) and != (not equal to) operators are ...
> For any pair of operands, exactly one of the relations is true.
これによれば NaN==NaN, NaN!=NaN を両方 false とするCの実装は許されない。
わざわざこれに反するようなC++の実装が作られる理由は無さそうだし、受け入れられることも無さそう。
2020/03/29(日) 13:05:33.90ID:0VKwdtls
ieee754の書き方が難しすぎて何処をどう読めばNaN!=NaNになるのか分からん…
2020/03/29(日) 13:28:15.35ID:oQB7eLYm
現実は>>39なんだろうけど
原理主義的にはNaNの比較は例外を投げるべき
原理主義的にはNaNの比較は例外を投げるべき
43デフォルトの名無しさん
2020/03/29(日) 13:57:09.44ID:vg0TAzW0 NaNを無限と言い換えて数学的な議論をするしかない
2020/03/29(日) 15:32:11.50ID:nDbo81n4
みんな大好き超準解析、
2020/03/29(日) 15:32:36.22ID:CNNBvMSR
2020/03/29(日) 16:10:11.53ID:p3fh4h77
江添が悪い
たぶんx==xが常に真になるとは限らない(xがNaNの場合)って話を間違えて覚えてたんだろ
たぶんx==xが常に真になるとは限らない(xがNaNの場合)って話を間違えて覚えてたんだろ
2020/03/29(日) 17:54:48.32ID:oQB7eLYm
江添氏はブログを立てて不特定多数の一般人からの指摘を待っている
誤りの指摘はそこでやれ、それが「被害者を減らす」ことにつながる
江添が見ている保証のないこんなところで正義面しても
そういう筋が何もわかっちゃいないやつというだけだ
誤りの指摘はそこでやれ、それが「被害者を減らす」ことにつながる
江添が見ている保証のないこんなところで正義面しても
そういう筋が何もわかっちゃいないやつというだけだ
51はちみつ餃子 ◆8X2XSCHEME
2020/03/29(日) 18:27:59.62ID:tSgWoZoj 本当に間違っているという確信がなくて事前に相談するってのならまあそれもいいんじゃないの。
52デフォルトの名無しさん
2020/03/29(日) 18:41:01.14ID:xWXht+2h 江添さんに聞くのが一番速い。
2020/03/29(日) 22:23:18.41ID:6MT5MhMu
ここ見てそうだしな
2020/03/30(月) 00:19:48.36ID:DkauJosI
あの人もうスノボに夢中でC++に興味なさそう
2020/03/30(月) 01:01:09.51ID:PZnOEjGK
C++なんかやってるのにスノボもやってるのか異端だな
2020/03/30(月) 09:52:17.47ID:6jBFblvz
githubのissue放置してるじゃん
2020/03/30(月) 13:41:16.50ID:hh56tBZl
ベクトルが二つあって重複部分を差分取得になるように結合したいです
in
1,2,3,4
3,4,5,6
out
1,2,3,4,5,6
重複がなければそのまま結合でいいです
in
1,2,3,4
3,4,5,6
out
1,2,3,4,5,6
重複がなければそのまま結合でいいです
58デフォルトの名無しさん
2020/03/30(月) 19:24:54.69ID:ubfGsS+F std::sort
std::unique
std::set_union
std::unique
std::set_union
2020/03/30(月) 19:28:43.95ID:Oymj8mf6
>>57
その程度なら、ネットで検索して見つからないようなら、手で書いたほうが早いね。
2つの列を共にソートしたあと、マージソートの様に左端から順に比較して同じなら
1つ分だけ dest にコピーするようにすれば良いだけ。
その程度なら、ネットで検索して見つからないようなら、手で書いたほうが早いね。
2つの列を共にソートしたあと、マージソートの様に左端から順に比較して同じなら
1つ分だけ dest にコピーするようにすれば良いだけ。
2020/03/30(月) 19:44:49.89ID:UMPMfaDu
標準委員から無視されていじけてるんだろう。ショーもねー奴だよ。
2020/03/31(火) 00:16:01.43ID:FylkZaNQ
new, deleteとか手動でやるのはもう古すぎて使わない?スマートポインタ使うのが普通?
2020/03/31(火) 01:00:25.49ID:oKg2nb+1
必要な時は使えばいいと思うけど自分は全く使わなくなった
2020/03/31(火) 01:34:17.99ID:s0jfH2wf
初めてクラスを使ったのですが、forループの中で関数のように使う場合には
1. 毎回デフォルトコンストラクタに引数を食わせて初期化してからgetterで計算する
2. 初期化はループの外でして置いてループ内ではsetterなどで引数を読み込ませてからgetterで計算する
どちらの方が良いんですかね?
あと、あるメンバ変数に連動したメンバ変数みたいなものって作れますか?
int _a
int _b = _a / 2みたいなものです
1. 毎回デフォルトコンストラクタに引数を食わせて初期化してからgetterで計算する
2. 初期化はループの外でして置いてループ内ではsetterなどで引数を読み込ませてからgetterで計算する
どちらの方が良いんですかね?
あと、あるメンバ変数に連動したメンバ変数みたいなものって作れますか?
int _a
int _b = _a / 2みたいなものです
2020/03/31(火) 01:43:07.29ID:oKg2nb+1
後半の方はint getHalfA()みたいなメンバ関数を設ければいい
前半は関数オブジェクトのこと?何言ってんのかわからん
前半は関数オブジェクトのこと?何言ってんのかわからん
2020/03/31(火) 03:22:08.29ID:Yt3qMdaP
>>63
1,2は、速度面以外ではどちらでもいいが、速度を重視するなら2。
なお、getter, setter は元々、巨大なプログラムでバグを減らすために発明されたようなものだから、小さいプログラムでは特に使う必要は無い。
1,2は、速度面以外ではどちらでもいいが、速度を重視するなら2。
なお、getter, setter は元々、巨大なプログラムでバグを減らすために発明されたようなものだから、小さいプログラムでは特に使う必要は無い。
2020/03/31(火) 03:28:43.09ID:Yt3qMdaP
>>65
C#では、getter, setter を凄く高頻度で使ってもいいような設計思想なのかもしれないが、かなり意見が分かれるところ。
クラスを保護する目的では使っても良いが、普通の代入とは動作を変えてしまいすぎる
ようなものは想定した動作との勘違いによる逆にバグの元になる可能性があるのでお勧めしない。
使い道があるのは、代入箇所や読み取り箇所の動作の変更を手作業や grep 置換に頼らずに確実に行いたいような場合だと思うが、小規模なプログラムでは単純に手作業や grep 置換で直した方がよい。
新しい機能は大宣伝されるので初心者が飛び付きがちだが、実は余り普段は使わないほうが良い機能であることもかなり多いので注意。
C#では、getter, setter を凄く高頻度で使ってもいいような設計思想なのかもしれないが、かなり意見が分かれるところ。
クラスを保護する目的では使っても良いが、普通の代入とは動作を変えてしまいすぎる
ようなものは想定した動作との勘違いによる逆にバグの元になる可能性があるのでお勧めしない。
使い道があるのは、代入箇所や読み取り箇所の動作の変更を手作業や grep 置換に頼らずに確実に行いたいような場合だと思うが、小規模なプログラムでは単純に手作業や grep 置換で直した方がよい。
新しい機能は大宣伝されるので初心者が飛び付きがちだが、実は余り普段は使わないほうが良い機能であることもかなり多いので注意。
67デフォルトの名無しさん
2020/03/31(火) 08:10:50.56ID:Zjo4xAEk2020/03/31(火) 10:02:16.71ID:OTxurRkT
>>63
そういう問題を自分が求めるパフォーマンスレベルに最適化できる(やらなきゃならん)のがc++だぞ。
そういう問題を自分が求めるパフォーマンスレベルに最適化できる(やらなきゃならん)のがc++だぞ。
69はちみつ餃子 ◆8X2XSCHEME
2020/03/31(火) 10:16:06.05ID:Ow5tuxOJ >>63
デフォルトコンストラクタは引数をとらないコンストラクタのことなのでなんか勘違いしてるぞ。
実行コストか抽象化の都合でどうしても事前にしなければならないことがあるなら 2 の選択肢しかないし、
そうでないときはクラスにする意味がないので普通の関数で書けばよくねって思う。
そのふたつの選択肢の間で迷わなければならない場面というのが既になんかおかしい状態に入り込んでる気がする。
デフォルトコンストラクタは引数をとらないコンストラクタのことなのでなんか勘違いしてるぞ。
実行コストか抽象化の都合でどうしても事前にしなければならないことがあるなら 2 の選択肢しかないし、
そうでないときはクラスにする意味がないので普通の関数で書けばよくねって思う。
そのふたつの選択肢の間で迷わなければならない場面というのが既になんかおかしい状態に入り込んでる気がする。
2020/03/31(火) 10:34:43.57ID:6MgwCPiX
c++使いなら速度を追求しろ
速度こそ正義だ
速度こそ正義だ
2020/03/31(火) 12:31:40.67ID:b6kPBFRe
72デフォルトの名無しさん
2020/03/31(火) 12:39:27.67ID:tVRDD1dz おい、パフュームはコーディング捗るぞ。
2020/03/31(火) 14:18:42.21ID:PMv8PBMm
なんか前提条件抜きで「こう書くのが良い」みたいな答えを求める初心者が最近多いっぽいな
セオリーに従順といえば聞こえはいいが、自分のおかれてる状況でどうすべきかの決断をとことんサボろうとしてるとも言える
セオリーに従順といえば聞こえはいいが、自分のおかれてる状況でどうすべきかの決断をとことんサボろうとしてるとも言える
2020/03/31(火) 14:28:08.91ID:daGoeiYK
>>71
「C#はABI互換するのが作法」
という意味が分からないので詳しく。
個人的には、C#でgetter,setterが作り易くなっているのは、HTMLの「property」
を操作するJSの流儀にルーツを持つのではないかと思っている。
そう思う理由の一つは、WinFormsでも、イベントハンドラ(関数)を登録するのに、インスタンス変数に関数の名前を代入するような形式を使っているのが、JSのイベントハンドらの作法にそっくりだし、
Formのフラグ類の設定方法が、HTMLのpropertyやCSSのstyleの設定方法とそっくりだから。
普通、C++だとメンバ関数を通じてオブジェクトに「命令を出す」事でオブジェクトの状態を変える
作法が取られることが多いが、JSだと同じ事をpropertyを設定することで行う。
後者の場合、propertyを設定したら、イベント終了後にDOM要素が自動的にその変化が反映される。
JSのその作法はコードを短く書くのには適してはいるが、インタプリタ的な動作でも有り、
変数の代入のように見える書き方に「副作用」が伴うのがC/C++言語の文化だとちょっと違和感を感じる
人も居ると思う。
「C#はABI互換するのが作法」
という意味が分からないので詳しく。
個人的には、C#でgetter,setterが作り易くなっているのは、HTMLの「property」
を操作するJSの流儀にルーツを持つのではないかと思っている。
そう思う理由の一つは、WinFormsでも、イベントハンドラ(関数)を登録するのに、インスタンス変数に関数の名前を代入するような形式を使っているのが、JSのイベントハンドらの作法にそっくりだし、
Formのフラグ類の設定方法が、HTMLのpropertyやCSSのstyleの設定方法とそっくりだから。
普通、C++だとメンバ関数を通じてオブジェクトに「命令を出す」事でオブジェクトの状態を変える
作法が取られることが多いが、JSだと同じ事をpropertyを設定することで行う。
後者の場合、propertyを設定したら、イベント終了後にDOM要素が自動的にその変化が反映される。
JSのその作法はコードを短く書くのには適してはいるが、インタプリタ的な動作でも有り、
変数の代入のように見える書き方に「副作用」が伴うのがC/C++言語の文化だとちょっと違和感を感じる
人も居ると思う。
2020/03/31(火) 14:39:26.00ID:daGoeiYK
>>74
なお個人的には、
C#のような自動化された setter, getter を使うより、
void SetXxx(TYPE x); や TYPE GetXxx();
を明示的に使ったほうが、set, get している場所をgrep検索し易いと思う。
xxx = yyy で settter を呼び出す作法の場合、grep検索するなら、
正規表現で xxx*s\= などと書く必要があるし、コンストラクタで
使われている場合や関数の引数に「代入」されている場合にはこれでは検索しきれない。
自動化されることで使用箇所が見えにくくなり、トラブルの元になる可能性がある。
getterの方は使用箇所の検索は不可能になる。
なお個人的には、
C#のような自動化された setter, getter を使うより、
void SetXxx(TYPE x); や TYPE GetXxx();
を明示的に使ったほうが、set, get している場所をgrep検索し易いと思う。
xxx = yyy で settter を呼び出す作法の場合、grep検索するなら、
正規表現で xxx*s\= などと書く必要があるし、コンストラクタで
使われている場合や関数の引数に「代入」されている場合にはこれでは検索しきれない。
自動化されることで使用箇所が見えにくくなり、トラブルの元になる可能性がある。
getterの方は使用箇所の検索は不可能になる。
2020/03/31(火) 14:42:36.42ID:DEnjdkJH
C#はC++と違ってシンボルの完璧な静的解決が可能だからgrep性なんかどうでもいいんだよ
VSでポチポチしたら一瞬で完全な呼び出しツリーが出来上がる
VSでポチポチしたら一瞬で完全な呼び出しツリーが出来上がる
2020/03/31(火) 15:09:58.10ID:OTxurRkT
>>73
プログラマは怠惰であるべきってのを間違ったとらえ方してるバカは世の中には多い。
プログラマは怠惰であるべきってのを間違ったとらえ方してるバカは世の中には多い。
2020/03/31(火) 15:12:48.63ID:YcGHsuX6
>>75
メモ帳でコード書いてるのか?w
メモ帳でコード書いてるのか?w
79デフォルトの名無しさん
2020/03/31(火) 17:49:17.43ID:tVRDD1dz viでは。
2020/03/31(火) 20:44:47.09ID:HDRrREDo
【速報】東京都が #新型コロナウイルス 感染症死亡者数を過少評価か、
「例年より少ない」とされていたインフルエンザ関連死が急増=国立感染症研究所
https://www.niid.go.jp/niid/ja/flu-m/2112-idsc/jinsoku/1852-flu-jinsoku-7.html …
コロナで死んだのインフルに振り替えてるんじゃまいか
こういうニュースが出てくる時点で隠蔽はもう無理
おそらくパンデミックは避けられないと思うね
「例年より少ない」とされていたインフルエンザ関連死が急増=国立感染症研究所
https://www.niid.go.jp/niid/ja/flu-m/2112-idsc/jinsoku/1852-flu-jinsoku-7.html …
コロナで死んだのインフルに振り替えてるんじゃまいか
こういうニュースが出てくる時点で隠蔽はもう無理
おそらくパンデミックは避けられないと思うね
2020/03/31(火) 22:00:06.46ID:ox5sQqez
言語仕様はメモ帳で書く場合を想定すべき
メモ帳で楽に書ければ開発環境でも楽に書けるが、逆はない
開発環境がなければ書けないような構文は構文自体おかしいと認識するべきだ
メモ帳で楽に書ければ開発環境でも楽に書けるが、逆はない
開発環境がなければ書けないような構文は構文自体おかしいと認識するべきだ
2020/03/31(火) 22:01:35.88ID:L/5UA51D
なぜメモ帳?
そこはedlinだろ?
そこはedlinだろ?
83デフォルトの名無しさん
2020/03/31(火) 22:05:49.04ID:tVRDD1dz Excelよく使ってる。
84デフォルトの名無しさん
2020/03/31(火) 22:07:47.94ID:tVRDD1dz ExcelはExtended cellという意味とExcellentという意味がある。
と思う。
と思う。
85デフォルトの名無しさん
2020/03/31(火) 22:14:04.53ID:tVRDD1dz 電卓にはプログラマ・モードがあるのに。
Excelにはない。
不思議な話だ。
Excelにはない。
不思議な話だ。
86デフォルトの名無しさん
2020/03/31(火) 22:14:37.75ID:tVRDD1dz そういえば電卓も良く使う。
2020/03/31(火) 22:19:10.66ID:L/5UA51D
そりゃmac用ソフトだもの
2020/03/31(火) 22:52:39.00ID:s0jfH2wf
皆さんありがとうございます
正直個人で利用するだけなら関数でいいし今までも関数で済ましてたんですが、他人に教えるときに変数定義などが散らばってると教えるのが面倒くさいという理由でクラス化したんですよね
正直個人で利用するだけなら関数でいいし今までも関数で済ましてたんですが、他人に教えるときに変数定義などが散らばってると教えるのが面倒くさいという理由でクラス化したんですよね
2020/03/31(火) 23:13:13.12ID:W8+rJJar
関数で済むならその方が良い
プログラムが複雑な動作ができるのは「状態(=変数)」を持つから
単純にできるならその方が良い
変数は悪だよ、必要悪
プログラムが複雑な動作ができるのは「状態(=変数)」を持つから
単純にできるならその方が良い
変数は悪だよ、必要悪
2020/04/01(水) 08:43:31.52ID:BVkSt5Rw
class変数ってのはstatic変数とlocal変数の中間的なイメージをもってる。
static変数よりかマシだけど状態を持つことには変わりはない。
まあlocal変数だけでプログラムするのもつらいって場面も多いけど。
static変数よりかマシだけど状態を持つことには変わりはない。
まあlocal変数だけでプログラムするのもつらいって場面も多いけど。
2020/04/01(水) 13:47:46.62ID:PC8mhvaW
気になったので教えて
c++的に関数のbool型戻り値に関数の成功失敗返すとして、真が成功で偽が失敗が一般的?
c言語だと戻り値がintで0が成功、それ以外が失敗ってのか良くあるけど、c++もこの形が一般的?(偽が成功、真が失敗)
個人的には前者を良く使うんだけど
c++的に関数のbool型戻り値に関数の成功失敗返すとして、真が成功で偽が失敗が一般的?
c言語だと戻り値がintで0が成功、それ以外が失敗ってのか良くあるけど、c++もこの形が一般的?(偽が成功、真が失敗)
個人的には前者を良く使うんだけど
2020/04/01(水) 13:55:09.05ID:BVkSt5Rw
boolとintで区別するってのが一般的で
boolの場合言ってる通りでintの場合cの流儀に沿うのが普通じゃね。
boolの場合言ってる通りでintの場合cの流儀に沿うのが普通じゃね。
93はちみつ餃子 ◆8X2XSCHEME
2020/04/01(水) 14:38:59.32ID:S74lm4t5 >>91
エラーであることと同時にエラーの内容 (エラーコード) も返したいという要求がある。
なので 0 を成功として、失敗ならエラー内容に対応する数値 (真値) を返すというやり方が生まれた。
でも C の標準ライブラリには失敗として 0 を返した上でエラーの内容は errno に設定するものもあるし、
グダグダなんやわ。
真偽のどちらを成功とするか失敗とするかは、どちらかが一般的と言えるほど統一されてはいないと思う。
C++ だと失敗は例外で投げてしまえるから返却値はあくまでも正常系のみの結果を返すべきという意見もあるし、
例外は何かと問題があるので避けた方がいいという人もいる。
std::optional は「有効な値があるとき」と「有効な値がないとき」を区別できるけど、
成功・失敗に対応づけるにはちょっとイマイチな感じもあるしなぁ……。
結局のところ場合による。
エラーであることと同時にエラーの内容 (エラーコード) も返したいという要求がある。
なので 0 を成功として、失敗ならエラー内容に対応する数値 (真値) を返すというやり方が生まれた。
でも C の標準ライブラリには失敗として 0 を返した上でエラーの内容は errno に設定するものもあるし、
グダグダなんやわ。
真偽のどちらを成功とするか失敗とするかは、どちらかが一般的と言えるほど統一されてはいないと思う。
C++ だと失敗は例外で投げてしまえるから返却値はあくまでも正常系のみの結果を返すべきという意見もあるし、
例外は何かと問題があるので避けた方がいいという人もいる。
std::optional は「有効な値があるとき」と「有効な値がないとき」を区別できるけど、
成功・失敗に対応づけるにはちょっとイマイチな感じもあるしなぁ……。
結局のところ場合による。
2020/04/01(水) 17:14:10.11ID:15FH3/nz
おれも >>92 の認識
結果boolとintでfalse/0の意味が入れ替わるわけだが
intはエラーコードを返す余地があるが
boolの場合失敗をfalseでだけで返しても実用上役に立たないと思う
falseが返ってきたら呼び出し側は何をすればいいかまで考えるべき
内部エラー的などうしようもないもののときは関数内で勝手にabortした方がまし
結果boolとintでfalse/0の意味が入れ替わるわけだが
intはエラーコードを返す余地があるが
boolの場合失敗をfalseでだけで返しても実用上役に立たないと思う
falseが返ってきたら呼び出し側は何をすればいいかまで考えるべき
内部エラー的などうしようもないもののときは関数内で勝手にabortした方がまし
95デフォルトの名無しさん
2020/04/01(水) 18:14:31.33ID:MoTGnEfh >>94
実は、エラー番号を返されても、出来ることは限られていて、
ハードウェアエラーの様なものなら、使用者にそのメッセージを
表示することは出来るが、単に関数の呼び出し方の間違いの場合も
多くてその場合は開発時にエラー番号を調べて対処するしかない。
エラー番号によってプログラムの動作を変えて対処できるケースは全体のごく一部。
実は、エラー番号を返されても、出来ることは限られていて、
ハードウェアエラーの様なものなら、使用者にそのメッセージを
表示することは出来るが、単に関数の呼び出し方の間違いの場合も
多くてその場合は開発時にエラー番号を調べて対処するしかない。
エラー番号によってプログラムの動作を変えて対処できるケースは全体のごく一部。
2020/04/01(水) 19:18:06.29ID:15FH3/nz
97デフォルトの名無しさん
2020/04/01(水) 19:24:00.89ID:Awd6zvg2 std::sortにconstexprが付くことについてコメントお願いします。
2020/04/01(水) 22:38:47.73ID:3pIDnj5r
標準ライブラリで付けられるところには全部付けろ
99デフォルトの名無しさん
2020/04/01(水) 23:20:02.25ID:Awd6zvg2 コンパイル時にソートしてくれるってやばない?
100デフォルトの名無しさん
2020/04/02(木) 00:18:03.16ID:Gf7PuiHp 左様boolを成功か失敗かの意味で使うのが悪い
boolは単純に真偽として解釈すべきでありかつその解釈で十分な場合に使う他無い
例: std::vector::empty()
どーしても成功か失敗かの意味で使いたいなら
成功なら真、失敗なら偽の値を返す関数なりマクロなりで
wrapした結果をboolにすべきや
例:
inline bool SUCCEEDED(int retval) { retun (retval == 0); }
inline bool FAILED(int retval) { return (retval != 0); }
boolは単純に真偽として解釈すべきでありかつその解釈で十分な場合に使う他無い
例: std::vector::empty()
どーしても成功か失敗かの意味で使いたいなら
成功なら真、失敗なら偽の値を返す関数なりマクロなりで
wrapした結果をboolにすべきや
例:
inline bool SUCCEEDED(int retval) { retun (retval == 0); }
inline bool FAILED(int retval) { return (retval != 0); }
101デフォルトの名無しさん
2020/04/02(木) 00:21:01.87ID:Wbq1ni9c constexprはやばいがなぜにソート?
というかコンパイル時ソートの需要なんかあんのか?
100万件のデータをソースに埋め込んでコンパイル時にソートしたいとは思わないな
というかコンパイル時ソートの需要なんかあんのか?
100万件のデータをソースに埋め込んでコンパイル時にソートしたいとは思わないな
102デフォルトの名無しさん
2020/04/02(木) 00:25:29.31ID:44dV9Os2 そんなでかいのコンパイルに時間がかかって仕方がない
数十数百までなら実用的なコンパイル時間で済みそうだし需要はあるだろ
数十数百までなら実用的なコンパイル時間で済みそうだし需要はあるだろ
103デフォルトの名無しさん
2020/04/02(木) 00:38:17.67ID:Wbq1ni9c その程度なら実行時でいいやってなる
104デフォルトの名無しさん
2020/04/02(木) 00:43:04.78ID:44dV9Os2 ソート後もまだコンパイル時評価に使えるじゃん
105デフォルトの名無しさん
2020/04/02(木) 01:00:56.93ID:Wbq1ni9c 意味わからんけど
コンパイル時にソートしてくれるのはいいと思うよ
でもそれがスゲー便利とはならないだろうなってこと
コンパイル時にソートしてくれるのはいいと思うよ
でもそれがスゲー便利とはならないだろうなってこと
106デフォルトの名無しさん
2020/04/02(木) 01:08:47.28ID:I8hlhwK7 明らかにアンチパターンだろ。
constexprてフーリエ変換の係数とか定数だけどちょっとした計算が必要なものに使うもんだろうに。
constexprてフーリエ変換の係数とか定数だけどちょっとした計算が必要なものに使うもんだろうに。
107デフォルトの名無しさん
2020/04/02(木) 01:25:43.89ID:44dV9Os2 いや、それこそruntimeで良いんじゃね
108はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 03:49:46.91ID:sLIn31jD109デフォルトの名無しさん
2020/04/02(木) 06:22:02.07ID:I8hlhwK7 >>108
不自然なことやってバギーだったり、その挙動がユーザーにとってデバッグしずらいものだったら
プログラマーにとって損だろ。
なんでもコンパイラにやらせればいいと思ってる輩はそのことを全く理解してない。
不自然なことやってバギーだったり、その挙動がユーザーにとってデバッグしずらいものだったら
プログラマーにとって損だろ。
なんでもコンパイラにやらせればいいと思ってる輩はそのことを全く理解してない。
110デフォルトの名無しさん
2020/04/02(木) 06:40:45.16ID:H71dGAdS ソートが必要になる程のデータ数をコンパイル時に用意するならコンパイル時ファイル読み込みも必要じゃない
111デフォルトの名無しさん
2020/04/02(木) 08:31:42.99ID:SbwrDqdV >>109
> 不自然なことやって
不自然かどうかは単なるお前の主観
> バギーだったり、
処理系の問題
> その挙動がユーザーにとってデバッグしずらいものだったら
無理矢理の仮定
> プログラマーにとって損だろ。
お前にとって損なだけ
コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
嫌なら使わなきゃいいだけ
> 不自然なことやって
不自然かどうかは単なるお前の主観
> バギーだったり、
処理系の問題
> その挙動がユーザーにとってデバッグしずらいものだったら
無理矢理の仮定
> プログラマーにとって損だろ。
お前にとって損なだけ
コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
嫌なら使わなきゃいいだけ
112デフォルトの名無しさん
2020/04/02(木) 12:24:51.88ID:Wbq1ni9c あんまり同意できないね
仕事で使う上だと嫌なら使うなというのは困る
多人数で作るうえでは使わないなら使われない仕組みが必要だからね
あとユーザが気軽にO(n^2)、O(n^3)みたない激重アルゴリズムをコンパイルフェーズに
組み込めるわけだけど、それコンパイラの仕事か?と思う
大規規模開発だとコンパイル時間の伸びは問題になる
フェーズわけるべきだよね
実際ビルド時に事前計算するものは多々あるけど、個別にスクリプトとか組むことに別に不満ないし
c++のコンパイルで一発で完結する必要性を感じない
仕事で使う上だと嫌なら使うなというのは困る
多人数で作るうえでは使わないなら使われない仕組みが必要だからね
あとユーザが気軽にO(n^2)、O(n^3)みたない激重アルゴリズムをコンパイルフェーズに
組み込めるわけだけど、それコンパイラの仕事か?と思う
大規規模開発だとコンパイル時間の伸びは問題になる
フェーズわけるべきだよね
実際ビルド時に事前計算するものは多々あるけど、個別にスクリプトとか組むことに別に不満ないし
c++のコンパイルで一発で完結する必要性を感じない
113デフォルトの名無しさん
2020/04/02(木) 13:47:09.18ID:RbNpa6BP 嫌なら使うなって、C/C++のことだろ
つまり転職したほうがいいと暗に言っている
つまり転職したほうがいいと暗に言っている
114デフォルトの名無しさん
2020/04/02(木) 13:48:21.30ID:1Y8qGLwI うん、まぁ、自分ならメタプログラミングとか特殊化で
定数のソートがあったら助かるかも・・助からないかも・・程度だけど
標準のやることに疑問を呈すと必ず>>111みたいな変なのが湧くよね
まぁ、コンパイル時のソートしてもしなくてもコンパイル時のオーバーヘッドは微々たるもんじゃね?
大量のインスタンス化とかが起きなければ。
定数のソートがあったら助かるかも・・助からないかも・・程度だけど
標準のやることに疑問を呈すと必ず>>111みたいな変なのが湧くよね
まぁ、コンパイル時のソートしてもしなくてもコンパイル時のオーバーヘッドは微々たるもんじゃね?
大量のインスタンス化とかが起きなければ。
115デフォルトの名無しさん
2020/04/02(木) 13:54:25.98ID:1Y8qGLwI あ、あと
>コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
20年使ってるがそんな思想聞いたこともない
あとコンパイル時に出来る(上に、後で困ったりしない)場面って少ないよ
実際のソフト開発に使ったことないと気付かないんだろうけど
>コンパイル時できることはコンパイル時にやるのはC/C++の思想としては当たり前
20年使ってるがそんな思想聞いたこともない
あとコンパイル時に出来る(上に、後で困ったりしない)場面って少ないよ
実際のソフト開発に使ったことないと気付かないんだろうけど
116デフォルトの名無しさん
2020/04/02(木) 14:01:37.69ID:Tie7sLxb いや、constexprのお陰もあってコンパイル時に解決できることは思いの外増えている
117デフォルトの名無しさん
2020/04/02(木) 14:09:38.15ID:1Y8qGLwI 実例挙げてくれ
118はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 14:31:13.11ID:sLIn31jD constexpr つっても定数式の文脈以外ではコンパイルのフェイズで計算する保証はないよ。
コンパイラの裁量でほどほどにしてくれるからコンパイルのコストが極端に増大することは心配しなくていい。
(たぶんオプションとかで制御できるようになってる。)
constexpr の制約の範囲内に変形するのが難しいようなものまで無理して constexpr 化する必要はないけど、
付けれるもんなら付けとくくらいのスタンスでよいんじゃないかなぁ。
コンパイラの裁量でほどほどにしてくれるからコンパイルのコストが極端に増大することは心配しなくていい。
(たぶんオプションとかで制御できるようになってる。)
constexpr の制約の範囲内に変形するのが難しいようなものまで無理して constexpr 化する必要はないけど、
付けれるもんなら付けとくくらいのスタンスでよいんじゃないかなぁ。
119デフォルトの名無しさん
2020/04/02(木) 14:37:59.99ID:Qj/v/C6S 保証も何も、実行時にしか分からん値をどうやってコンパイル時に計算するんだ
はちみつ自身よく分かってないだろ
はちみつ自身よく分かってないだろ
120デフォルトの名無しさん
2020/04/02(木) 14:38:59.27ID:Qj/v/C6S >(たぶんオプションとかで制御できるようになってる。)
初耳だな
初耳だな
121はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 14:44:22.92ID:sLIn31jD gcc のオプションをざっと検索してみたけど、
定数式の文脈とそうでないときを区別して指定するようなものは見つからんかった……。
定数式の文脈とそうでないときを区別して指定するようなものは見つからんかった……。
122はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 14:45:31.73ID:sLIn31jD >>119
入力がコンパイル時にわかる値 (定数式) でもその関数の呼び出し自身が定数式の文脈にない場合のことを言ってる。
入力がコンパイル時にわかる値 (定数式) でもその関数の呼び出し自身が定数式の文脈にない場合のことを言ってる。
123デフォルトの名無しさん
2020/04/02(木) 15:00:36.45ID:Qj/v/C6S >>122
「定数式の文脈以外では」保証もクソも原理的に不可能だと言ってんの
「定数式の文脈以外では」保証もクソも原理的に不可能だと言ってんの
125デフォルトの名無しさん
2020/04/02(木) 15:21:55.32ID:Qj/v/C6S それを定数式の文脈と呼ぶんじゃないの
127デフォルトの名無しさん
2020/04/02(木) 15:26:39.69ID:Qj/v/C6S あー調べたら意味わかったわ、結果を格納する左辺が非constexprなら定数式としては呼ばれないと決まってるんだな
それを定数式の文脈と呼ぶのはおかしいと思うが
それを定数式の文脈と呼ぶのはおかしいと思うが
128はちみつ餃子 ◆8X2XSCHEME
2020/04/02(木) 15:30:04.54ID:sLIn31jD >>127
cpprefjp でそういう用語を使ってるから私もそれに倣ったんだけども、
cppreference の方では「定数式を要求する文脈」という言い方をしてるなぁ。
こっちの方がわかりやすいと思うので今後はこっちを使うようにするよ。
cpprefjp でそういう用語を使ってるから私もそれに倣ったんだけども、
cppreference の方では「定数式を要求する文脈」という言い方をしてるなぁ。
こっちの方がわかりやすいと思うので今後はこっちを使うようにするよ。
129デフォルトの名無しさん
2020/04/02(木) 16:34:46.83ID:WWm7acVs 標準化以前からTMP大ウケだったC++に何求めてるんだよ
130デフォルトの名無しさん
2020/04/02(木) 17:00:14.72ID:0tSRYO67 使い道を想像できない人のほうが多いことにとても驚いてます。
131デフォルトの名無しさん
2020/04/02(木) 17:05:14.94ID:0tSRYO67 Javaは心が洗われるような美しい言語だったのに、豆とか言い出したあたりから汚れてしまった。
もはや何も感じない。
もはや何も感じない。
132デフォルトの名無しさん
2020/04/02(木) 17:05:16.25ID:Qj/v/C6S >>130
だから実例よろしく
だから実例よろしく
133デフォルトの名無しさん
2020/04/02(木) 17:05:53.37ID:0tSRYO67 >>132
Excel使わなくて済むなって。
Excel使わなくて済むなって。
134デフォルトの名無しさん
2020/04/02(木) 17:08:51.09ID:0tSRYO67 https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inhtml
今ここやってんの。
色々検索してたら、std::sortにconstexprが付くというのを見つけて。
なんだこれ!
なんだこれ!
なんだこれ!
となった。
でもまだついてないから使えない。
今ここやってんの。
色々検索してたら、std::sortにconstexprが付くというのを見つけて。
なんだこれ!
なんだこれ!
なんだこれ!
となった。
でもまだついてないから使えない。
135デフォルトの名無しさん
2020/04/02(木) 17:11:36.01ID:Wbq1ni9c なぜ驚くのかよくわからん
ポイントは何?
ポイントは何?
136デフォルトの名無しさん
2020/04/02(木) 17:19:53.12ID:RbNpa6BP 翻訳時に解決できることを、実行環境に持ち越さないために
コンパイラ方式であることが20年かかってもわからんやつが
constexprという止めまで刺されてまだ暴れてるな
コンパイラ方式であることが20年かかってもわからんやつが
constexprという止めまで刺されてまだ暴れてるな
137デフォルトの名無しさん
2020/04/02(木) 17:21:23.16ID:I8hlhwK7 20年前のitaniumみたいな失敗を繰り返そうとしてるバカ。
138デフォルトの名無しさん
2020/04/02(木) 17:48:06.37ID:0tSRYO67 大 変 驚 い て い ま す !
139デフォルトの名無しさん
2020/04/02(木) 17:53:56.92ID:uLX+Lk1l コンパイル時にソートできるのか
140デフォルトの名無しさん
2020/04/02(木) 18:05:19.51ID:Qj/v/C6S141デフォルトの名無しさん
2020/04/02(木) 18:12:59.71ID:0tSRYO67 発想を逆にしてみたらどうだろ。
100万件のデータをソートしたらコンパイル時間が増えるみたいな方向性じゃなくて。
100万件のデータにマッチさせる側の数十件の情報をコンパイル時にソートするとしたら?
ぐもももも!ってなる。
ちなみに100万件の文字列をソートするのは数百ミリ秒。
そんなに怖がるほどでもない。
100万件のデータをソートしたらコンパイル時間が増えるみたいな方向性じゃなくて。
100万件のデータにマッチさせる側の数十件の情報をコンパイル時にソートするとしたら?
ぐもももも!ってなる。
ちなみに100万件の文字列をソートするのは数百ミリ秒。
そんなに怖がるほどでもない。
142デフォルトの名無しさん
2020/04/02(木) 18:13:43.47ID:RbNpa6BP143デフォルトの名無しさん
2020/04/02(木) 18:19:18.38ID:Qj/v/C6S144デフォルトの名無しさん
2020/04/02(木) 18:23:36.92ID:0tSRYO67 こ れ は 凄 い こ と で す よ !
145デフォルトの名無しさん
2020/04/02(木) 18:26:27.69ID:0tSRYO67 21世紀最大の発明と言われる右辺値参照についてもコメントお願いします。
ノーベル賞はいつ決まるんでしょうか。
ノーベル賞はいつ決まるんでしょうか。
146デフォルトの名無しさん
2020/04/02(木) 18:28:13.54ID:jVaX7Z/j まあPL/1は35年前からプリプロセッサでサブルーチンも定義できてたから今更コンパイル時にソートできてもたいした驚きはないわ
147デフォルトの名無しさん
2020/04/02(木) 18:35:18.32ID:4Juv79OL 西洋人の決定論が反映されている
「未来は決まって無い」という考え方はダイナミックであり動的と呼ばれる
「未来は全て決まっている」というのが彼らの古典的な思考方法
未来において起こることの全ては、あらかじめ既に決まっている
というか、神が決めた
そういう宗教的思想あるいは神学が反映されている
「未来は決まって無い」という考え方はダイナミックであり動的と呼ばれる
「未来は全て決まっている」というのが彼らの古典的な思考方法
未来において起こることの全ては、あらかじめ既に決まっている
というか、神が決めた
そういう宗教的思想あるいは神学が反映されている
148デフォルトの名無しさん
2020/04/02(木) 18:42:26.03ID:0tSRYO67 禿 げ に ノ ー ベ ル 賞 を !
149デフォルトの名無しさん
2020/04/02(木) 18:51:05.61ID:0tSRYO67 >>147
ドラゴンブックを一通り実装したかどうかで変わるだけでは。
ドラゴンブックを一通り実装したかどうかで変わるだけでは。
150デフォルトの名無しさん
2020/04/02(木) 19:38:08.14ID:x6ke+Z1w 右辺値参照とmoveでET不要になる?
151デフォルトの名無しさん
2020/04/02(木) 21:38:05.56ID:sLIn31jD152デフォルトの名無しさん
2020/04/02(木) 21:57:48.18ID:RbNpa6BP153デフォルトの名無しさん
2020/04/03(金) 19:34:28.81ID:UoNKEVCn >>150
「ET」とはなんですか?
「ET」とはなんですか?
154デフォルトの名無しさん
2020/04/03(金) 21:35:11.04ID:SADwXAP6 >>153
ET (Expression Template)
ET (Expression Template)
155デフォルトの名無しさん
2020/04/03(金) 22:08:14.80ID:FLH8K04k >>152
デジタル回路は決定論的かもしれんがI/Oを通して外界と繋がっている件
デジタル回路は決定論的かもしれんがI/Oを通して外界と繋がっている件
156デフォルトの名無しさん
2020/04/05(日) 06:22:54.73ID:g2vNnymJ デマングルのことで質問があります。Ubuntu上でwebkitgtkというライブラリを見てるんですが、ライブラリ内に
以下のような2つのシンボル
_ZN3WTF6StringC1EPKDsj
_ZN3WTF6StringC2EPKDsj
があるんですが、これらはデマングル後
WTF::String::String(char16_t const*, unsigned int)
WTF::String::String(char16_t const*, unsigned int)
となって区別がつかない(少なくとも自分には)んですが、これはどういうことでしょう。C1とC2という部分の違いは...
ちなみに元のコード上では同じ型のコンストラクタがダブってたりはしていません(と思います)。し、ダブってたら
コンパイル時にエラーになりますよね?
リンカー的にはデマングル前のシンボルで扱うんでしょうから両者とも必要なんでしょうねやはり
以下のような2つのシンボル
_ZN3WTF6StringC1EPKDsj
_ZN3WTF6StringC2EPKDsj
があるんですが、これらはデマングル後
WTF::String::String(char16_t const*, unsigned int)
WTF::String::String(char16_t const*, unsigned int)
となって区別がつかない(少なくとも自分には)んですが、これはどういうことでしょう。C1とC2という部分の違いは...
ちなみに元のコード上では同じ型のコンストラクタがダブってたりはしていません(と思います)。し、ダブってたら
コンパイル時にエラーになりますよね?
リンカー的にはデマングル前のシンボルで扱うんでしょうから両者とも必要なんでしょうねやはり
157デフォルトの名無しさん
2020/04/05(日) 08:18:36.63ID:QAcrCW73 unique_ptrについて質問です。
std::unique_ptr<T> uptr(new T);
に対して、uptr.get() と *reinterpret_cast<T**>(&uptr) は常に一致するでしょうか。
用途としては生ポインタの配列を受けとる関数にstd::vector<std::unique_ptr<T>>を渡したいです。
例:
void display_ptr(size_t n, int** pp){
for(size_t i=0; i<n; ++i){
std::cout << pp[i] << '\n';
}
}
int main(){
std::vector<std::unique_ptr<int>> vec;
for(size_t i=0; i<3; ++i){
vec.emplace_back(new int);
}
display_ptr(vec.size(), reinterpret_cast<int**>(&vec[0]));
return 0;
}
std::unique_ptr<T> uptr(new T);
に対して、uptr.get() と *reinterpret_cast<T**>(&uptr) は常に一致するでしょうか。
用途としては生ポインタの配列を受けとる関数にstd::vector<std::unique_ptr<T>>を渡したいです。
例:
void display_ptr(size_t n, int** pp){
for(size_t i=0; i<n; ++i){
std::cout << pp[i] << '\n';
}
}
int main(){
std::vector<std::unique_ptr<int>> vec;
for(size_t i=0; i<3; ++i){
vec.emplace_back(new int);
}
display_ptr(vec.size(), reinterpret_cast<int**>(&vec[0]));
return 0;
}
158デフォルトの名無しさん
2020/04/05(日) 09:51:55.61ID:LNp8foc9 >>157
しない
しない
159デフォルトの名無しさん
2020/04/05(日) 13:16:18.53ID:P07lI1PF160デフォルトの名無しさん
2020/04/05(日) 14:16:13.12ID:LNp8foc9161デフォルトの名無しさん
2020/04/05(日) 14:41:32.21ID:P07lI1PF UChar * と char16_t * の方だから 84-86 行目の方だったスマソ
162デフォルトの名無しさん
2020/04/05(日) 17:57:58.00ID:IgCOpQa5163デフォルトの名無しさん
2020/04/06(月) 00:17:22.43ID:YN01J8oK 2次元のレイキャスティングを作成しようとしてます。
ttps://github.com/OneLoneCoder/olcPixelGameEngine/blob/master/Videos/OneLoneCoder_PGE_ShadowCasting2D.cpp
にあるコードを現在javaで書いており、
ttps://youtu.be/fc3nnG2CG8U?t=1519
のように縦に長く1本線が出来てほしいのですが、
縦やにブロックを並べた時に、なぜか1ブロックごとに線が出来てしまいます。
どうすれば動画みたいに、縦に長い1本線が出来ますでしょうか?
コードは
ttps://ideone.com/spxzNE
に載せてみました。
ttps://github.com/OneLoneCoder/olcPixelGameEngine/blob/master/Videos/OneLoneCoder_PGE_ShadowCasting2D.cpp
にあるコードを現在javaで書いており、
ttps://youtu.be/fc3nnG2CG8U?t=1519
のように縦に長く1本線が出来てほしいのですが、
縦やにブロックを並べた時に、なぜか1ブロックごとに線が出来てしまいます。
どうすれば動画みたいに、縦に長い1本線が出来ますでしょうか?
コードは
ttps://ideone.com/spxzNE
に載せてみました。
164デフォルトの名無しさん
2020/04/06(月) 00:42:09.55ID:JpxE2ikJ Javaの質問ならJavaスレへ逝け
165デフォルトの名無しさん
2020/04/06(月) 00:49:35.43ID:/hNEVjF2 無駄に長い一本糞を作りたいのなら修行を積んでください
166デフォルトの名無しさん
2020/04/06(月) 20:20:19.81ID:umYPTPrb わかりました。javaの法で聞きます。
167デフォルトの名無しさん
2020/04/06(月) 20:22:44.75ID:g7Z03+iy そこをなんとか!
168デフォルトの名無しさん
2020/04/08(水) 01:04:01.57ID:sLx4/ZJO 質問ですが抽象メソッドを有するクラスのデストラクタは
なんで勝手に仮想デストラクタにならないんでしょうか…
なんか有用なイディオムでもあるんでしょうか……………
C#しばらくやった後だったのでC#のつもりでインターフェースを定義して
virtual ~IFoo() { }
を書き忘れた結果盛大にリークすたgrz
なんで勝手に仮想デストラクタにならないんでしょうか…
なんか有用なイディオムでもあるんでしょうか……………
C#しばらくやった後だったのでC#のつもりでインターフェースを定義して
virtual ~IFoo() { }
を書き忘れた結果盛大にリークすたgrz
169はちみつ餃子 ◆8X2XSCHEME
2020/04/08(水) 09:41:04.41ID:kI16h2GK >>168
ゼロオーバーヘッドの原則は C++ 的にはかなり強い要請なので……。
オブジェクトに常にポインタを保持しなければならないことと、
呼び出すときに仮想関数テーブルをたどるコストがあるってのは看過できなかったんだろう。
ゼロオーバーヘッドの原則は C++ 的にはかなり強い要請なので……。
オブジェクトに常にポインタを保持しなければならないことと、
呼び出すときに仮想関数テーブルをたどるコストがあるってのは看過できなかったんだろう。
170デフォルトの名無しさん
2020/04/08(水) 09:52:16.86ID:BKxeQF3m ん〜そもそも抽象と仮想はもともとの発想が違うから似て非なるもの
さらにC#においてclassとinterfaceは似て非なるもの
C++に厳密な意味でinterfaceを実現する機能はない
そのへんはよしなによしなに
ていうか~IFOOの書き忘れがリークの元凶て発想があかん
解放し忘れしたらあかん物はsafe〜とかのクラスに押し込むべき
さらにC#においてclassとinterfaceは似て非なるもの
C++に厳密な意味でinterfaceを実現する機能はない
そのへんはよしなによしなに
ていうか~IFOOの書き忘れがリークの元凶て発想があかん
解放し忘れしたらあかん物はsafe〜とかのクラスに押し込むべき
171デフォルトの名無しさん
2020/04/08(水) 10:09:18.67ID:bRUXA7Cg でも仮想関数を持つクラスのデストラクタをわざわざ非仮想にするメリットってなんかあるの?実際の所
172デフォルトの名無しさん
2020/04/08(水) 10:20:56.86ID:iAMh5USc shared_ptrで管理するなら仮想デストラクタである必要がない
無駄に遅くなる
無駄に遅くなる
173デフォルトの名無しさん
2020/04/08(水) 11:24:20.39ID:BKxeQF3m >>171
インターフェースという位置づけなら仮想・非仮想どちらにしろデストラクタが直に呼ばれるべきじゃないんじゃないかと思うわ
ただのインターフェースだからむしろ非仮想&protectedで隠すのがいいんじゃないかと(しらんけど)
↓こんなイメージで直にデストラクタ触れるのはclass A以降
struct IFOO
{
protected:~IFOO();
};
class A:IFOO
{
public: virtual ~A();
};
class B:A{};
class C:A{};
インターフェースという位置づけなら仮想・非仮想どちらにしろデストラクタが直に呼ばれるべきじゃないんじゃないかと思うわ
ただのインターフェースだからむしろ非仮想&protectedで隠すのがいいんじゃないかと(しらんけど)
↓こんなイメージで直にデストラクタ触れるのはclass A以降
struct IFOO
{
protected:~IFOO();
};
class A:IFOO
{
public: virtual ~A();
};
class B:A{};
class C:A{};
174デフォルトの名無しさん
2020/04/08(水) 11:40:23.05ID:bRUXA7Cg それって要するに解放する時に、IFOOじゃなくてAだとかBだとかの
インスタンスの正体を全て把握しとけってことでしょ?
だったらそもそもIFOOって必要なの?って思う
インスタンスの正体を全て把握しとけってことでしょ?
だったらそもそもIFOOって必要なの?って思う
175デフォルトの名無しさん
2020/04/08(水) 11:48:39.21ID:cOYSaP/H176デフォルトの名無しさん
2020/04/08(水) 12:03:48.95ID:cOYSaP/H 途中で書き込んでしまった
なので、やるとしても警告を出すぐらいだな
って思ってたらVisual Studio 2017だと既に警告出るわ(「警告をすべて有効にする」にしないとダメだけど)
warning C4265: 'C': クラスは仮想関数を含んでいますが、デストラクタはこのクラスの仮想インスタンスではなく、正しく消滅されない可能性があります
なので、やるとしても警告を出すぐらいだな
って思ってたらVisual Studio 2017だと既に警告出るわ(「警告をすべて有効にする」にしないとダメだけど)
warning C4265: 'C': クラスは仮想関数を含んでいますが、デストラクタはこのクラスの仮想インスタンスではなく、正しく消滅されない可能性があります
177デフォルトの名無しさん
2020/04/08(水) 12:54:49.68ID:BKxeQF3m >>174
まあ不要かもしらんけどねぇ
でもC#でも仮想デストラクタを入れてるインターフェースてなくね?
リソース開放を請け負うIDisposableにしても派生クラスのデストラクタから呼び出す形
呼び出さなきゃ勝手に呼ばれるわけでもない
むしろ仮想デストラクタは便利だから使う程度の利点しかなくてインターフェースとしては不要なんじゃないかと言う気がする
まあ不要かもしらんけどねぇ
でもC#でも仮想デストラクタを入れてるインターフェースてなくね?
リソース開放を請け負うIDisposableにしても派生クラスのデストラクタから呼び出す形
呼び出さなきゃ勝手に呼ばれるわけでもない
むしろ仮想デストラクタは便利だから使う程度の利点しかなくてインターフェースとしては不要なんじゃないかと言う気がする
178デフォルトの名無しさん
2020/04/08(水) 13:19:13.33ID:bRUXA7Cg GCがあるC#の話されても困る
179デフォルトの名無しさん
2020/04/08(水) 13:27:08.18ID:lWfV0IAd GCに夢観過ぎ
180デフォルトの名無しさん
2020/04/08(水) 13:32:26.06ID:bRUXA7Cg 夢の話じゃなくてリソース解放戦略が全然違うんだから比べても仕方ないだろ
というかそもそもC#は全部のメソッドがC++で言うところのvirtualなんだから比べようもない
というかそもそもC#は全部のメソッドがC++で言うところのvirtualなんだから比べようもない
181デフォルトの名無しさん
2020/04/08(水) 14:40:59.29ID:lr7ClYRx 学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
PS スカイプ友達の掲示板 ttp://skype.x0000.net
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
PS スカイプ友達の掲示板 ttp://skype.x0000.net
182デフォルトの名無しさん
2020/04/08(水) 21:04:52.01ID:4NV79iCU GC教のやつC++破門な
183デフォルトの名無しさん
2020/04/08(水) 22:17:53.89ID:sLx4/ZJO class IFoo {
virtual int sum(int a, int b) const = 0;
};
これの書き方でリーク原因だったという話、
virtual int sum(int a, int b) const = 0;
};
これの書き方でリーク原因だったという話、
184デフォルトの名無しさん
2020/04/08(水) 22:20:32.95ID:17Fq4h5D コンパイラがクソなだけ
185デフォルトの名無しさん
2020/04/08(水) 22:23:35.70ID:sLx4/ZJO public: を忘れたgrz、
で、
class IFoo {
public:
virtual ~IFoo() { }
virtual int sum(int a, int b) const = 0;
};
としたら治まった、
で、
class IFoo {
public:
virtual ~IFoo() { }
virtual int sum(int a, int b) const = 0;
};
としたら治まった、
186デフォルトの名無しさん
2020/04/08(水) 22:26:09.85ID:sLx4/ZJO >>172
std::shared_ptr<(IFooの派生クラス)> pObj(new (IFooの派生クラス)()) ならそもそもsumの方こそ仮想関数でなくても良い
std::shared_ptr<IFoo> pObj(new (IFooの派生クラス()) ならデストラクタが仮想でないとマズー
仮想関数有りかつ非仮想デストラクタ、を許すC++のこの仕様の理由をゼロオーバーヘッドの原則で説明くのであれば
仮想関数有りかつ非仮想デストラクタ、を許すことで得られる性能上のメリットが指摘されねばならない
std::shared_ptr<(IFooの派生クラス)> pObj(new (IFooの派生クラス)()) ならそもそもsumの方こそ仮想関数でなくても良い
std::shared_ptr<IFoo> pObj(new (IFooの派生クラス()) ならデストラクタが仮想でないとマズー
仮想関数有りかつ非仮想デストラクタ、を許すC++のこの仕様の理由をゼロオーバーヘッドの原則で説明くのであれば
仮想関数有りかつ非仮想デストラクタ、を許すことで得られる性能上のメリットが指摘されねばならない
187デフォルトの名無しさん
2020/04/08(水) 22:35:26.36ID:iAMh5USc てかそれshared_ptrの作り方が悪いだけじゃん
普通make_sharedで作る。
weakを使う場合でオブジェクト自身が巨大なためメモリは即座に解放したいときでも一度newした型のshared_ptr作れと
普通make_sharedで作る。
weakを使う場合でオブジェクト自身が巨大なためメモリは即座に解放したいときでも一度newした型のshared_ptr作れと
188デフォルトの名無しさん
2020/04/08(水) 22:36:00.40ID:d4D5nRup ほう、でそのメリットとは?
189デフォルトの名無しさん
2020/04/08(水) 22:38:08.35ID:iAMh5USc 大体純粋仮想しか持たないクラスって要はinterfaceでしょ
そのポインタで派生オブジェクトのインスタンスのリソース管理するってのとは全く別の概念じゃないか
そのポインタで派生オブジェクトのインスタンスのリソース管理するってのとは全く別の概念じゃないか
190デフォルトの名無しさん
2020/04/08(水) 22:39:37.60ID:sLx4/ZJO >>189
C++に向かって言うと良い
C++に向かって言うと良い
191デフォルトの名無しさん
2020/04/08(水) 22:51:06.86ID:iAMh5USc >>186
あー何となくわかったわ
shared_ptrの使い方分かってないのね
一度派生型のshared_ptrで作ったら、それをbaseのshared_ptrに代入して保持していても、デストラクタは元の型で呼ばれるよ
ってかそういう風に使うもの
newと入れるshared_ptrの型を変えるのはダメな使い方
あー何となくわかったわ
shared_ptrの使い方分かってないのね
一度派生型のshared_ptrで作ったら、それをbaseのshared_ptrに代入して保持していても、デストラクタは元の型で呼ばれるよ
ってかそういう風に使うもの
newと入れるshared_ptrの型を変えるのはダメな使い方
192デフォルトの名無しさん
2020/04/08(水) 22:56:00.22ID:iAMh5USc って思ったけどよく考えたらいきなりbaseのshared_ptrに入れても大丈夫だったはず
193デフォルトの名無しさん
2020/04/08(水) 22:57:35.23ID:sLx4/ZJO (はてさて…よくわかっていないのはどちらなのやろうか…
194デフォルトの名無しさん
2020/04/08(水) 23:01:19.22ID:iAMh5USc195デフォルトの名無しさん
2020/04/08(水) 23:44:04.80ID:oQNNxwBC >一度派生型のshared_ptrで作ったら、それをbaseのshared_ptrに代入して保持していても、デストラクタは元の型で呼ばれるよ
えっそうなん?って試してみたらマジだった。
https://ideone.com/ZRde8G
https://cpprefjp.github.io/reference/memory/shared_ptr.html
> 通常、void*に型変換して代入されたポインタは、delete演算子を呼んだとしても元の型のデストラクタは呼び出されない。しかしshared_ptrの場合は、代入されたポインタの型が持つデストラクタが正しく実行されることが保証される。
知らんかった。
えっそうなん?って試してみたらマジだった。
https://ideone.com/ZRde8G
https://cpprefjp.github.io/reference/memory/shared_ptr.html
> 通常、void*に型変換して代入されたポインタは、delete演算子を呼んだとしても元の型のデストラクタは呼び出されない。しかしshared_ptrの場合は、代入されたポインタの型が持つデストラクタが正しく実行されることが保証される。
知らんかった。
196デフォルトの名無しさん
2020/04/08(水) 23:57:12.53ID:bRUXA7Cg 万能じゃないけどな
作る時に本来の型を教えないといけない
shared_ptr<Base> s(new Derived()) // OK
Base* b = new Derived();
shared_ptr<Base> s(b); // NG
作る時に本来の型を教えないといけない
shared_ptr<Base> s(new Derived()) // OK
Base* b = new Derived();
shared_ptr<Base> s(b); // NG
197デフォルトの名無しさん
2020/04/09(木) 00:30:09.12ID:U7264wso > 作る時に本来の型を教えないといけない
なるほど。
ttps://ideone.com/BUt4xc
教えてくれてありがとうな。勉強になる。
なるほど。
ttps://ideone.com/BUt4xc
教えてくれてありがとうな。勉強になる。
198デフォルトの名無しさん
2020/04/09(木) 00:57:59.70ID:1Z0E9i00 なんのためのvirtualなのか解ってないのか
199デフォルトの名無しさん
2020/04/09(木) 01:01:05.17ID:fPJh3bcf ば、ばーちゃん…
200デフォルトの名無しさん
2020/04/09(木) 02:46:58.11ID:xoGUUmQY 横レスですみませんがそもそもポインタなんてCの配列かscanfくらいでしか使ったことないんですがスマポとかってどんな事(時)に使うんですか?
201デフォルトの名無しさん
2020/04/09(木) 03:49:37.37ID:Jilblwzi スマートポインタどころか、new deleteさえ使わなくなったな。
202デフォルトの名無しさん
2020/04/09(木) 06:58:42.11ID:G208HopB >>200
動的なメモリ確保をしたことがない?
動的なメモリ確保をしたことがない?
203デフォルトの名無しさん
2020/04/09(木) 07:41:56.66ID:Jilblwzi 昔はよくやりましたよね。
204デフォルトの名無しさん
2020/04/09(木) 07:44:32.83ID:jjLWwUCO 結局、計算資源はそのスコープで管理するってのが主流になりつつある。
205デフォルトの名無しさん
2020/04/09(木) 08:55:49.91ID:LQ7/CkSE C++は昔からそうだったと思うが
まぁCだと関数が確保して呼び出し元でどうこうするのも多かったけど
まぁCだと関数が確保して呼び出し元でどうこうするのも多かったけど
206デフォルトの名無しさん
2020/04/09(木) 09:06:44.43ID:jjLWwUCO 例外入れてそういう性質は薄れてるでしょ。
207デフォルトの名無しさん
2020/04/09(木) 16:57:05.68ID:J3GRH2ud https://ideone.com/FvsiNz
意味わからん。
意味わからん。
208デフォルトの名無しさん
2020/04/09(木) 17:00:04.84ID:J3GRH2ud std::make_shared<hoge>(); 知らんの?
209デフォルトの名無しさん
2020/04/09(木) 17:34:40.74ID:l1qMzl9z >>207
mainでsort呼び出すところで、boolの後にret=みたいなのが無いせいで変に解釈されている
mainでsort呼び出すところで、boolの後にret=みたいなのが無いせいで変に解釈されている
210デフォルトの名無しさん
2020/04/09(木) 18:20:12.74ID:uChXMS9h >>200
CreateWindowExのlParam経由でオブジェクトのポインタを渡して受けて側でunique_ptrに格納して管理したりしてるよ
CreateWindowExのlParam経由でオブジェクトのポインタを渡して受けて側でunique_ptrに格納して管理したりしてるよ
211デフォルトの名無しさん
2020/04/09(木) 18:20:40.62ID:RTR2QVCs >>204
スコープを飛び越えて永続的にデータを保持するために使うのが Heap なんだが。
スコープを飛び越えて永続的にデータを保持するために使うのが Heap なんだが。
212デフォルトの名無しさん
2020/04/09(木) 19:11:41.90ID:jjLWwUCO213デフォルトの名無しさん
2020/04/09(木) 19:18:35.93ID:l1qMzl9z 使わんように成っていないよなぁ
214デフォルトの名無しさん
2020/04/09(木) 19:58:02.69ID:J3GRH2ud >>209 thx!
215デフォルトの名無しさん
2020/04/09(木) 21:40:49.11ID:c2wEsJAp216デフォルトの名無しさん
2020/04/09(木) 22:37:55.19ID:jjLWwUCO python,go,rustあたり見てもスコープ抜けた時に後処理する機構をサポートしとる。
217デフォルトの名無しさん
2020/04/09(木) 22:46:51.57ID:Yh5weH6+ お前はスコープで管理するのが主流っていったわけだけど
gcのないc++ではスコープで管理できるものはスコープで管理するのは
大昔から当たり前ではないでしょうか
何がいいたいのやらわからん
gcのないc++ではスコープで管理できるものはスコープで管理するのは
大昔から当たり前ではないでしょうか
何がいいたいのやらわからん
218デフォルトの名無しさん
2020/04/09(木) 23:15:28.15ID:U1el1zKz C++はおじょーずでも日本語アレな奴多いよね
職場でちゃんとコミュニケーションとれてるか?www
職場でちゃんとコミュニケーションとれてるか?www
219デフォルトの名無しさん
2020/04/09(木) 23:46:04.93ID:l1qMzl9z そんなん昔からじゃん
それこそcどころかアセンブラの頃から
それこそcどころかアセンブラの頃から
220デフォルトの名無しさん
2020/04/10(金) 02:12:51.60ID:W/LKdoJE コンピュータとコミュニケーション取る方が大事だから
221デフォルトの名無しさん
2020/04/10(金) 05:02:14.17ID:sn6MPl7m222デフォルトの名無しさん
2020/04/10(金) 06:08:55.13ID:JXOjZTrq プログラミングスタイルが変わってきてるんだよね。
アジャイルとOOPは相性が悪いのかもしれない。
アジャイルとOOPは相性が悪いのかもしれない。
223デフォルトの名無しさん
2020/04/10(金) 06:35:52.26ID:+a3yzOMH sort(
vecVisibilityPolygonPoints.begin(),
vecVisibilityPolygonPoints.end(),
[&](const tuple<float, float, float> &t1, const tuple<float, float, float> &t2)
{
return get<0>(t1) < get<0>(t2);
});
はt1の最初に設定されたfloatとt2の最初に設定されたfloatを比較して昇順に並べているのでしょうか?
[&]の意味はよく分からなくて教えて頂けると幸いです。
vecVisibilityPolygonPoints.begin(),
vecVisibilityPolygonPoints.end(),
[&](const tuple<float, float, float> &t1, const tuple<float, float, float> &t2)
{
return get<0>(t1) < get<0>(t2);
});
はt1の最初に設定されたfloatとt2の最初に設定されたfloatを比較して昇順に並べているのでしょうか?
[&]の意味はよく分からなくて教えて頂けると幸いです。
224デフォルトの名無しさん
2020/04/10(金) 06:43:17.35ID:JXOjZTrq そうですね。
&に何の意味があるのか僕にもわかりません。
&に何の意味があるのか僕にもわかりません。
225デフォルトの名無しさん
2020/04/10(金) 07:08:42.52ID:j4px16+n >>223
>t1の最初に設定されたfloatとt2の最初に設定されたfloatを比較して昇順に並べているのでしょうか?
その通りです。get<0>(t)でタプルの最初の要素を取り出して大小比較してます。
ちなみにget<0>を使わずに直接 t1 < t2 と比較すればタプルの左の要素から順に辞書順でsortされます。リンク先の(3)参照。
https://ja.cppreference.com/w/cpp/utility/tuple/operator_cmp
[&]はラムダ式の中で使われる外部の変数を参照で持ってくるものです。リンク先のラムダキャプチャを参照。
ただ上の例ではそもそも外部の変数を使っていないので[&]ではなく単に[]で問題ないです。
https://ja.cppreference.com/w/cpp/language/lambda
>t1の最初に設定されたfloatとt2の最初に設定されたfloatを比較して昇順に並べているのでしょうか?
その通りです。get<0>(t)でタプルの最初の要素を取り出して大小比較してます。
ちなみにget<0>を使わずに直接 t1 < t2 と比較すればタプルの左の要素から順に辞書順でsortされます。リンク先の(3)参照。
https://ja.cppreference.com/w/cpp/utility/tuple/operator_cmp
[&]はラムダ式の中で使われる外部の変数を参照で持ってくるものです。リンク先のラムダキャプチャを参照。
ただ上の例ではそもそも外部の変数を使っていないので[&]ではなく単に[]で問題ないです。
https://ja.cppreference.com/w/cpp/language/lambda
226デフォルトの名無しさん
2020/04/10(金) 09:22:51.69ID:dM0rZx5j227デフォルトの名無しさん
2020/04/10(金) 10:43:26.39ID:Ntz3fYqx >>226
お前さんがそこで流れと言っているものは別に最近できた流れでもなく、昔からあったし随時拡充されてきているものだぞ。
お前さんがそこで流れと言っているものは別に最近できた流れでもなく、昔からあったし随時拡充されてきているものだぞ。
228デフォルトの名無しさん
2020/04/10(金) 11:08:46.24ID:JXOjZTrq じゃあnewしたら負けって事で。
229デフォルトの名無しさん
2020/04/10(金) 11:14:55.67ID:JXOjZTrq 僕も流れを感じますね。
このフォースを感じ取れないものもいるんですね。
少し驚きました。
このフォースを感じ取れないものもいるんですね。
少し驚きました。
230デフォルトの名無しさん
2020/04/10(金) 11:17:22.22ID:nz1tlAhX get<0> とか get<1> とか観るとげんなりする
なんで動的にアクセスできないんだ
なんで動的にアクセスできないんだ
231デフォルトの名無しさん
2020/04/10(金) 11:19:41.31ID:W/LKdoJE そりゃ0番目と1番目の型が違うかもしれないからだよ
232はちみつ餃子 ◆8X2XSCHEME
2020/04/10(金) 11:23:39.14ID:n212JbcP233デフォルトの名無しさん
2020/04/10(金) 11:27:18.78ID:JXOjZTrq 格納する値の型を知っているのに相称型でしかアクセスできないのは不便ではないかというご提案として、受け付けました。
進捗状況は、ご提案番号1として随時ご確認できます。
格納する値が実行時にしか確定しない以上、コンパイラが値の型にアクセスすることも出来ないんだよな。
std::variantのoperator==は荒業でアクセスしてるよね。
進捗状況は、ご提案番号1として随時ご確認できます。
格納する値が実行時にしか確定しない以上、コンパイラが値の型にアクセスすることも出来ないんだよな。
std::variantのoperator==は荒業でアクセスしてるよね。
234デフォルトの名無しさん
2020/04/10(金) 11:53:36.61ID:OfwBXl+o あらかじめインデックス渡した関数テンプレートを実体化して
boost::anyみたいなものを返すという力技でどうにか出来なくもないだろうけど
上の方で何でもコンパイル時にやるのが良い事みたいに思ってるアホがいたけど
この辺の問題全く分かってないんだろうなぁ
(tupleを否定してるわけじゃないので変な噛み付き方しないように
boost::anyみたいなものを返すという力技でどうにか出来なくもないだろうけど
上の方で何でもコンパイル時にやるのが良い事みたいに思ってるアホがいたけど
この辺の問題全く分かってないんだろうなぁ
(tupleを否定してるわけじゃないので変な噛み付き方しないように
235デフォルトの名無しさん
2020/04/10(金) 12:15:49.17ID:GQp0hxvn 学術巨大掲示板群: アルファ・ラボ
ttp://x0000.net
物理学 化学 数学 生物学 天文学 地理地学
IT 電子 工学 国語 方言 言語学 など
ttp://x0000.net
物理学 化学 数学 生物学 天文学 地理地学
IT 電子 工学 国語 方言 言語学 など
236デフォルトの名無しさん
2020/04/10(金) 12:21:34.43ID:W/LKdoJE int要素が1個だけならget<int>でアクセスできなかったっけ
237デフォルトの名無しさん
2020/04/10(金) 12:33:52.04ID:JXOjZTrq 出来る限りコンパイル時に解決したほうが良いと思います。
238デフォルトの名無しさん
2020/04/10(金) 12:37:34.37ID:JXOjZTrq constexpr ifで実行時の条件分岐数を減らす。
これがいま話題の都会的プログラミング。
これがいま話題の都会的プログラミング。
239デフォルトの名無しさん
2020/04/10(金) 12:52:10.41ID:VwhukIlH240デフォルトの名無しさん
2020/04/10(金) 12:59:34.56ID:VwhukIlH template < typename > union vector3 {
struct {
T x;
T y;
T z;
};
T[3];
T&operator[](int n);
const T& operator [](int n) const;
};
struct {
T x;
T y;
T z;
};
T[3];
T&operator[](int n);
const T& operator [](int n) const;
};
241デフォルトの名無しさん
2020/04/10(金) 12:59:47.08ID:JXOjZTrq 定数に名前つけるのはどうだろか。
242デフォルトの名無しさん
2020/04/10(金) 13:06:38.10ID:VwhukIlH >>238
規模の小さな小さなプログラムでしか効果が無いようなことが都会的かあ
規模の小さな小さなプログラムでしか効果が無いようなことが都会的かあ
243デフォルトの名無しさん
2020/04/10(金) 13:26:20.94ID:JXOjZTrq フォースを感じ取るんだ。
244デフォルトの名無しさん
2020/04/10(金) 13:55:31.86ID:Ntz3fYqx >>242
何も知らない田舎者が漠然と憧れてイメージする都会ってことだろう
何も知らない田舎者が漠然と憧れてイメージする都会ってことだろう
245デフォルトの名無しさん
2020/04/10(金) 14:25:31.83ID:JXOjZTrq 岡山は大都会。
246デフォルトの名無しさん
2020/04/10(金) 15:17:20.24ID:C0/P2P/U 都会が優れていると思っている人を見ると、馬鹿なのかな、と思ってしまう。
247デフォルトの名無しさん
2020/04/10(金) 16:06:17.50ID:JXOjZTrq キミ良いこと言うね。
248デフォルトの名無しさん
2020/04/10(金) 17:42:57.17ID:j4px16+n タプルの分解は構造化束縛でだいぶ楽になったけど使わない変数を読み棄てる機能も欲しい
int main(){
const std::tuple<std::string_view, int> person("nanashi", 35);
const auto [name, age] = person;
std::cout << "name:" << name << ", age:" << age << std::endl;
return 0;
}
int main(){
const std::tuple<std::string_view, int> person("nanashi", 35);
const auto [name, age] = person;
std::cout << "name:" << name << ", age:" << age << std::endl;
return 0;
}
249デフォルトの名無しさん
2020/04/10(金) 19:35:38.21ID:Ekk6JBhA タプルなんて小規模のちょこっとしたプロトタイプコードのときは
楽だなんておもうけど、きちっとした巨大なコードに仕立て上げていく経過で
結局ふつうにちゃんと構造体なりを定義してそれ返すようにしないと後々
混乱しかないのが見えて結局こんなのイラネーな、ってなる
楽だなんておもうけど、きちっとした巨大なコードに仕立て上げていく経過で
結局ふつうにちゃんと構造体なりを定義してそれ返すようにしないと後々
混乱しかないのが見えて結局こんなのイラネーな、ってなる
250デフォルトの名無しさん
2020/04/10(金) 19:38:38.50ID:1+J64Tmd 都会つってもアーバンライフが理想だったりするんだよね
最先端とは言わなくても整った街並み統一された景観
中心部は新旧入り混じったごみ溜めみたいなもん
流行に飛びついてつまみ食いするだけのが最悪
最先端とは言わなくても整った街並み統一された景観
中心部は新旧入り混じったごみ溜めみたいなもん
流行に飛びついてつまみ食いするだけのが最悪
251デフォルトの名無しさん
2020/04/10(金) 19:48:45.27ID:JXOjZTrq タプルはそういう風に使うものじゃないんだが。
252デフォルトの名無しさん
2020/04/10(金) 19:50:40.96ID:nPD3giIX タプルは雑多な多値を返したいときが本来の目的
メタプログラミングでも活躍するけど
メタプログラミングでも活躍するけど
253デフォルトの名無しさん
2020/04/10(金) 19:54:34.60ID:JXOjZTrq 使い方のわからない初心者が要らないというが、必要ないなら標準に入るわけがない。
254デフォルトの名無しさん
2020/04/10(金) 20:30:00.07ID:L+h9leRf >使い方のわからない初心者
自己紹介乙
自己紹介乙
255デフォルトの名無しさん
2020/04/10(金) 21:14:38.73ID:n33I9Qyf256デフォルトの名無しさん
2020/04/10(金) 22:48:19.66ID:uiBwCqn7 タプルはどっちかというと無名クラスそのものな印象
なので>>249に1票を入れたい
さらに言うとC++ではラムダ式の引数にもポインタを渡せるし、
[&]で呼び出し元変数の書き換えもできるしで
ラムダ式との絡みでもタプルという機構はそこはかとなく重畳な印象
、
なので>>249に1票を入れたい
さらに言うとC++ではラムダ式の引数にもポインタを渡せるし、
[&]で呼び出し元変数の書き換えもできるしで
ラムダ式との絡みでもタプルという機構はそこはかとなく重畳な印象
、
257デフォルトの名無しさん
2020/04/10(金) 22:53:18.90ID:uiBwCqn7 ゼロコストのための手段の品揃えが良いのはいかにもC++だが
JavascriptやPythonに似せる方向性の努力はC++的では無い
キモス
JavascriptやPythonに似せる方向性の努力はC++的では無い
キモス
258デフォルトの名無しさん
2020/04/10(金) 22:58:05.31ID:nPD3giIX 貪欲に何もかも狙うのこそがc++だろ
259デフォルトの名無しさん
2020/04/10(金) 23:05:23.72ID:uiBwCqn7 なんじゃそりゃC++はプログラミング言語界のPerlでも目指しとるんか、
260デフォルトの名無しさん
2020/04/10(金) 23:07:46.16ID:uiBwCqn7 というのは半分は冗談で、
スレッド安全のために関数からはオブジェクトのコピーを返したいのだが
オブジェクトのクラスをいちいち定義したくない、と言う場合には多少便利
スレッド安全のために関数からはオブジェクトのコピーを返したいのだが
オブジェクトのクラスをいちいち定義したくない、と言う場合には多少便利
261デフォルトの名無しさん
2020/04/10(金) 23:16:09.44ID:TvpFDEko 時代はjavascriptとPythonだからねー
キミたちより意識高いし「デキる」人多いよ
キミたちより意識高いし「デキる」人多いよ
262デフォルトの名無しさん
2020/04/11(土) 00:30:10.09ID:A+Eh5Xi3 ランタイム速度落とさずに高級なことできるならなんでもやるがc++だろ
263デフォルトの名無しさん
2020/04/11(土) 02:03:39.02ID:cUls8f/E >>261
最近多いんだよねー
JavaScriptやPythonとかちょっとかじった程度で
「俺プログラマーやってます」って顔する子
最初の入り口が動的型付け言語なんだよね最近の子って
そんなもんじゃ使いものにならねっての
最近多いんだよねー
JavaScriptやPythonとかちょっとかじった程度で
「俺プログラマーやってます」って顔する子
最初の入り口が動的型付け言語なんだよね最近の子って
そんなもんじゃ使いものにならねっての
264デフォルトの名無しさん
2020/04/11(土) 13:49:47.26ID:ksChGfzp あほくさ
265デフォルトの名無しさん
2020/04/11(土) 14:12:14.65ID:U1tTiVMl いつの時代にもいるもんだよ
CでPascalっぽいコード書くような手合いは
CでPascalっぽいコード書くような手合いは
266デフォルトの名無しさん
2020/04/11(土) 14:15:59.63ID:xAZRHMqH アカネチャン
267デフォルトの名無しさん
2020/04/11(土) 14:17:00.85ID:xAZRHMqH でも、constexprの使い道もわからないようじゃC++の意味ないのでは。
豚に真珠。
豚に真珠。
268デフォルトの名無しさん
2020/04/11(土) 14:20:49.27ID:P/JT/wuI CひいてはC++の需要が無駄に高まってきてるのは、一つは競技プログラミングのため、もう一つはpythonのためだ
269デフォルトの名無しさん
2020/04/11(土) 14:30:47.16ID:xAZRHMqH 競技プログラミングに何故C++を使うのか?
270デフォルトの名無しさん
2020/04/11(土) 14:41:37.00ID:gbVtYUoz272デフォルトの名無しさん
2020/04/11(土) 15:00:39.77ID:xAZRHMqH >>270
らぶりーさまーちゃん。
らぶりーさまーちゃん。
273デフォルトの名無しさん
2020/04/11(土) 15:38:18.09ID:XnsLNB9H 学術の巨大掲示板群 - アルファ・ラボ
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
274デフォルトの名無しさん
2020/04/16(木) 13:35:18.13ID:VLcNbPWE RTTIをプログラムの一部で使用した場合
使用していない部分でもRTTIを有効にしたデメリット(実行速度など)の影響を受けますか?
使用していない部分でもRTTIを有効にしたデメリット(実行速度など)の影響を受けますか?
275デフォルトの名無しさん
2020/04/16(木) 18:37:14.68ID:ojSHK+XP はい
276デフォルトの名無しさん
2020/04/16(木) 20:13:11.58ID:4a+SNA6K RTTIって何だっけ要るときになったら確保とかいうやつだっけ
277デフォルトの名無しさん
2020/04/16(木) 22:00:12.32ID:ojSHK+XP dynamic_castとtypeidを使う時に必要な機能
278デフォルトの名無しさん
2020/04/17(金) 01:51:17.05ID:675DQ/0u279デフォルトの名無しさん
2020/04/17(金) 10:38:52.67ID:xoWFQBId バイナリサイズなんか見りゃわかるのにな
280デフォルトの名無しさん
2020/04/17(金) 12:21:47.73ID:ojp4wJFZ C++の設計思想としては
Cで同じコードを書けば同じ速度、リソースで実行出来るのを目指している
で基本的には思想通りに仕上がってる
Cで同じコードを書けば同じ速度、リソースで実行出来るのを目指している
で基本的には思想通りに仕上がってる
281デフォルトの名無しさん
2020/04/18(土) 02:08:36.18ID:MF/MkUpw 関数形式のキャストってあるじゃん
int(a)みたいの
これのlong long版ってあるの?
スペースを含んでいるのだが(笑)
int(a)みたいの
これのlong long版ってあるの?
スペースを含んでいるのだが(笑)
282デフォルトの名無しさん
2020/04/18(土) 02:19:16.25ID:kdY61W0J (long long)(x)
283デフォルトの名無しさん
2020/04/18(土) 03:10:07.72ID:qNMUbfyc284デフォルトの名無しさん
2020/04/18(土) 03:11:31.94ID:qNMUbfyc >>283
(TYPE)x // 原初的なCから存在していた旧来のキャスト形式
TYPE(x) // C++ で追加された関数形式のキャスト
(TYPE)x // 原初的なCから存在していた旧来のキャスト形式
TYPE(x) // C++ で追加された関数形式のキャスト
285デフォルトの名無しさん
2020/04/18(土) 04:06:49.73ID:ci0mR+IB reinterpret_castな
286デフォルトの名無しさん
2020/04/18(土) 04:16:44.40ID:8yR++2ZI287デフォルトの名無しさん
2020/04/18(土) 06:55:36.12ID:x+kfoWax >>281
static_cast使え
static_cast使え
288デフォルトの名無しさん
2020/04/18(土) 07:27:51.97ID:jy7ENsJ8 std::intmax_t(a)だろ
289デフォルトの名無しさん
2020/04/18(土) 12:36:01.68ID:msudwh4N 関数形式のキャストって、キャスト演算子をオーバーロードするとき
間接的にしかお世話になってない希ガス、
旧来のキャスト形式に対して他になんかメリットあんの?
間接的にしかお世話になってない希ガス、
旧来のキャスト形式に対して他になんかメリットあんの?
290デフォルトの名無しさん
2020/04/18(土) 12:39:19.24ID:gzWZknQs コンストラクタによる変換と一貫してて見やすい(個人差があります
291デフォルトの名無しさん
2020/04/18(土) 13:54:50.01ID:lQefZc9Y >>289
コンストラクタとの一貫性を持たせることでtemplateを書くときに何か都合がいいとどこかで読んだ気がするが、うろ覚えなので間違ってたらスマン
コンストラクタとの一貫性を持たせることでtemplateを書くときに何か都合がいいとどこかで読んだ気がするが、うろ覚えなので間違ってたらスマン
292デフォルトの名無しさん
2020/04/19(日) 19:48:59.49ID:/iMmv/v9 printfで標準出力に一行づつ出力するのが面倒なので、複数行をビアドキュメントで出力したいのですが、何か方法はありますか?
293デフォルトの名無しさん
2020/04/19(日) 20:27:57.52ID:X1m2vVHB294デフォルトの名無しさん
2020/04/19(日) 20:39:55.02ID:t9NoLnqH295デフォルトの名無しさん
2020/04/19(日) 23:27:06.24ID:/iMmv/v9296デフォルトの名無しさん
2020/04/20(月) 10:40:59.97ID:gGVXVDIS 複数行ってそういう意味か?ω
出力は改行せんでええんか?ωωω
出力は改行せんでええんか?ωωω
297sage
2020/04/20(月) 14:01:38.37ID:H+0bMHyU 絶対に大丈夫なやり方は、こう :
printf(
"xxxx\n"
"xxxx\n"
);
printf(
"xxxx\n"
"xxxx\n"
);
298デフォルトの名無しさん
2020/04/20(月) 14:31:21.88ID:8N3nnwLC 絶対に大丈夫とは?
299デフォルトの名無しさん
2020/04/20(月) 23:26:51.20ID:7b1yqLmK ドキュメント
300デフォルトの名無しさん
2020/04/22(水) 13:20:56.58ID:v2BILLR9301デフォルトの名無しさん
2020/04/22(水) 13:21:38.64ID:v2BILLR9 あ、ideoneじゃないcodepad
すまん
すまん
302デフォルトの名無しさん
2020/04/22(水) 13:45:29.47ID:naSkUAWb303はちみつ餃子 ◆8X2XSCHEME
2020/04/22(水) 14:11:59.93ID:x0z1Sb8H >>300-301
スコープ無し列挙定数は全ての列挙子の値を表せる整数型が基底になる。
ただし、全ての列挙子の値が int か unsigned int に収まるならば int より大きくなることはない。
この場合は int で表せないのでもっと大きい型にしたいけど最大の整数型である long でも
表せないのでお手上げって言ってる。
codepad は gcc 4.1.2 を使ってる。
つまりその時点での最新仕様は C++03 で、C++03 には long long なんていう型はない。
long 型が最大の整数。
(実際には処理系の拡張として __int64_t という名前で 64bit 整数も使えたりはするんだけど、
enum 関連で使用されるようにはなってないっぽい。)
スコープ無し列挙定数は全ての列挙子の値を表せる整数型が基底になる。
ただし、全ての列挙子の値が int か unsigned int に収まるならば int より大きくなることはない。
この場合は int で表せないのでもっと大きい型にしたいけど最大の整数型である long でも
表せないのでお手上げって言ってる。
codepad は gcc 4.1.2 を使ってる。
つまりその時点での最新仕様は C++03 で、C++03 には long long なんていう型はない。
long 型が最大の整数。
(実際には処理系の拡張として __int64_t という名前で 64bit 整数も使えたりはするんだけど、
enum 関連で使用されるようにはなってないっぽい。)
304デフォルトの名無しさん
2020/04/22(水) 16:04:43.48ID:v2BILLR9 >>303
レスthx
clはデフォC++14なのでlong longがあるはずなのに
何でtest2がlong止まりなのって話
std::cout << typeid(test2).name() << std::endl;
とやってみても
enum `int __cdecl main(void)'::`2'::<unnamed-enum-test2>
となるだけでlongかどうかは確認できない
さらに
void func(int) { std::cout << "int" << std::endl; }
void func(long) { std::cout << "long" << std::endl; }
これだと出力がintになる
レスthx
clはデフォC++14なのでlong longがあるはずなのに
何でtest2がlong止まりなのって話
std::cout << typeid(test2).name() << std::endl;
とやってみても
enum `int __cdecl main(void)'::`2'::<unnamed-enum-test2>
となるだけでlongかどうかは確認できない
さらに
void func(int) { std::cout << "int" << std::endl; }
void func(long) { std::cout << "long" << std::endl; }
これだと出力がintになる
305はちみつ餃子 ◆8X2XSCHEME
2020/04/22(水) 17:35:14.20ID:x0z1Sb8H >>304
> clはデフォC++14なので
cl っていうと Common Lisp を連想してまう……というのは余談として、
それは動作環境を用意できてないからこっちで実行できへんのや。
結果が違うってのはどうなるの?
実行結果も示してくれへん?
あと 64bit 版か 32bit 版かも明示してや。
> longかどうかは確認できない
列挙型はあくまでも個別の列挙型であって整数ではないので、
基底型が何かというのは std::underlying_type で調べる必要がある。
> clはデフォC++14なので
cl っていうと Common Lisp を連想してまう……というのは余談として、
それは動作環境を用意できてないからこっちで実行できへんのや。
結果が違うってのはどうなるの?
実行結果も示してくれへん?
あと 64bit 版か 32bit 版かも明示してや。
> longかどうかは確認できない
列挙型はあくまでも個別の列挙型であって整数ではないので、
基底型が何かというのは std::underlying_type で調べる必要がある。
306はちみつ餃子 ◆8X2XSCHEME
2020/04/22(水) 17:39:14.29ID:x0z1Sb8H godbolt で確認しようとしたら
LINK : fatal error LNK1104: cannot open file 'libcpmt.lib'
と出るんやが……
LINK : fatal error LNK1104: cannot open file 'libcpmt.lib'
と出るんやが……
307デフォルトの名無しさん
2020/04/22(水) 17:47:08.07ID:v2BILLR9 >>305
Visual Studioと言えば通じる?
underlying_typeか、こいつは情報ごっつぁん
std::cout << typeid(typename std::underlying_type<decltype(test2)>::type).name() << std::endl;
これの出力もintだった
Visual Studioと言えば通じる?
underlying_typeか、こいつは情報ごっつぁん
std::cout << typeid(typename std::underlying_type<decltype(test2)>::type).name() << std::endl;
これの出力もintだった
308はちみつ餃子 ◆8X2XSCHEME
2020/04/22(水) 18:05:31.28ID:x0z1Sb8H >>307
> Visual Studioと言えば通じる?
コマンドが cl というのは知ってはいるんだけど、コンパイラの名前として cl っていうのは伝わり難いと思う。
マイクロソフトのドキュメントでは Microsoft C++ か MSVC という書き方をしていることが多いようなので、
たぶんそれが公式な呼び方なんじゃないかな。
> これの出力もintだった
値は何になってる?
> Visual Studioと言えば通じる?
コマンドが cl というのは知ってはいるんだけど、コンパイラの名前として cl っていうのは伝わり難いと思う。
マイクロソフトのドキュメントでは Microsoft C++ か MSVC という書き方をしていることが多いようなので、
たぶんそれが公式な呼び方なんじゃないかな。
> これの出力もintだった
値は何になってる?
309デフォルトの名無しさん
2020/04/22(水) 18:08:15.75ID:v2BILLR9 値はもうあんまり興味なかったが
一応試したらやっぱり0だった
一応試したらやっぱり0だった
310はちみつ餃子 ◆8X2XSCHEME
2020/04/22(水) 18:26:25.82ID:x0z1Sb8H >>309
バグとして報告が出てたわ。
https://developercommunity.visualstudio.com/content/problem/524018/underlying-type-of-an-unscoped-enum.html
結論: MSVCのバグ。 gcc や clang が正しい。
バグとして報告が出てたわ。
https://developercommunity.visualstudio.com/content/problem/524018/underlying-type-of-an-unscoped-enum.html
結論: MSVCのバグ。 gcc や clang が正しい。
311デフォルトの名無しさん
2020/04/22(水) 23:26:04.67ID:CBtGJth1 き、君子危うきに近寄らず…!
312デフォルトの名無しさん
2020/04/22(水) 23:37:02.23ID:i2NtNOZ9 キミコってボトムズの主人公いたね
313デフォルトの名無しさん
2020/04/22(水) 23:46:36.87ID:mtNioQDL キミコ・ビューティフルだったか
314デフォルトの名無しさん
2020/04/23(木) 11:30:41.04ID:StmE//V5315デフォルトの名無しさん
2020/04/23(木) 12:32:25.65ID:GqVREd4h >>314
VS2013だし放置じゃね?
VS2013だし放置じゃね?
316デフォルトの名無しさん
2020/04/23(木) 13:12:45.41ID:StmE//V5 300で言ってたclは2019だよ
もち更新ちゃんとやってるやつ
もち更新ちゃんとやってるやつ
317はちみつ餃子 ◆8X2XSCHEME
2020/04/23(木) 13:27:01.39ID:Fyt21a0c >>315
最新のコメントに `_MSC_FULL_VER` が `192328105` の環境で再現すると書いてある。
これは Visual Studio 2019 version 16.3.2 のことだそうな。
https://cpprefjp.github.io/implementation.html#visual_cpp_ver
最新のコメントに `_MSC_FULL_VER` が `192328105` の環境で再現すると書いてある。
これは Visual Studio 2019 version 16.3.2 のことだそうな。
https://cpprefjp.github.io/implementation.html#visual_cpp_ver
318デフォルトの名無しさん
2020/04/23(木) 14:02:24.26ID:GqVREd4h あーすまん、ちゃんと見てなかった
2019でも起きるのに一年放置は長いな
型指定使えば済むやろ、で後回しにされてるのかも?
2019でも起きるのに一年放置は長いな
型指定使えば済むやろ、で後回しにされてるのかも?
319デフォルトの名無しさん
2020/04/23(木) 17:39:32.10ID:StmE//V5 だいたい出尽くした?
餃子さん情報2つもありがとう
リアルならバーでおごるところだ
餃子さん情報2つもありがとう
リアルならバーでおごるところだ
320デフォルトの名無しさん
2020/04/23(木) 17:56:49.02ID:HERx4kEF 本当は、64bit型が追加されたことはコンパイラ作者泣かせなんだ。
C++コンパイラはとても複雑になってしまっている上に新しい仕様が入ったことで組み合わせ爆発が起きて細かなバグが入り易い。
C++コンパイラはとても複雑になってしまっている上に新しい仕様が入ったことで組み合わせ爆発が起きて細かなバグが入り易い。
321デフォルトの名無しさん
2020/04/23(木) 18:03:51.55ID:HERx4kEF 型の「昇格」や、2項演算子における型の「統一」も、64bit型が入ったことで複雑さが増した。
普段当たり前すぎて気にしないことだが、
unsigned char ch = 1;
と書いた場合でも、右辺は最初 int 型整数と解釈されるが、型にうるさいC++においても、それよりバイト数の少ない ch に警告も無く代入できてしまう。
他にも、
ch += 2;
とした場合、2は、最初int型と解釈されるのに、それよりバイト数の小さい ch に何の警告も無く足せてしまう。
これらで警告が出たらコーディングの手間がかかり過ぎるためそうなっているとは分かるが、型安全なC++においては背後にどういう仕組みがあるのかと思ってしまう。
普段当たり前すぎて気にしないことだが、
unsigned char ch = 1;
と書いた場合でも、右辺は最初 int 型整数と解釈されるが、型にうるさいC++においても、それよりバイト数の少ない ch に警告も無く代入できてしまう。
他にも、
ch += 2;
とした場合、2は、最初int型と解釈されるのに、それよりバイト数の小さい ch に何の警告も無く足せてしまう。
これらで警告が出たらコーディングの手間がかかり過ぎるためそうなっているとは分かるが、型安全なC++においては背後にどういう仕組みがあるのかと思ってしまう。
322デフォルトの名無しさん
2020/04/23(木) 18:07:51.10ID:HERx4kEF >>321
unsigned char ch = 1 + 2;
と書いたとする。
右辺は、C言語の使用によれば、1も2もint型だとみなされてから計算され、
結果の3もint型である。普通、int i; に対して、
ch = i;
とすると当然エラーか警告が出るのに、
この場合には何もメッセージが出ずにコンパイラが通るはずだ。
これも背後にどの仕様が働いているのだろうか?
unsigned char ch = 1 + 2;
と書いたとする。
右辺は、C言語の使用によれば、1も2もint型だとみなされてから計算され、
結果の3もint型である。普通、int i; に対して、
ch = i;
とすると当然エラーか警告が出るのに、
この場合には何もメッセージが出ずにコンパイラが通るはずだ。
これも背後にどの仕様が働いているのだろうか?
323デフォルトの名無しさん
2020/04/23(木) 18:18:19.96ID:/EdNitWt char a = 0;
a += (char)0;
これも代入時にintから型変換
a += (char)0;
これも代入時にintから型変換
324デフォルトの名無しさん
2020/04/23(木) 18:19:27.29ID:mq+N4KeF 簡単な定数畳み込みして安全かどうか調べてるだけでしょ
gccの場合
char i = 255+1; # warningでる
char i = 1;
char j = 255+j; # warningでない
gccの場合
char i = 255+1; # warningでる
char i = 1;
char j = 255+j; # warningでない
325デフォルトの名無しさん
2020/04/23(木) 18:20:26.60ID:/EdNitWt 1+2*3
は警告が出ないのに
1<<2+3
は警告が出るとか
色々と恣意的
は警告が出ないのに
1<<2+3
は警告が出るとか
色々と恣意的
326デフォルトの名無しさん
2020/04/23(木) 18:27:20.31ID:mq+N4KeF そりゃwarningだもの
コンパイラーごとに親切心でやってるだけじゃん
コンパイラーごとに親切心でやってるだけじゃん
327デフォルトの名無しさん
2020/04/23(木) 18:33:48.11ID:StmE//V5 >>324
自己初期化?
自己初期化?
328デフォルトの名無しさん
2020/04/23(木) 18:34:10.45ID:/EdNitWt 親切心じゃなくて趣味の押し付けみたいな物も多い
329デフォルトの名無しさん
2020/04/23(木) 18:35:02.85ID:HERx4kEF ch = 1;
がどうしてエラーにならないのか、CやC++の古い仕様仕様書からは見つけることが出来なかった。
がどうしてエラーにならないのか、CやC++の古い仕様仕様書からは見つけることが出来なかった。
330デフォルトの名無しさん
2020/04/23(木) 18:35:11.36ID:mq+N4KeF331デフォルトの名無しさん
2020/04/23(木) 18:35:53.67ID:mq+N4KeF >>329
c++が型安全だとなぜ思った?
c++が型安全だとなぜ思った?
332はちみつ餃子 ◆8X2XSCHEME
2020/04/23(木) 20:49:08.20ID:Fyt21a0c >>329
古い仕様っていつのやつ?
とりあえず JISX3010:2003 (C99 に相当) を見る限りでは規定はある。
関連しそうなところを抜粋したので細かいことは周辺を確認してね。
> 6.7.8 初期化
> 型の制限及び型変換は、単純代入と同じとする。
> 6.5.16.1 単純代入
> 右オペランドの値を代入式の型に型変換し、左オペランドで指し示される
> オブジェクトに格納されている値をこの値で置き換える。
> 6.3.1.3
> 整数型の値を _Bool 型以外の他の整数型に変換する場合、
> その値が新しい型で表現可能なとき、値は変化しない。
> 新しい型で表現できない場合、新しい型が符号無し整数型であれば、
> 新しい型で表現しうる最大の数に 1 加えた数を加えることまたは
> 減じることを、新しい型の範囲に入るまで繰り返すことによって得られる
> 値に変換する。
> そうでない場合、すなわち、新しい型が符号付き整数型であって、
> 値がその型で表現できない場合は、結果が処理系定義の値となるか、
> 又は処理系定義のシグナルを生成するかのいずれかとする。
そんなわけで、変換後が unsigned の場合はどんな値に変化するか既定があるし、
signed の場合は表現できる範囲内では値は変化しないから問題ない。
表現できない値になってるかどうかは基本的に実行時までわからんから
コンパイル時には黙って通す (わかるときは警告する) って感じ。
古い仕様っていつのやつ?
とりあえず JISX3010:2003 (C99 に相当) を見る限りでは規定はある。
関連しそうなところを抜粋したので細かいことは周辺を確認してね。
> 6.7.8 初期化
> 型の制限及び型変換は、単純代入と同じとする。
> 6.5.16.1 単純代入
> 右オペランドの値を代入式の型に型変換し、左オペランドで指し示される
> オブジェクトに格納されている値をこの値で置き換える。
> 6.3.1.3
> 整数型の値を _Bool 型以外の他の整数型に変換する場合、
> その値が新しい型で表現可能なとき、値は変化しない。
> 新しい型で表現できない場合、新しい型が符号無し整数型であれば、
> 新しい型で表現しうる最大の数に 1 加えた数を加えることまたは
> 減じることを、新しい型の範囲に入るまで繰り返すことによって得られる
> 値に変換する。
> そうでない場合、すなわち、新しい型が符号付き整数型であって、
> 値がその型で表現できない場合は、結果が処理系定義の値となるか、
> 又は処理系定義のシグナルを生成するかのいずれかとする。
そんなわけで、変換後が unsigned の場合はどんな値に変化するか既定があるし、
signed の場合は表現できる範囲内では値は変化しないから問題ない。
表現できない値になってるかどうかは基本的に実行時までわからんから
コンパイル時には黙って通す (わかるときは警告する) って感じ。
333デフォルトの名無しさん
2020/04/24(金) 02:20:09.80ID:UPXGgu7R >>332
> 右オペランドの値を代入式の型に型変換し、左オペランドで指し示される
> オブジェクトに格納されている値をこの値で置き換える。
C++において、
char ch;
int i;
に対し、
ch = i;
はエラーになるけど、それは左辺と右辺で型が違っているから。
つまり、C++では、単純代入演算子 x = y において、「型変換」は自動的には行われない。
> 右オペランドの値を代入式の型に型変換し、左オペランドで指し示される
> オブジェクトに格納されている値をこの値で置き換える。
C++において、
char ch;
int i;
に対し、
ch = i;
はエラーになるけど、それは左辺と右辺で型が違っているから。
つまり、C++では、単純代入演算子 x = y において、「型変換」は自動的には行われない。
334デフォルトの名無しさん
2020/04/24(金) 02:23:37.80ID:UPXGgu7R >>333
pure Cにおいても、
int x;
char *ptr;
x = ptr;
や
int *pInt;
char *ptr;
pInt = ptr;
は
どちらもエラーになる。
だから、pure C の代入演算子に置いても、型変換がエラーも出ずに自動的に行われるわけではない。
pure Cにおいても、
int x;
char *ptr;
x = ptr;
や
int *pInt;
char *ptr;
pInt = ptr;
は
どちらもエラーになる。
だから、pure C の代入演算子に置いても、型変換がエラーも出ずに自動的に行われるわけではない。
335デフォルトの名無しさん
2020/04/24(金) 05:55:11.40ID:UB0Nvahs336デフォルトの名無しさん
2020/04/24(金) 07:54:02.46ID:Sh3Vy8vg >>333
なんでそんな自信満々なん?これコンパイル通るぞ
int main(){
char ch = 0;
int i = 1;
ch = i;
std::cout << +ch << std::endl;
return 0;
}
なんでそんな自信満々なん?これコンパイル通るぞ
int main(){
char ch = 0;
int i = 1;
ch = i;
std::cout << +ch << std::endl;
return 0;
}
337デフォルトの名無しさん
2020/04/24(金) 10:31:54.61ID:FFBNt2WC unsigned char のときだな
338はちみつ餃子 ◆8X2XSCHEME
2020/04/24(金) 10:33:37.57ID:/uuSllCQ >>333
初期化・代入のどちらにおいても int から char へは暗黙に型変換される。
https://timsong-cpp.github.io/cppwp/n3337/expr.ass#3
https://timsong-cpp.github.io/cppwp/n3337/dcl.init#16.8
https://timsong-cpp.github.io/cppwp/n3337/conv.integral
初期化・代入のどちらにおいても int から char へは暗黙に型変換される。
https://timsong-cpp.github.io/cppwp/n3337/expr.ass#3
https://timsong-cpp.github.io/cppwp/n3337/dcl.init#16.8
https://timsong-cpp.github.io/cppwp/n3337/conv.integral
339デフォルトの名無しさん
2020/04/24(金) 11:53:55.91ID:VnmHvJrT エラーじゃなくてワーニングなんだろ多分
しっかりラーニングしておけよ
しっかりラーニングしておけよ
340デフォルトの名無しさん
2020/04/24(金) 11:59:13.94ID:X9QPCPhF c++は型安全おじさん誕生
341デフォルトの名無しさん
2020/04/24(金) 12:36:28.71ID:TokoipqW 今月のインターフェースでC++は型なし言語と紹介されていた。
種なしって言われたみたいで悲しい…
種なしって言われたみたいで悲しい…
342デフォルトの名無しさん
2020/04/24(金) 14:00:39.93ID:om9P6Ux9 型があることにも、ないことにもできるのがC/C++の良いところ
まあしかし世の中には反りの合わない人がいるもので
そういうところを酷評する意見も当然出てくる
まあしかし世の中には反りの合わない人がいるもので
そういうところを酷評する意見も当然出てくる
343デフォルトの名無しさん
2020/04/24(金) 14:05:22.39ID:A9aEYiqd c++が悪いんやない!cの型システムが壊れてるからや!
みたいな主張は聞いたことある。
まあしかし互換性がウリですからね。。
みたいな主張は聞いたことある。
まあしかし互換性がウリですからね。。
344デフォルトの名無しさん
2020/04/24(金) 15:11:32.57ID:UPXGgu7R むしろ、型を壊したのは C++ の方だと思うが。
autoとかで。
autoとかで。
345デフォルトの名無しさん
2020/04/24(金) 15:14:13.63ID:UPXGgu7R >>335
C++では、
void *ptr;
CPerson *pPerson;
に対して、
pPerson = ptr;
はエラーになるはず。
だから、C++では
CPerson *pPerson = malloc(sizeof(CPerson));
がエラーになるのだから。
pure Cではならなかったが。
また、
CBase *pBase;
CDerived *pDerived;
に対して、
pDerived = pBase;
もエラーになるはずだ。
C++では、
void *ptr;
CPerson *pPerson;
に対して、
pPerson = ptr;
はエラーになるはず。
だから、C++では
CPerson *pPerson = malloc(sizeof(CPerson));
がエラーになるのだから。
pure Cではならなかったが。
また、
CBase *pBase;
CDerived *pDerived;
に対して、
pDerived = pBase;
もエラーになるはずだ。
346デフォルトの名無しさん
2020/04/24(金) 15:15:40.17ID:UPXGgu7R >>343
何か勘違いしているようだが、人気が有ったのはpure Cの方だからね。
今のC++の人気は、pure Cの人気を引き継いだだけ。
そしてC++が変な拡張を繰り返したからこそ、人気にかげりが見えてきている。
何か勘違いしているようだが、人気が有ったのはpure Cの方だからね。
今のC++の人気は、pure Cの人気を引き継いだだけ。
そしてC++が変な拡張を繰り返したからこそ、人気にかげりが見えてきている。
347デフォルトの名無しさん
2020/04/24(金) 15:16:31.43ID:om9P6Ux9348デフォルトの名無しさん
2020/04/24(金) 15:19:58.74ID:TokoipqW >>346
そのコメント343宛でよいの?
そのコメント343宛でよいの?
349デフォルトの名無しさん
2020/04/24(金) 16:02:04.89ID:3fWjsT92 autoは要らない子
350デフォルトの名無しさん
2020/04/24(金) 16:06:41.58ID:h2kPOcUM auto使ってない人なんて実在するのか?
351デフォルトの名無しさん
2020/04/24(金) 16:22:47.89ID:UPXGgu7R >>341
どう書いてあったか詳しく聞いてみたい。
どう書いてあったか詳しく聞いてみたい。
352デフォルトの名無しさん
2020/04/24(金) 17:35:30.22ID:UB0Nvahs353はちみつ餃子 ◆8X2XSCHEME
2020/04/24(金) 17:42:51.85ID:/uuSllCQ354デフォルトの名無しさん
2020/04/24(金) 18:14:30.78ID:UPXGgu7R >>353
馬鹿ですか?
馬鹿ですか?
355デフォルトの名無しさん
2020/04/24(金) 18:22:23.35ID:JqJmAzM2356デフォルトの名無しさん
2020/04/25(土) 07:51:21.81ID:McBhOj36 >>351
コンパイル時にすべての変数の型が確定しないc++は弱い型付けだから型無し言語に分類だって。
コンパイル時にすべての変数の型が確定しないc++は弱い型付けだから型無し言語に分類だって。
358デフォルトの名無しさん
2020/04/25(土) 11:27:52.58ID:nL0CusKX 5月号のこと?
359デフォルトの名無しさん
2020/04/25(土) 11:29:47.36ID:4nLfPOGM トラ枝?
360デフォルトの名無しさん
2020/04/25(土) 11:29:54.96ID:nL0CusKX361デフォルトの名無しさん
2020/04/25(土) 19:17:45.69ID:45wIze2e アムウェイで地味に成功してた僕が業界の裏側を暴露してみた
https://www.youtube.com/watch?v=98udsqJihkA
年間300万円稼げてたのにアムウェイをやめた理由
https://www.youtube.com/watch?v=-H_dBzeJeUM
【体験談】元DDがAmwayで稼ぐのが難しい理由を解説してみた【元ガチ勢】
https://www.youtube.com/watch?v=SpzJEddQOdE
【借金地獄】マルチ商法で死の淵から生還して得たもの失ったもの【ビジネス論】
https://www.youtube.com/watch?v=UxriU-TOrMY
あの頃アムウェイはじめちゃったきっかけ【元ガチ勢】
https://www.youtube.com/watch?v=H9C4n4pL03U
私がネットワークビジネスを勧めない理由とは?
https://www.youtube.com/watch?v=hQNkcfhzv18
https://www.youtube.com/watch?v=98udsqJihkA
年間300万円稼げてたのにアムウェイをやめた理由
https://www.youtube.com/watch?v=-H_dBzeJeUM
【体験談】元DDがAmwayで稼ぐのが難しい理由を解説してみた【元ガチ勢】
https://www.youtube.com/watch?v=SpzJEddQOdE
【借金地獄】マルチ商法で死の淵から生還して得たもの失ったもの【ビジネス論】
https://www.youtube.com/watch?v=UxriU-TOrMY
あの頃アムウェイはじめちゃったきっかけ【元ガチ勢】
https://www.youtube.com/watch?v=H9C4n4pL03U
私がネットワークビジネスを勧めない理由とは?
https://www.youtube.com/watch?v=hQNkcfhzv18
362デフォルトの名無しさん
2020/04/25(土) 19:26:23.55ID:siKm6MFQ >>361
グロ
グロ
363デフォルトの名無しさん
2020/04/25(土) 19:45:42.98ID:zwQe2okb auto it = unique(
vecVisibilityPolygonPoints.begin(),
vecVisibilityPolygonPoints.end(),
[&](const tuple<float, float, float> &t1, const tuple<float, float, float> &t2)
{
return fabs(get<1>(t1) - get<1>(t2)) < 0.1f && fabs(get<2>(t1) - get<2>(t2)) < 0.1f;
});
vecVisibilityPolygonPoints.resize(distance(vecVisibilityPolygonPoints.begin(), it));
のresize()から意味がよくわからないのですが、
{0.1, 0.11, 0.2, 0.21, 0.4, 0.41}
↓
{0.1, 0.2, 0.4}
なことでしょうか?
vecVisibilityPolygonPoints.begin(),
vecVisibilityPolygonPoints.end(),
[&](const tuple<float, float, float> &t1, const tuple<float, float, float> &t2)
{
return fabs(get<1>(t1) - get<1>(t2)) < 0.1f && fabs(get<2>(t1) - get<2>(t2)) < 0.1f;
});
vecVisibilityPolygonPoints.resize(distance(vecVisibilityPolygonPoints.begin(), it));
のresize()から意味がよくわからないのですが、
{0.1, 0.11, 0.2, 0.21, 0.4, 0.41}
↓
{0.1, 0.2, 0.4}
なことでしょうか?
364デフォルトの名無しさん
2020/04/25(土) 20:03:25.46ID:NvgVRl2l >vecVisibilityPolygonPoints
std::vector<T>のハンガリアン記法での接頭辞vecで良いんだっけ…
Tの情報はどう埋め込めば良いんじゃ…
毎回悩むのでJISか何かで決めてホスイ
std::vector<T>のハンガリアン記法での接頭辞vecで良いんだっけ…
Tの情報はどう埋め込めば良いんじゃ…
毎回悩むのでJISか何かで決めてホスイ
365デフォルトの名無しさん
2020/04/25(土) 20:32:53.50ID:/7S9hKw7 erase使わずにresize使う人始めてみたわ
366デフォルトの名無しさん
2020/04/25(土) 22:11:42.84ID:NvgVRl2l >erase使わずにresize使う人始めてみたわ
ハア?(゚Д゚)ハァ?
ハア?(゚Д゚)ハァ?
367デフォルトの名無しさん
2020/04/25(土) 22:34:29.10ID:siKm6MFQ >>364
vecなんて付けずにvisibilityPolygonPoints でいいんじゃね。システムハンガリアンは不要または有害だと言われるようになって久しいだろう。
処理の都合上、別のコンテナからvectorに詰め替えたとかでvectorであることに強い意味がある状況なら、vecをつけて元の変数と区別する意味はあると思うけど。
vecなんて付けずにvisibilityPolygonPoints でいいんじゃね。システムハンガリアンは不要または有害だと言われるようになって久しいだろう。
処理の都合上、別のコンテナからvectorに詰め替えたとかでvectorであることに強い意味がある状況なら、vecをつけて元の変数と区別する意味はあると思うけど。
368デフォルトの名無しさん
2020/04/25(土) 22:56:50.00ID:WEavO2K3 auto使ってハンガリアンとかなんか間違ってるわな。
369デフォルトの名無しさん
2020/04/25(土) 23:00:45.13ID:/7S9hKw7 確かにvectorだと処理量変わらんな
370デフォルトの名無しさん
2020/04/25(土) 23:11:24.83ID:/7S9hKw7 >>363
3要素のvectorでyzの値が近いものを同一と見なして削除する処理なのかね
unique前のsortどうしてんのか謎だけど
uniqueは重複したものは一つだけ残して前にuniqueなデータを集め、後半にゴミを集める
戻り値はゴミの開始iterator
resize部分はゴミを消す処理
一般的にはerase使ったerase-remove_ifイディオムの変形だな
3要素のvectorでyzの値が近いものを同一と見なして削除する処理なのかね
unique前のsortどうしてんのか謎だけど
uniqueは重複したものは一つだけ残して前にuniqueなデータを集め、後半にゴミを集める
戻り値はゴミの開始iterator
resize部分はゴミを消す処理
一般的にはerase使ったerase-remove_ifイディオムの変形だな
371デフォルトの名無しさん
2020/04/25(土) 23:12:19.03ID:/7S9hKw7 ポリゴンだからソートする必要ないのか
372デフォルトの名無しさん
2020/04/26(日) 00:08:03.75ID:PBJtHpgo 使ったこと無いから知らんがstd::unique<T>()は
>削除は、消去される要素が上書きされるように、範囲内の要素をずらすことによって行われます。
とのことなので、callerがstd::unique<T>()を呼ぶ前にソートしておく必要があるのでは…
>削除は、消去される要素が上書きされるように、範囲内の要素をずらすことによって行われます。
とのことなので、callerがstd::unique<T>()を呼ぶ前にソートしておく必要があるのでは…
373デフォルトの名無しさん
2020/04/26(日) 00:15:41.29ID:tEMTnANK >>370
unique前にソートで昇順にしているみたいです。
unique前にソートで昇順にしているみたいです。
374デフォルトの名無しさん
2020/04/26(日) 00:30:35.80ID:NFXmWZjN 結局メモリーポインタ関連わかってない奴はガベコレなんかで隠ぺいした言語使っててもバグる
375デフォルトの名無しさん
2020/04/26(日) 05:15:56.17ID:mQCdU9mn vecVisibilityPolygonPoints が「1枚のポリゴンの各頂点の座標(頂点数は任意)」で
座標値は画面に表示すべき値に変換済み(透視投影が完了している)、
<float, float, float> が (x, y, z) を表すと仮定すると…
隣合う頂点のx座標同士、y座標同士がそれぞれ十分に近ければ
その「極端に短い一辺」を1つの頂点とみなして表示処理を軽減、って感じかな。
resize() の結果 size() が 1 か 2 になったらポリゴン全体が
「見えないポリゴン」になるので丸ごと省略、までやるかも。
座標値は画面に表示すべき値に変換済み(透視投影が完了している)、
<float, float, float> が (x, y, z) を表すと仮定すると…
隣合う頂点のx座標同士、y座標同士がそれぞれ十分に近ければ
その「極端に短い一辺」を1つの頂点とみなして表示処理を軽減、って感じかな。
resize() の結果 size() が 1 か 2 になったらポリゴン全体が
「見えないポリゴン」になるので丸ごと省略、までやるかも。
376375
2020/04/26(日) 05:26:01.50ID:mQCdU9mn tupple::get<> は 0 始まりだから y, z 座標だね(>>370 さんの言う通り)。
すると少々怪しいか、素朴な仮定だとスッキリ辻褄が合わない。
すると少々怪しいか、素朴な仮定だとスッキリ辻褄が合わない。
377デフォルトの名無しさん
2020/04/26(日) 06:57:42.91ID:yiiyQ5aD 申し訳ありません。
>>363のコードは
ttps://github.com/OneLoneCoder/olcPixelGameEngine/blob/master/Videos/OneLoneCoder_PGE_ShadowCasting2D.cpp
の416行からです。
>>363のコードは
ttps://github.com/OneLoneCoder/olcPixelGameEngine/blob/master/Videos/OneLoneCoder_PGE_ShadowCasting2D.cpp
の416行からです。
378デフォルトの名無しさん
2020/04/26(日) 08:53:55.40ID:PKqlhi9Y >374
確かにGCあり言語でのリークなんかは逆にデバッグがかなり難しい。
理解してないやつはまず無理。
確かにGCあり言語でのリークなんかは逆にデバッグがかなり難しい。
理解してないやつはまず無理。
379デフォルトの名無しさん
2020/04/26(日) 10:44:13.53ID:O/ywVmO1 そういうのはシステムのバグで
自分の落ち度じゃねえだろ
自分の落ち度じゃねえだろ
380デフォルトの名無しさん
2020/04/26(日) 11:12:47.10ID:YMFvD6ns システムのバグ以外にリークが起きないとでも思ってるの?
381デフォルトの名無しさん
2020/04/26(日) 11:14:07.90ID:O/ywVmO1 起きるとでも思っているのか?
382デフォルトの名無しさん
2020/04/26(日) 11:15:58.89ID:YMFvD6ns 当たり前
383デフォルトの名無しさん
2020/04/26(日) 11:24:00.41ID:O/ywVmO1 えらく無口だな
384デフォルトの名無しさん
2020/04/26(日) 11:28:31.53ID:PBJtHpgo プログラムの開始から終わりまで存在するオブジェクトがリストを所有しており、
そのリストに要素数制限もエラーチェックも無く無制限に増える場合とか、
オブジェクトAとオブジェクトBが互いを参照し合っている場合(循環参照)とか
いろいろ
つかオブジェクトをいつ使い終わったかを機械的に判定する難しさを考えたらワカル
そのリストに要素数制限もエラーチェックも無く無制限に増える場合とか、
オブジェクトAとオブジェクトBが互いを参照し合っている場合(循環参照)とか
いろいろ
つかオブジェクトをいつ使い終わったかを機械的に判定する難しさを考えたらワカル
385デフォルトの名無しさん
2020/04/26(日) 11:42:05.69ID:BQqaPcbS 使わないのに参照しっぱなしで放置=リークともとれるからね
GCはあるとちょっとは便利でしょって程度のものでヒープ管理の全体像はプログラマが把握しておくべきだと思うわ
頻繁なGCが必要なくらいにヒープ使うのであれば設計から考え直す必要あるんじゃないかと
GCはあるとちょっとは便利でしょって程度のものでヒープ管理の全体像はプログラマが把握しておくべきだと思うわ
頻繁なGCが必要なくらいにヒープ使うのであれば設計から考え直す必要あるんじゃないかと
386デフォルトの名無しさん
2020/04/26(日) 11:50:09.63ID:O/ywVmO1 リークじゃねえじゃん
参照元の寿命が尽きてないんなら
参照元の寿命が尽きてないんなら
387デフォルトの名無しさん
2020/04/26(日) 11:54:22.98ID:PBJtHpgo >>386
参照元の寿命が尽きていなくても使いもしないのであれば現象としてはリ〜クに他ならない
違うというならメモリ消費量が際限なく増え続けるプログラムを客先に納めて
リ〜クではないんですよと仕様ですよ説明して見せると良い
参照元の寿命が尽きていなくても使いもしないのであれば現象としてはリ〜クに他ならない
違うというならメモリ消費量が際限なく増え続けるプログラムを客先に納めて
リ〜クではないんですよと仕様ですよ説明して見せると良い
388デフォルトの名無しさん
2020/04/26(日) 12:08:46.85ID:O/ywVmO1389デフォルトの名無しさん
2020/04/26(日) 12:13:43.92ID:YMFvD6ns リークですね
390デフォルトの名無しさん
2020/04/26(日) 12:15:41.10ID:YMFvD6ns 狭い狭い定義しか知らないと恥ずかしいよ
391デフォルトの名無しさん
2020/04/26(日) 12:30:26.50ID:L6Afs0I9 リークの字義的には微妙
プロセス外部から見える挙動はリークと同様だけど
プロセス外部から見える挙動はリークと同様だけど
392デフォルトの名無しさん
2020/04/26(日) 12:31:51.69ID:O/ywVmO1 >>390
自分が間違って憶えているのを正当化するために定義を広くしようたって誰も協力せんぞ
自分が間違って憶えているのを正当化するために定義を広くしようたって誰も協力せんぞ
393デフォルトの名無しさん
2020/04/26(日) 12:33:29.76ID:PKqlhi9Y いや普通に文脈で何を問題にしてるかわかるだろ。。
勝手に自分ルールで解釈狭めてリークはないとか言い出してる奴が頭おかしいわ。
勝手に自分ルールで解釈狭めてリークはないとか言い出してる奴が頭おかしいわ。
394デフォルトの名無しさん
2020/04/26(日) 12:43:33.17ID:oUbeKuvV 明確な定義なんてないだろ
リークに見える挙動はリークだよ
リークに見える挙動はリークだよ
リークの定義は複数あっていいと思いますが、「@自分の定義はこれで、だからAこれはリークである/ない」の@A二点を明示するべきだと思いますね
396デフォルトの名無しさん
2020/04/26(日) 12:49:09.81ID:O/ywVmO1 >>393
何を問題にしているかと、それをリークと呼ぶか否かは別な話だぜ
何を問題にしているかと、それをリークと呼ぶか否かは別な話だぜ
397デフォルトの名無しさん
2020/04/26(日) 12:49:37.61ID:0EP709eE リークに見える?
実際リークしてるわけで
実際リークしてるわけで
398デフォルトの名無しさん
2020/04/26(日) 12:50:39.33ID:O/ywVmO1 それこそ「理解してないやつ」がテキトーこいてリークだリークだ言うのと同じだ
399デフォルトの名無しさん
2020/04/26(日) 12:51:44.94ID:L6Afs0I9 まあ何から漏れているか明確じゃないのまで、リークと呼び始めた人が悪いんだな
内部的な原因も対処法も全く違うのに、外見だけで同じ名前つけられても混乱するだろうに
内部的な原因も対処法も全く違うのに、外見だけで同じ名前つけられても混乱するだろうに
400デフォルトの名無しさん
2020/04/26(日) 12:52:48.59ID:NFXmWZjN リークによって起きる現象とリークは分けて考えた方がいい
本質的には未使用メモリーの蓄積だが名称がないから混乱が起きる
蓄積を処理しないのもバグ
リークは蓄積をコントロールできなくなっていて、結果的に処理していない点が違うがこれもバグ
本質的には未使用メモリーの蓄積だが名称がないから混乱が起きる
蓄積を処理しないのもバグ
リークは蓄積をコントロールできなくなっていて、結果的に処理していない点が違うがこれもバグ
401デフォルトの名無しさん
2020/04/26(日) 12:54:00.99ID:wqemtgsF 少なくとも>>384の巨大リストを抱えてる方はリークとは言わない
データ管理がなってないだけ
データ管理がなってないだけ
402デフォルトの名無しさん
2020/04/26(日) 12:55:18.24ID:0EP709eE 原因は?
メモリリークによりメモリが不足してました
これだけで終わる会話を
メモリリークによりメモリが不足してました
これだけで終わる会話を
403デフォルトの名無しさん
2020/04/26(日) 12:57:19.34ID:0EP709eE404デフォルトの名無しさん
2020/04/26(日) 12:58:55.24ID:0EP709eE 循環参照で問題になるのはカウント方式の場合
C++のスマポくらいでは?
C++のスマポくらいでは?
405デフォルトの名無しさん
2020/04/26(日) 12:59:35.20ID:0EP709eE406デフォルトの名無しさん
2020/04/26(日) 13:01:31.99ID:O/ywVmO1 int main(void)
{
void *p = malloc(1);
int x;
while(scanf("%d", x) != EOF) { //タイプミスで永久ループ
//...
}
free(p); //到達しなくなる
}
参照元pが生きているのはリークではない
{
void *p = malloc(1);
int x;
while(scanf("%d", x) != EOF) { //タイプミスで永久ループ
//...
}
free(p); //到達しなくなる
}
参照元pが生きているのはリークではない
407デフォルトの名無しさん
2020/04/26(日) 13:18:14.23ID:yChHyLLG 使ってないメモリ領域が増え続けるのはメモリリーク
参照があろうがなかろうが
参照があろうがなかろうが
408デフォルトの名無しさん
2020/04/26(日) 13:23:22.33ID:L6Afs0I9 使ってないと言っても使うかもしれないから無限にリストが長くなっているんじゃね
純粋なインメモリデータベースだとそれはリークではないよね
問題が起きたのだとしたら、用途に対してメモリが少なかったのが悪いだけで
純粋なインメモリデータベースだとそれはリークではないよね
問題が起きたのだとしたら、用途に対してメモリが少なかったのが悪いだけで
409デフォルトの名無しさん
2020/04/26(日) 13:23:31.29ID:O/ywVmO1 管理手段が残っているのはリークではない
無駄に多く割り付けたり解放のタイミングがまずいというだけ
無駄に多く割り付けたり解放のタイミングがまずいというだけ
410デフォルトの名無しさん
2020/04/26(日) 13:30:11.65ID:X/1sAzcb >>410
それは GC の種類によるんじゃないでしょうか?
参照カウンタ方式のGC(私は、参照カウンタ方式はGCと呼ばない人ですが)ならGCがあってもリークするでしょうし、
GCの元祖マークアンドスウィープ式や、これも昔からあるコピーGCならば、リークはしないでしょうね
それは GC の種類によるんじゃないでしょうか?
参照カウンタ方式のGC(私は、参照カウンタ方式はGCと呼ばない人ですが)ならGCがあってもリークするでしょうし、
GCの元祖マークアンドスウィープ式や、これも昔からあるコピーGCならば、リークはしないでしょうね
412デフォルトの名無しさん
2020/04/26(日) 14:07:55.73ID:YMFvD6ns どんな方式だってリークする
413デフォルトの名無しさん
2020/04/26(日) 14:09:19.26ID:YMFvD6ns 使わないメモリが増え続ければリーク
414デフォルトの名無しさん
2020/04/26(日) 14:10:46.96ID:YMFvD6ns 上のリンクのガベージコレクションの限界
に書いてある
に書いてある
415デフォルトの名無しさん
2020/04/26(日) 14:18:17.62ID:X/1sAzcb C#とかだと、イベント購読の解除忘れなどでリークすることがあるそうです。
その対策で弱参照が使われることがあるそうです。
https://ufcpp.net/study/csharp/RmWeakReference.html#weak-event
その対策で弱参照が使われることがあるそうです。
https://ufcpp.net/study/csharp/RmWeakReference.html#weak-event
416デフォルトの名無しさん
2020/04/26(日) 14:19:26.91ID:L6Afs0I9 無限に増えるキャッシュ
->使っているからリークじゃない
ログ的なデータを延々と追加するだけ->
リーク
終了時にファイル出力->リークじゃない
つまり、ファイル出力機能を後から追加することでリークじゃなくなるんだな
それでメモリ足りなくなったらなんて呼ぶんだろう
->使っているからリークじゃない
ログ的なデータを延々と追加するだけ->
リーク
終了時にファイル出力->リークじゃない
つまり、ファイル出力機能を後から追加することでリークじゃなくなるんだな
それでメモリ足りなくなったらなんて呼ぶんだろう
417デフォルトの名無しさん
2020/04/26(日) 14:37:42.83ID:r10bSm2e リークかどうかじゃなくて使ってるか使ってないかだな
プログラマー的には使ってないけどプログラム的には使ってるものをリークと呼ぶのが適切とは思えんけど
プログラマー的には使ってないけどプログラム的には使ってるものをリークと呼ぶのが適切とは思えんけど
418デフォルトの名無しさん
2020/04/26(日) 14:42:49.35ID:fU7fb2M4 プログラマー的には使ってないけどプログラム的には使ってるものをリーク
プログラマー的には使ってるけどプログラム的には使ってないものをリーク
プログラマー的には使ってないけどプログラム的には使っないものをリーク
プログラマー的には使ってるけどプログラム的には使ってるものをリーク
プログラマー的には使ってるけどプログラム的には使ってないものをリーク
プログラマー的には使ってないけどプログラム的には使っないものをリーク
プログラマー的には使ってるけどプログラム的には使ってるものをリーク
419デフォルトの名無しさん
2020/04/26(日) 14:44:35.43ID:1jKTUwjI どの立場で見るかでしょ
言語のランタイムシステムの立場では参照が残ってるんだったらリークではないといえる
人間の立場では無限にメモリ使ってるつもりがないのにメモリが枯渇するのでリークしてる
現実問題は人間の立場で見るのだから後者でよい
言語のランタイムシステムの立場では参照が残ってるんだったらリークではないといえる
人間の立場では無限にメモリ使ってるつもりがないのにメモリが枯渇するのでリークしてる
現実問題は人間の立場で見るのだから後者でよい
420デフォルトの名無しさん
2020/04/26(日) 15:07:57.54ID:O/ywVmO1 枯渇したらリークってのもおかしいぜ
必要容量のRAMを実装していないのがリークになっちまう
必要容量のRAMを実装していないのがリークになっちまう
421デフォルトの名無しさん
2020/04/26(日) 15:17:14.94ID:1jKTUwjI422デフォルトの名無しさん
2020/04/26(日) 15:23:22.13ID:O/ywVmO1 明示的に解放できないシステムでどうやって気をつけるんだよ
さっきからシステムのバグつってんだろ
さっきからシステムのバグつってんだろ
423デフォルトの名無しさん
2020/04/26(日) 15:25:40.91ID:O/ywVmO1 そもそもGCが解放してくれないのはリークではないからだろうが
>>412
元祖マークアンドスィープ法やコピーGC ではリークしませんね、これは断言できるでしょう
元祖マークアンドスィープ法やコピーGC ではリークしませんね、これは断言できるでしょう
>>414
リンクのwiki には、参照カウンタ方式のリークは書いてあっても、マークアンドスウィープ法やコピーGC についてはリークするとは書いていませんね
リンクのwiki には、参照カウンタ方式のリークは書いてあっても、マークアンドスウィープ法やコピーGC についてはリークするとは書いていませんね
428デフォルトの名無しさん
2020/04/26(日) 15:42:28.68ID:X/1sAzcb >>428
>参照カウントではないC#でも弱い参照が存在することは
@強い参照、弱い参照を使い分ける方式は、参照カウント法の一種だと認識しています
A元祖マークアンドスウィープ法、コピーGC法では原理的にリークは発生しませんし、発生し得ません
>参照カウントではないC#でも弱い参照が存在することは
@強い参照、弱い参照を使い分ける方式は、参照カウント法の一種だと認識しています
A元祖マークアンドスウィープ法、コピーGC法では原理的にリークは発生しませんし、発生し得ません
430デフォルトの名無しさん
2020/04/26(日) 15:55:37.10ID:O/ywVmO1 >>410
おまえさんWikipediaってどんな所だか知ってるか?
ちなみに俺もとあるページを執筆したことがあるが
俺はどこの馬の骨か聞かれもしなかったし
アホなミスをしでかしてもあんまり指摘されないし
悪意のある文面をやめさせるのにも手間取るぞ
査読できる人でないと鵜呑みは危険だぞ
おまえさんWikipediaってどんな所だか知ってるか?
ちなみに俺もとあるページを執筆したことがあるが
俺はどこの馬の骨か聞かれもしなかったし
アホなミスをしでかしてもあんまり指摘されないし
悪意のある文面をやめさせるのにも手間取るぞ
査読できる人でないと鵜呑みは危険だぞ
431デフォルトの名無しさん
2020/04/26(日) 15:57:08.52ID:X/1sAzcb 一方、マーク・アンド・スイープ方式やコピーGC方式では循環参照によるメモリリークは
発生しないが、非意図的オブジェクト保持(unintentional object retention)が引き起こす
メモリリークを強参照のみによる実装で解消することは難しく煩雑であり、
実装を簡略化するために弱参照が用いられることがある。
https://ja.wikipedia.org/wiki/%E5%BC%B1%E3%81%84%E5%8F%82%E7%85%A7
発生しないが、非意図的オブジェクト保持(unintentional object retention)が引き起こす
メモリリークを強参照のみによる実装で解消することは難しく煩雑であり、
実装を簡略化するために弱参照が用いられることがある。
https://ja.wikipedia.org/wiki/%E5%BC%B1%E3%81%84%E5%8F%82%E7%85%A7
433デフォルトの名無しさん
2020/04/26(日) 16:10:32.96ID:X/1sAzcb 使ってる言葉の意味が異なる人を説得するのは無理だと悟った
434デフォルトの名無しさん
2020/04/26(日) 16:21:48.25ID:YMFvD6ns また面倒なのが出てきたな
wikipediaのリンクで終わったかと思ったのに
QZは頭が弱いから
wikipediaのリンクで終わったかと思ったのに
QZは頭が弱いから
435デフォルトの名無しさん
2020/04/26(日) 16:22:02.20ID:CnmrePPR >>426
407の定義だと曖昧すぎて気持ち悪くなるって例出しただけ
確保したメモリを使用しなくなったのに解放しないまま管理外にするのが狭義のメモリリーク
それ以外の現象もメモリリークと呼ぶのは知っているが、その呼び方は混乱招くから好きじゃないって立場
407の定義だと曖昧すぎて気持ち悪くなるって例出しただけ
確保したメモリを使用しなくなったのに解放しないまま管理外にするのが狭義のメモリリーク
それ以外の現象もメモリリークと呼ぶのは知っているが、その呼び方は混乱招くから好きじゃないって立場
436デフォルトの名無しさん
2020/04/26(日) 16:26:58.57ID:YMFvD6ns 使わない、使うつもりもない、プログラマが意図しないメモリ
これらが増え続ければリーク
定義じゃなくて十分条件の例
これらが増え続ければリーク
定義じゃなくて十分条件の例
437デフォルトの名無しさん
2020/04/26(日) 16:28:11.48ID:1jKTUwjI >>422
> 明示的に解放できないシステムでどうやって気をつけるんだよ
gc言語で本格的な開発したことないって白状してるようなもんだね
メモリプロファイラで地道に調べるんだよ
あと不要になったらgc任せにせずに即null代入しておけとかよく言われるだろ
> さっきからシステムのバグつってんだろ
システムって何だよ?意味広すぎるから説明になってない
gc言語においては言語レベルではリークしない(循環参照はさておき)
が依然人間の不注意によって実質的なリークは起るわけ
それをお前はリークと呼ばなんだろうけど一般的にそれもリークと呼ばれてる
それだけの話
理解しようぜ
> 明示的に解放できないシステムでどうやって気をつけるんだよ
gc言語で本格的な開発したことないって白状してるようなもんだね
メモリプロファイラで地道に調べるんだよ
あと不要になったらgc任せにせずに即null代入しておけとかよく言われるだろ
> さっきからシステムのバグつってんだろ
システムって何だよ?意味広すぎるから説明になってない
gc言語においては言語レベルではリークしない(循環参照はさておき)
が依然人間の不注意によって実質的なリークは起るわけ
それをお前はリークと呼ばなんだろうけど一般的にそれもリークと呼ばれてる
それだけの話
理解しようぜ
438デフォルトの名無しさん
2020/04/26(日) 16:28:26.47ID:YMFvD6ns 管理外っていうのは何を示してるかよく分からない
439デフォルトの名無しさん
2020/04/26(日) 16:29:38.80ID:fU7fb2M4440デフォルトの名無しさん
2020/04/26(日) 16:43:46.17ID:1jKTUwjI >>423
昔から言われてることだけに昔の記事あったからこれでも読んでみ
ttps://www.atmarkit.co.jp/fjava/rensai3/debug02/debug02_1.html
単に何をリークと呼ぶかというだけの話
Javaの開発元のサンの人もこういうんだからそれにあわせようぜ
昔から言われてることだけに昔の記事あったからこれでも読んでみ
ttps://www.atmarkit.co.jp/fjava/rensai3/debug02/debug02_1.html
単に何をリークと呼ぶかというだけの話
Javaの開発元のサンの人もこういうんだからそれにあわせようぜ
441デフォルトの名無しさん
2020/04/26(日) 16:45:39.03ID:PBJtHpgo >>438
GCが解放してくれるとプログラマが信じているが事実はそうでないケース
GCが解放してくれるとプログラマが信じているが事実はそうでないケース
442デフォルトの名無しさん
2020/04/26(日) 16:49:23.41ID:PBJtHpgo プログラマーが自分で作ったつもりのスレッドで資源を確保して、
スレッドの最初の関数からreturnしたら全部解放されると思いきや!
実はスレッドプールの1要素としてシステムが握りっぱなしだった、
みたいなテクノロジーホラーが
あるのかも
しれませんね
知らんけど
スレッドの最初の関数からreturnしたら全部解放されると思いきや!
実はスレッドプールの1要素としてシステムが握りっぱなしだった、
みたいなテクノロジーホラーが
あるのかも
しれませんね
知らんけど
443デフォルトの名無しさん
2020/04/26(日) 16:58:02.62ID:4KWblUmJ MSVCのstd::asyncでは
444375
2020/04/26(日) 17:17:04.65ID:mQCdU9mn >>377 のリンク先のソースをすっかり理解できたとは言い難いけど、
この場合の <float, float, float> は (何かの角度, x座標, y座標) みたいね。
vecVisibilityPolygonPoints は最初の要素(角度)でソート済み。
get<1>()でx座標、get<2>()でy座標を取れるから >>375 の第2段落の理屈は有効。
>>363 の質問に戻ると、
{0.1, 0.11, 0.2, 0.21, 0.4, 0.41}
↓
{0.1, 0.2, 0.4}
の理解でだいたい合ってる。単一の値の比較でなく
「x座標同士, y座標同士が両方とも近い値の場合だけまとめる」わけだが。
もうひとつ。376で tupple::get と書いたけど、もちろん tuple::get が正しい。
(ここを訂正しておきたかった)。
この場合の <float, float, float> は (何かの角度, x座標, y座標) みたいね。
vecVisibilityPolygonPoints は最初の要素(角度)でソート済み。
get<1>()でx座標、get<2>()でy座標を取れるから >>375 の第2段落の理屈は有効。
>>363 の質問に戻ると、
{0.1, 0.11, 0.2, 0.21, 0.4, 0.41}
↓
{0.1, 0.2, 0.4}
の理解でだいたい合ってる。単一の値の比較でなく
「x座標同士, y座標同士が両方とも近い値の場合だけまとめる」わけだが。
もうひとつ。376で tupple::get と書いたけど、もちろん tuple::get が正しい。
(ここを訂正しておきたかった)。
445デフォルトの名無しさん
2020/04/26(日) 17:35:47.46ID:PBJtHpgo ちゅか循環参照するオブジェクトの解放のための正しい方策はマーク&スイープ方式であって
普通の言語においては弱参照はあんま助けにならないハズ
(普通の言語では、一旦解放したオブジェクトを復活させることはプログラマがそのような復活コードを書かない限り不可能なため、
使用予定があるオブジェクトを単に弱参照にしてGCに好きなタイミングで解放させるだけだとプログラムがロシアンルーレットになる
実際のところ弱参照を用いてヒヤヒヤしながら辻褄合わせする(結局何がしかのコードが必要)なぐらいなら、
最初からGCに頼らずに確保と解放をコード上で明示的に計画した方がマシ
で、マーク&スイープ方式はマークのための空間と時間の計算量(探索!)が必要な上に、
その挙動をユーザーが書くプログラムコードから隠しおおせる言語でないと適用できない
普通の言語においては弱参照はあんま助けにならないハズ
(普通の言語では、一旦解放したオブジェクトを復活させることはプログラマがそのような復活コードを書かない限り不可能なため、
使用予定があるオブジェクトを単に弱参照にしてGCに好きなタイミングで解放させるだけだとプログラムがロシアンルーレットになる
実際のところ弱参照を用いてヒヤヒヤしながら辻褄合わせする(結局何がしかのコードが必要)なぐらいなら、
最初からGCに頼らずに確保と解放をコード上で明示的に計画した方がマシ
で、マーク&スイープ方式はマークのための空間と時間の計算量(探索!)が必要な上に、
その挙動をユーザーが書くプログラムコードから隠しおおせる言語でないと適用できない
446デフォルトの名無しさん
2020/04/26(日) 17:38:44.84ID:PBJtHpgo C++でマーク&スイープしようとすると、オブジェクトaを所有するオブジェクトbの確保、が単に構造体をnewするだけでは済まなくなってしまうま
(所有関係をGCに教えるための呼び出しを書かねばならない。プログラムが小汚くなっていき、ぜってー忘れたり間違える
(所有関係をGCに教えるための呼び出しを書かねばならない。プログラムが小汚くなっていき、ぜってー忘れたり間違える
447デフォルトの名無しさん
2020/04/26(日) 17:47:22.05ID:O/ywVmO1448デフォルトの名無しさん
2020/04/26(日) 17:52:01.79ID:GMbq2WIv449デフォルトの名無しさん
2020/04/26(日) 17:58:01.59ID:X/1sAzcb >>446
Boehm GCとか
Boehm GCとか
450デフォルトの名無しさん
2020/04/26(日) 18:06:28.71ID:O/ywVmO1 >>437
> gc言語で本格的な開発したことないって白状してるようなもんだね
おまえさんこそ、相手の経歴や人格を攻撃せねばならんほど窮しているのが露呈してるぜ
頭の中で問題が整理できていれば冷静かつアカデミックに指摘ができるはず
そんなに頭に血が昇るのは問題が整理できていないか沸点の低いアレなやつか又は両方だな
> gc言語で本格的な開発したことないって白状してるようなもんだね
おまえさんこそ、相手の経歴や人格を攻撃せねばならんほど窮しているのが露呈してるぜ
頭の中で問題が整理できていれば冷静かつアカデミックに指摘ができるはず
そんなに頭に血が昇るのは問題が整理できていないか沸点の低いアレなやつか又は両方だな
451デフォルトの名無しさん
2020/04/26(日) 18:08:38.19ID:O/ywVmO1452はちみつ餃子 ◆8X2XSCHEME
2020/04/26(日) 18:28:15.91ID:Kc4H3V0/ >>422
・ GC のない言語でうっかりメモリの解放を忘れる
・ GC のある言語でうっかりもう使わないオブジェクトの参照を残してしまう (GC の回収対象にならない)
リークと呼ぶかどうかはともかくとして、
前者で気を付けなきゃならないのと同様に後者にも気を付けないといけないというのは普通のことだと思うよ。
・ GC のない言語でうっかりメモリの解放を忘れる
・ GC のある言語でうっかりもう使わないオブジェクトの参照を残してしまう (GC の回収対象にならない)
リークと呼ぶかどうかはともかくとして、
前者で気を付けなきゃならないのと同様に後者にも気を付けないといけないというのは普通のことだと思うよ。
453デフォルトの名無しさん
2020/04/26(日) 18:59:47.51ID:1jKTUwjI454デフォルトの名無しさん
2020/04/26(日) 20:36:09.72ID:sSD7yA0P QZアホやw
Javaのメモリリークを見つけるのがどんだけ面倒なのか全く分からないようだ
こいつプログラマじゃないな
Javaのメモリリークを見つけるのがどんだけ面倒なのか全く分からないようだ
こいつプログラマじゃないな
455デフォルトの名無しさん
2020/04/26(日) 20:55:44.38ID:O/ywVmO1 >>452
> ・ GC のある言語でうっかりもう使わないオブジェクトの参照を残してしまう (GC の回収対象にならない)
じゃあ、そもそもGCって何のためにあるんだってことだね
私見ながら、馬鹿馬鹿しいぜ
> ・ GC のある言語でうっかりもう使わないオブジェクトの参照を残してしまう (GC の回収対象にならない)
じゃあ、そもそもGCって何のためにあるんだってことだね
私見ながら、馬鹿馬鹿しいぜ
456デフォルトの名無しさん
2020/04/26(日) 20:57:06.36ID:O/ywVmO1 資源を解放すべき盤面で、自動化されてるんだから手を出しちゃダメ
あげく解放されませんでした、解放されてるかどうか確認をせよ
何なのコレ?
あげく解放されませんでした、解放されてるかどうか確認をせよ
何なのコレ?
457はちみつ餃子 ◆8X2XSCHEME
2020/04/26(日) 21:11:50.20ID:Kc4H3V0/ >>455-456
事例としては
例1: 使い捨てスクリプト
その程度の管理で良い。
ガッと動かしてそのまま終わるので管理もクソもない。
例2: サービスの変更が多いウェブサービス
まずは早期に動かすことが大事。
細けぇことは後でプロファイラを見ながらなんとかする。
事例としては
例1: 使い捨てスクリプト
その程度の管理で良い。
ガッと動かしてそのまま終わるので管理もクソもない。
例2: サービスの変更が多いウェブサービス
まずは早期に動かすことが大事。
細けぇことは後でプロファイラを見ながらなんとかする。
458デフォルトの名無しさん
2020/04/26(日) 21:14:39.85ID:PBJtHpgo >自動化されてるんだから手を出しちゃダメ
ハアwwww?
コードで明示的にマークも出来ますが何かwwwwwwww
>あげく解放されませんでした、解放されてるかどうか確認をせよ
ハアwwwwwwwww?
>>456は不具合を発見してから不具合がないか確認するタイプ?wwwwwwwwwwww
ハアwwww?
コードで明示的にマークも出来ますが何かwwwwwwww
>あげく解放されませんでした、解放されてるかどうか確認をせよ
ハアwwwwwwwww?
>>456は不具合を発見してから不具合がないか確認するタイプ?wwwwwwwwwwww
459デフォルトの名無しさん
2020/04/26(日) 21:31:08.35ID:O/ywVmO1460デフォルトの名無しさん
2020/04/26(日) 21:38:26.82ID:O/ywVmO1 「資源の解放はお任せくださいっ!!(キリッ
「あのー循環参照が・・・
「メモリーだけです!!(汗
「資源じゃなかったんですか?
「そのくらい察して下さい!!(滝汗
「もういいです
「あのー循環参照が・・・
「メモリーだけです!!(汗
「資源じゃなかったんですか?
「そのくらい察して下さい!!(滝汗
「もういいです
461デフォルトの名無しさん
2020/04/26(日) 22:53:28.79ID:QPzhUi52 仕事でしゃーなしに使う言語あるいは
知ったかしたいアマチュアが使う言語、それがC++
知ったかしたいアマチュアが使う言語、それがC++
462デフォルトの名無しさん
2020/04/26(日) 23:02:01.07ID:L6Afs0I9 仕事で喜んで使う言語だな
c#とかjavaとかだと嫌になる
c#とかjavaとかだと嫌になる
>>462
java は、少なくとも昔の java は、厳しく抑制のきいた文法と豊富なクラスライブラリでいい感じだと思いますよ、文法は意味があっての簡素なほうが好みですね
c# は、クラスライブラリの全容を把握していないので、まだ評価にとりかかれないのですが、これからじっくり調べたいと思っています
java は、少なくとも昔の java は、厳しく抑制のきいた文法と豊富なクラスライブラリでいい感じだと思いますよ、文法は意味があっての簡素なほうが好みですね
c# は、クラスライブラリの全容を把握していないので、まだ評価にとりかかれないのですが、これからじっくり調べたいと思っています
464デフォルトの名無しさん
2020/04/27(月) 00:49:16.60ID:fjvRegs6 Javaは新しいCOBOLになってしまった
当初の理想は良かったと思うけどままならんもんだね
当初の理想は良かったと思うけどままならんもんだね
465デフォルトの名無しさん
2020/04/27(月) 07:25:21.81ID:8maROmCe >>461
シッタカにいつもマウント取られる水準のやつからは、そう見えるだろうな
シッタカにいつもマウント取られる水準のやつからは、そう見えるだろうな
466デフォルトの名無しさん
2020/04/27(月) 07:39:21.53ID:xj40wisa まともにコンパイルも通してないで知ったかしてるバカに言えることなんてないけどね。
467デフォルトの名無しさん
2020/04/27(月) 10:24:31.10ID:GkRU7UlF468デフォルトの名無しさん
2020/04/27(月) 10:53:01.86ID:8maROmCe469デフォルトの名無しさん
2020/04/27(月) 15:48:22.92ID:D/t5uqt1 なんで
long long abs(long long x)
なんだろうか
負の数の方が絶対値の大きい値が表せちゃうのに
long long abs(long long x)
なんだろうか
負の数の方が絶対値の大きい値が表せちゃうのに
470デフォルトの名無しさん
2020/04/27(月) 15:59:47.26ID:l27UEbbh 0x8000000000000000 代入してみろ
471デフォルトの名無しさん
2020/04/27(月) 16:00:23.33ID:8maROmCe long longでないとすると、何型が妥当だと思う?
472デフォルトの名無しさん
2020/04/27(月) 16:31:02.95ID:l27UEbbh unsigned long long じゃね
473デフォルトの名無しさん
2020/04/27(月) 16:32:36.82ID:CPqejn5Z >>465
このスレで知ったかの相手すると荒れるから、大抵中身の無いマウントカキコはスルーされてるんだが
このスレで知ったかの相手すると荒れるから、大抵中身の無いマウントカキコはスルーされてるんだが
474デフォルトの名無しさん
2020/04/27(月) 16:44:05.42ID:8maROmCe つまり、こういうことか
template <typename T>
auto abs(T val) -> enable_if_t<is_integral_v<T>, make_unsigned_t<T>>;
template <typename T>
auto abs(T val) -> enable_if_t<is_integral_v<T>, make_unsigned_t<T>>;
475デフォルトの名無しさん
2020/04/27(月) 17:10:02.87ID:GkRU7UlF singedとunsigned混在すんなってことだよ
c言語レベルの質問はc言語スレでやれ
というか語りつくされた話題だから適当にググれ
c言語レベルの質問はc言語スレでやれ
というか語りつくされた話題だから適当にググれ
476デフォルトの名無しさん
2020/04/27(月) 17:30:31.42ID:BED9nwFS 背伸びしたい無職が使う言語は
C++かHaskellと相場が決まっとる
C++かHaskellと相場が決まっとる
477デフォルトの名無しさん
2020/04/27(月) 18:01:51.48ID:BO0mpPru C++14(gcc)でUTF8の正規化をする場合、どんなやり方が良いとされているのかご教示ください。
C++ではやったことがないので初歩的なところからご教示いただけるとありがたいです。
・ICU以外の選択肢はあるのか?
・ICUを使う場合、直接APIを使うよりBoost.localeを使った方が良いのか?
C++ではやったことがないので初歩的なところからご教示いただけるとありがたいです。
・ICU以外の選択肢はあるのか?
・ICUを使う場合、直接APIを使うよりBoost.localeを使った方が良いのか?
478デフォルトの名無しさん
2020/04/27(月) 19:07:33.35ID:xj40wisa >>476
最近はrustも人気。
最近はrustも人気。
479デフォルトの名無しさん
2020/04/27(月) 20:41:43.99ID:GkRU7UlF >>477
文字コードスレできいたら?
icuで足りるんならicuでいいと思うけど
自分の経験ではicuのでかくて重いのが問題だったらから
必要な機能だけ自作したな
(unicodeがリリースしてるテストデータをパスさせた)
文字コードスレできいたら?
icuで足りるんならicuでいいと思うけど
自分の経験ではicuのでかくて重いのが問題だったらから
必要な機能だけ自作したな
(unicodeがリリースしてるテストデータをパスさせた)
480デフォルトの名無しさん
2020/04/27(月) 21:27:19.90ID:hGnxzjbK 集中治療室?
481デフォルトの名無しさん
2020/04/27(月) 22:52:07.04ID:mlDkfEpN だまれ>>476
スカトロ野郎
スカトロ野郎
482デフォルトの名無しさん
2020/04/27(月) 23:00:48.56ID:4DagN68Q 普通はc++だろ
javaとかc#とか環境整えるの面倒くさいじゃん
javaとかc#とか環境整えるの面倒くさいじゃん
483デフォルトの名無しさん
2020/04/28(火) 03:25:29.21ID:5RYVSkyg >>476
Cはかつて最大人気言語だった歴史があるのに対し、HaskelやRustはそうではない。
C++もCの人気を受け継いだ言語だし、処理速度が高速でメモリー使用量も少なく、
起動も速いし、Windows以外でもとても広いプラットフォームで簡単に動くのだから、
使うのは自然な流れだし、背伸びとかではない。
例えば、C#をAndroid/iOS/Linux/Macで動かすのは容易ではない。
Wasmで動かすにもネットからのダウンロード量が多くなり起動が遅くなる。
一方、C++ならWasmでも起動が速い。
Cはかつて最大人気言語だった歴史があるのに対し、HaskelやRustはそうではない。
C++もCの人気を受け継いだ言語だし、処理速度が高速でメモリー使用量も少なく、
起動も速いし、Windows以外でもとても広いプラットフォームで簡単に動くのだから、
使うのは自然な流れだし、背伸びとかではない。
例えば、C#をAndroid/iOS/Linux/Macで動かすのは容易ではない。
Wasmで動かすにもネットからのダウンロード量が多くなり起動が遅くなる。
一方、C++ならWasmでも起動が速い。
484デフォルトの名無しさん
2020/04/28(火) 03:31:09.13ID:5RYVSkyg >>483
C++を動かすのはOS以外に基本的に特殊なランタイムが要らない。
C#やJavaでは.NET環境やJVMが必要となる。
AndroidでもJNIを使えばC/C++は起動も速く動作速度もJava/Kotlin以上に軽快に動く。
同様にiOSでも、Swiftとリンクできるので同様。
逆にC#は、iOSやAndroidで動かすにはダウンロード時間や起動速度に問題があり、
動作速度にも desktop マシン以上に問題がある。
Androidだと、Java/Kotlinの仮想マシンの上に、.NETの仮想マシンを二重に載せる
形となるため、C/C++と比べれば、掛け算の形で遅くなってしまう。
C++を動かすのはOS以外に基本的に特殊なランタイムが要らない。
C#やJavaでは.NET環境やJVMが必要となる。
AndroidでもJNIを使えばC/C++は起動も速く動作速度もJava/Kotlin以上に軽快に動く。
同様にiOSでも、Swiftとリンクできるので同様。
逆にC#は、iOSやAndroidで動かすにはダウンロード時間や起動速度に問題があり、
動作速度にも desktop マシン以上に問題がある。
Androidだと、Java/Kotlinの仮想マシンの上に、.NETの仮想マシンを二重に載せる
形となるため、C/C++と比べれば、掛け算の形で遅くなってしまう。
485デフォルトの名無しさん
2020/04/28(火) 06:21:32.17ID:greKUeEf 例外やRTTIをイネーブルしてるとでかいスタティックリンクつくけどね
486デフォルトの名無しさん
2020/04/28(火) 08:31:29.78ID:QAhIr1h2 言うほどでかいか?
487デフォルトの名無しさん
2020/04/28(火) 10:12:31.46ID:hgakc7LF CならRAM16バイトのPIC10F200でも使える
488デフォルトの名無しさん
2020/04/28(火) 10:13:11.23ID:hgakc7LF C++も機能を絞れば非常に小さい
489デフォルトの名無しさん
2020/04/28(火) 11:07:35.26ID:greKUeEf >>486
ソースコードの見た目とバイナリのサイズがCと違いすぎって意味
ソースコードの見た目とバイナリのサイズがCと違いすぎって意味
490デフォルトの名無しさん
2020/04/28(火) 11:08:41.96ID:zAZN/f3s テンプレとかソース小さくするためにあるからな
491デフォルトの名無しさん
2020/04/28(火) 11:16:33.24ID:greKUeEf 俺>>485だよ?
492デフォルトの名無しさん
2020/04/28(火) 11:43:34.53ID:A6/2gkMb Arduinoで使ってること考えたら、十分使える。
RAM2KBしかない。
RAM2KBしかない。
493デフォルトの名無しさん
2020/04/28(火) 11:47:47.26ID:AaGQGXoS494デフォルトの名無しさん
2020/04/28(火) 12:21:03.57ID:greKUeEf >>493
libgccだったかな?
libgccだったかな?
495デフォルトの名無しさん
2020/04/28(火) 13:35:25.37ID:IyPBiCvR >>494
gcc のオプションに -static を加えればいいのでは?
gcc のオプションに -static を加えればいいのでは?
498デフォルトの名無しさん
2020/04/28(火) 18:57:57.67ID:greKUeEf >>497
意味わからん 何?
意味わからん 何?
>>498
https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/Link-Options.html#Link-Options
-static
On systems that support dynamic linking, this overrides -pie and prevents linking with the shared libraries.
https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/Link-Options.html#Link-Options
-static
On systems that support dynamic linking, this overrides -pie and prevents linking with the shared libraries.
500はちみつ餃子 ◆8X2XSCHEME
2020/04/28(火) 19:15:02.93ID:jkGkDNpV501はちみつ餃子 ◆8X2XSCHEME
2020/04/28(火) 19:16:34.52ID:jkGkDNpV マップファイルを出力させてみれば実際に何がリンクされるかはわかるんちゃう?
試してないけど。
試してないけど。
502デフォルトの名無しさん
2020/04/28(火) 19:25:33.35ID:9sR0wNPf QZは頭が弱いからしょうがない
503デフォルトの名無しさん
2020/04/28(火) 19:32:38.39ID:AaGQGXoS libgccの大きさじゃなくてunwind用のハンドラコードの増加じゃないの?
(間違って別スレに書いてしまった)
(間違って別スレに書いてしまった)
504デフォルトの名無しさん
2020/04/29(水) 02:43:38.13ID:BrDWvzn9 >>503
RTTI の場合は、仮想テーブルと同様の場所に、実行時型情報へのリンクポインタが
書き込まれるようになる。
それがなかなか複雑な構造をしている。
RTTI情報も、ヘッダファイルの中に構造体が書いてあると、COMDAT形式で
全ての *.obj ファイルの中にいったん書きこまれることがある。
リンク段階で同じデータのsectionがある場合は、単一のsectionだけを残して
他は削除されてしまうが。
RTTI の場合は、仮想テーブルと同様の場所に、実行時型情報へのリンクポインタが
書き込まれるようになる。
それがなかなか複雑な構造をしている。
RTTI情報も、ヘッダファイルの中に構造体が書いてあると、COMDAT形式で
全ての *.obj ファイルの中にいったん書きこまれることがある。
リンク段階で同じデータのsectionがある場合は、単一のsectionだけを残して
他は削除されてしまうが。
505デフォルトの名無しさん
2020/04/29(水) 02:45:01.49ID:BrDWvzn9506デフォルトの名無しさん
2020/04/29(水) 03:00:07.88ID:s4ud4ToE >>484
mono、core、zamarin調べて出直してこい
mono、core、zamarin調べて出直してこい
507デフォルトの名無しさん
2020/04/29(水) 10:03:27.37ID:I9/54o5j enum class を1オリジンにするスタイルはどの程度使われていますか?
508デフォルトの名無しさん
2020/04/29(水) 10:59:38.40ID:I9/54o5j char8_tってどういう経緯で採択されたんですか?
Microsoftを利する提案が受け入れられるのは相当珍しいと思いますが。
Microsoftを利する提案が受け入れられるのは相当珍しいと思いますが。
509はちみつ餃子 ◆8X2XSCHEME
2020/04/29(水) 12:00:55.06ID:sxS/u8Yc510デフォルトの名無しさん
2020/04/29(水) 12:20:11.19ID:I9/54o5j その要望は昔からあるけど阻止してきたのに、なぜ解禁されたのか事情知りませんか?
511はちみつ餃子 ◆8X2XSCHEME
2020/04/29(水) 12:43:30.81ID:sxS/u8Yc >>510
江添亮のブログで関連する提案や議論が取り上げられているので順番に読んでみたらいいと思う。
https://cpplover.blogspot.com/search?q=char8_t
具体的にこれが理由と言えるひとつの理由があるわけではないけど、
やってみたらやっぱ要るわ……という雰囲気っぽいかな。
要するに文字列をナメてたんだろう。
江添亮のブログで関連する提案や議論が取り上げられているので順番に読んでみたらいいと思う。
https://cpplover.blogspot.com/search?q=char8_t
具体的にこれが理由と言えるひとつの理由があるわけではないけど、
やってみたらやっぱ要るわ……という雰囲気っぽいかな。
要するに文字列をナメてたんだろう。
512デフォルトの名無しさん
2020/04/29(水) 13:58:02.79ID:6qGxEOGB513デフォルトの名無しさん
2020/04/29(水) 14:13:57.87ID:j7Bsjnws charにutf8突っ込むだけでunicode対応できるとか考えるやつがようやく淘汰されてきてありがたい
514デフォルトの名無しさん
2020/04/29(水) 14:46:58.81ID:UddvUJZz そもそも「Microsoftを利する提案」てなんだよ
C++は別にアンチMSじゃないだろ
C++は別にアンチMSじゃないだろ
515デフォルトの名無しさん
2020/04/29(水) 14:58:22.63ID:fDjn2ZQ/ utf8は一文字が3バイトなこともある
516デフォルトの名無しさん
2020/04/29(水) 15:01:51.37ID:I9/54o5j std::size(u8"あいうえお" - 1)みたいな感じですかね。
517デフォルトの名無しさん
2020/04/29(水) 16:00:32.94ID:fokztjWx std::u8stringとかC++は規格に出すのが遅い
518デフォルトの名無しさん
2020/04/29(水) 16:10:17.68ID:I9/54o5j >>514
W3CもアンチMicrosoftではないのだけど、会員がIT業界の人たちなので、結局のところ、如何にしてMicrosoftを落とすか討論する場所になってました。
W3CもアンチMicrosoftではないのだけど、会員がIT業界の人たちなので、結局のところ、如何にしてMicrosoftを落とすか討論する場所になってました。
519デフォルトの名無しさん
2020/04/29(水) 16:22:55.14ID:T9sEu8SV520デフォルトの名無しさん
2020/04/29(水) 17:04:53.68ID:EKyVvulT521デフォルトの名無しさん
2020/04/29(水) 17:10:00.22ID:IQZPjtSj enum class とか、MS起源の機能なんていくらでもあるんだけどな
522デフォルトの名無しさん
2020/04/29(水) 18:31:43.41ID:mBdz0qQc523デフォルトの名無しさん
2020/04/29(水) 18:51:27.37ID:BrDWvzn9 >>522
うむ。関係ない。
うむ。関係ない。
524デフォルトの名無しさん
2020/04/29(水) 20:13:29.91ID:Ck1GLV1r525デフォルトの名無しさん
2020/04/29(水) 21:26:43.63ID:6qGxEOGB まあ書いてあることは概ね正しいので・・・
526デフォルトの名無しさん
2020/04/29(水) 21:36:36.72ID:mBdz0qQc そうかな
utf8をコア仕様にいれたら「文字とは何かを理解する」ってのは
ちょっと同意できないな
utf8をコア仕様にいれたら「文字とは何かを理解する」ってのは
ちょっと同意できないな
527デフォルトの名無しさん
2020/04/29(水) 22:08:32.37ID:I9/54o5j constexprがあるので、エンコーディングを型に組み込んでしまっても、困ることは全くない。
C++のお作法になじんでいれば、お得な事しかない。
C++のお作法になじんでいれば、お得な事しかない。
528デフォルトの名無しさん
2020/04/29(水) 22:11:31.22ID:GvXmmF1B それ、カーニハン・リッチーにも言えるの?
529デフォルトの名無しさん
2020/04/29(水) 23:00:00.81ID:I9/54o5j 連れてきてくれたら、ガツンと言ってやるよ。
530デフォルトの名無しさん
2020/04/29(水) 23:13:52.04ID:sxS/u8Yc 一休さんかよ
531デフォルトの名無しさん
2020/04/30(木) 12:33:45.41ID:yesxJOcI UTF8ベースにしたらどうやって1文字ずつ処理するの?めんどくさい?
532デフォルトの名無しさん
2020/04/30(木) 12:38:45.38ID:yesxJOcI533デフォルトの名無しさん
2020/04/30(木) 12:45:47.62ID:ERcZittz534デフォルトの名無しさん
2020/04/30(木) 12:50:20.00ID:IVFUa3Rm ICUのイテレータ使えばよいのでは。
内部では utf-32 ベースで処理して、出口入り口で utf-8 に/から変換するものだと思いますが…
536デフォルトの名無しさん
2020/04/30(木) 20:49:36.61ID:IVFUa3Rm そんな単純なものではないだろうけど。
537デフォルトの名無しさん
2020/04/30(木) 23:06:50.07ID:b9TIw4B4 期間工ブログの収入は1500万円でした。【フリーランスの現実&底辺からの復活編】
https://www.youtube.com/watch?v=aijLjFLOuC4
工場勤務、30代フリーターが「ブログ」で200万稼げた理由! ◯◯があったから?
https://www.youtube.com/watch?v=Cjmk4XusQVM
ブログで月200万稼ぐ、フリーランスの1日
https://www.youtube.com/watch?v=jaV2GyBgNX4
【クラウドソーシング】Webライティングで月商100万円まで稼ぐ方法をプロに解説してもらった!
https://www.youtube.com/watch?v=oYoaBwQt0Cg
1年半でライターの地位を確立した営業術!駆け出しフリーランスは要チェック【ニシキドアヤト】
https://www.youtube.com/watch?v=DFtmkhw-lHM
https://www.youtube.com/watch?v=aijLjFLOuC4
工場勤務、30代フリーターが「ブログ」で200万稼げた理由! ◯◯があったから?
https://www.youtube.com/watch?v=Cjmk4XusQVM
ブログで月200万稼ぐ、フリーランスの1日
https://www.youtube.com/watch?v=jaV2GyBgNX4
【クラウドソーシング】Webライティングで月商100万円まで稼ぐ方法をプロに解説してもらった!
https://www.youtube.com/watch?v=oYoaBwQt0Cg
1年半でライターの地位を確立した営業術!駆け出しフリーランスは要チェック【ニシキドアヤト】
https://www.youtube.com/watch?v=DFtmkhw-lHM
538デフォルトの名無しさん
2020/05/01(金) 00:49:44.42ID:2K4VYu4Y >>528
リッチーならともかくカーニハンは見てる可能性
リッチーならともかくカーニハンは見てる可能性
539はちみつ餃子 ◆8X2XSCHEME
2020/05/01(金) 01:06:57.59ID:Qu9UE9Tc >>535
色んな文字コード (符号化) を扱うときは出入口で変換する方法は妥当な選択だと思うけど、
UTF-32 を中心に据えるのが良いかは一概に言えるものでもないでしょ。
たとえば Windows API がいう Unicode は UTF-16 なわけだし、
外部とのデータのやりとりで内部用の符号に変換する処理が入るのは仕方がないにしても
API の呼び出しのときまで毎回変換が入るのも煩雑なんで、
UTF-16 に統一した方全体としては楽じゃない?
サロゲートペアの扱いが面倒くせぇとかいうのと天秤にかけたとしても
Windows では UTF-16 から離れられない。
結局のところ実行環境とかフレームワークとかの都合に縛られるから
(内部用の符号として UTF-32 が優秀なことは承知しているが)
そのへんの規約とか習慣に従うしかしゃーない。
色んな文字コード (符号化) を扱うときは出入口で変換する方法は妥当な選択だと思うけど、
UTF-32 を中心に据えるのが良いかは一概に言えるものでもないでしょ。
たとえば Windows API がいう Unicode は UTF-16 なわけだし、
外部とのデータのやりとりで内部用の符号に変換する処理が入るのは仕方がないにしても
API の呼び出しのときまで毎回変換が入るのも煩雑なんで、
UTF-16 に統一した方全体としては楽じゃない?
サロゲートペアの扱いが面倒くせぇとかいうのと天秤にかけたとしても
Windows では UTF-16 から離れられない。
結局のところ実行環境とかフレームワークとかの都合に縛られるから
(内部用の符号として UTF-32 が優秀なことは承知しているが)
そのへんの規約とか習慣に従うしかしゃーない。
540デフォルトの名無しさん
2020/05/01(金) 01:37:06.74ID:/3xCHgCD 出入り口から内部処理まで出来る限りutf-8で統一して処理するのが
トラブルが少なくて済む(個人の感想です)
トラブルが少なくて済む(個人の感想です)
541デフォルトの名無しさん
2020/05/01(金) 02:27:55.90ID:uatxyJey それは文字列としてだけ扱って文字単位(code point単位)の操作しないときでしょ
あるいは小難しいところは全部ライブラリに投げてるとかね
あるいは小難しいところは全部ライブラリに投げてるとかね
>>539
>たとえば Windows API がいう Unicode は UTF-16 なわけだし、(略)
>API の呼び出しのときまで毎回変換が入るのも煩雑なんで、
>UTF-16 に統一した方全体としては楽じゃない?
Windows では UTF-16 を使うといっても、実際に変換しなければならないのは、ファイル名・パス名を扱うときだけですし、
UTF-16 も可変長の部分があって扱いにくいので、私なら UTF-32 で楽したいと考えますね
>たとえば Windows API がいう Unicode は UTF-16 なわけだし、(略)
>API の呼び出しのときまで毎回変換が入るのも煩雑なんで、
>UTF-16 に統一した方全体としては楽じゃない?
Windows では UTF-16 を使うといっても、実際に変換しなければならないのは、ファイル名・パス名を扱うときだけですし、
UTF-16 も可変長の部分があって扱いにくいので、私なら UTF-32 で楽したいと考えますね
543デフォルトの名無しさん
2020/05/01(金) 08:23:58.09ID:DtDCGOpK 実際にソフト開発したことが無いような書き込みだな
544デフォルトの名無しさん
2020/05/01(金) 08:31:51.38ID:NLgIsVNa UTF-32でも結合文字と異体字セレクタはある
結局ライブラリに投げるでしょ、ならどれでも同じじゃね?
結局ライブラリに投げるでしょ、ならどれでも同じじゃね?
545デフォルトの名無しさん
2020/05/01(金) 08:47:44.57ID:sYrLq0eo マルチプラットフォームのアプリじゃ内部はUTF-8にする場合が多いけどな
なぜならUTF-8にはバイト順問題がないから
どのみち一文字表すのに複数のコードポイントが必要なんだからUTF-8、16、32のどれを使っても言語処理の手間は同じだ
「イングランドの旗」絵文字なんてコードポイントで7要素も必要なんだぜ
なぜならUTF-8にはバイト順問題がないから
どのみち一文字表すのに複数のコードポイントが必要なんだからUTF-8、16、32のどれを使っても言語処理の手間は同じだ
「イングランドの旗」絵文字なんてコードポイントで7要素も必要なんだぜ
546デフォルトの名無しさん
2020/05/01(金) 09:58:16.26ID:k2YlXFh6 マルチコアの高速化と同様に
32bitのCPUで16bitを扱うと2倍速
64bitのCPUで16bitを扱うと4倍速
みたいにならないんですか?
32bitのCPUで16bitを扱うと2倍速
64bitのCPUで16bitを扱うと4倍速
みたいにならないんですか?
547デフォルトの名無しさん
2020/05/01(金) 10:00:07.33ID:tdkjZBPc なりますよ。
548デフォルトの名無しさん
2020/05/01(金) 10:02:36.39ID:tdkjZBPc 32ビットと64ビットで二倍の時間になるのではなく、たいてい4倍になりますよ。
549デフォルトの名無しさん
2020/05/01(金) 10:13:13.46ID:Ia4c8IgS 文字列関連の処理はだいたいメモリアクセスかIOがボトルネックなので、単純にサイズが 増えればその分遅くなるよ
550デフォルトの名無しさん
2020/05/01(金) 10:19:22.16ID:DtDCGOpK 文字処理のほとんどは64bitがいかされない
551デフォルトの名無しさん
2020/05/01(金) 10:22:39.64ID:DtDCGOpK 文字処理以外でもそれほど多くない
552デフォルトの名無しさん
2020/05/01(金) 13:13:05.71ID:uatxyJey >>546
simd使えばそれに近づくだろうけど
そうでなければシリアルに計算されるだけなのでほぼ変わらない
大量のデータを処理する場合はメモリ効率の点で速くなるかもしれない
しかしintへの拡大変換が入るので演算自体は遅くなる方向
まぁ自分でベンチとってアセンブラ眺めてみたらいい
かなり環境依存・実装依存なんだから人にきいてもあんまり意味ない
4倍になる人とかいるらしいしw
simd使えばそれに近づくだろうけど
そうでなければシリアルに計算されるだけなのでほぼ変わらない
大量のデータを処理する場合はメモリ効率の点で速くなるかもしれない
しかしintへの拡大変換が入るので演算自体は遅くなる方向
まぁ自分でベンチとってアセンブラ眺めてみたらいい
かなり環境依存・実装依存なんだから人にきいてもあんまり意味ない
4倍になる人とかいるらしいしw
553デフォルトの名無しさん
2020/05/01(金) 13:22:02.62ID:DtDCGOpK SIMDなら32bit CPUとか64bit CPUとか関係ないし
554デフォルトの名無しさん
2020/05/01(金) 14:33:57.85ID:RpLrbaMs 例えばRGBAの計算は早くなるよ
555デフォルトの名無しさん
2020/05/01(金) 14:54:56.02ID:8qmJgOle tclインタプリタに投げる
邪魔くさい
邪魔くさい
556デフォルトの名無しさん
2020/05/01(金) 15:22:00.38ID:tdkjZBPc >>552
ベンチとるとおよそ4倍になりますよ。
ベンチとるとおよそ4倍になりますよ。
557デフォルトの名無しさん
2020/05/01(金) 16:04:33.87ID:uatxyJey558デフォルトの名無しさん
2020/05/01(金) 16:07:40.19ID:wrmDV0oq 64bitを使っても、大部分のソフトウェアは速くも良くもならない事が知られている。
16bitから32bitの時には急激に多くのメモリが使えるようになって劇的にソフトウェア
が作り易くなったのと対照的。
メモリ容量に関してはたいていのアプリでは32bitでも既に十分。
速度に関してはそもそもCPUが扱えるデータビット数を多くしても滅多に速くならない。
速くなるのはグラフィックで単純なBitBLTを行うような場合のみ。
縮尺や回転が入るだけで64BITの効果は通常、生かせなくなる。
16bitから32bitの時には急激に多くのメモリが使えるようになって劇的にソフトウェア
が作り易くなったのと対照的。
メモリ容量に関してはたいていのアプリでは32bitでも既に十分。
速度に関してはそもそもCPUが扱えるデータビット数を多くしても滅多に速くならない。
速くなるのはグラフィックで単純なBitBLTを行うような場合のみ。
縮尺や回転が入るだけで64BITの効果は通常、生かせなくなる。
559デフォルトの名無しさん
2020/05/01(金) 16:13:27.06ID:DtDCGOpK >>554
変わった文字列処理だな
変わった文字列処理だな
560デフォルトの名無しさん
2020/05/01(金) 16:15:49.44ID:wrmDV0oq >>554
RGBA計算も、(SIMDを使わずに)単純にデータバスが64BITになっただけでは速く出来ない。
なぜなら、R,G,B,Aはそれぞれ1バイトだから1バイトずつの計算するしかないため。
SIMDを使う場合は、CPUの種類によっては、SIMD自体のベクトルの要素数が倍になるため、高速化できる可能性はある。
ただしそれは、整数命令が64BIT化されたこととは直接関係ない。
SIMD命令のベクトルの「次元」が上がったかどうかの問題。
RGBA計算も、(SIMDを使わずに)単純にデータバスが64BITになっただけでは速く出来ない。
なぜなら、R,G,B,Aはそれぞれ1バイトだから1バイトずつの計算するしかないため。
SIMDを使う場合は、CPUの種類によっては、SIMD自体のベクトルの要素数が倍になるため、高速化できる可能性はある。
ただしそれは、整数命令が64BIT化されたこととは直接関係ない。
SIMD命令のベクトルの「次元」が上がったかどうかの問題。
561デフォルトの名無しさん
2020/05/01(金) 16:18:51.22ID:DtDCGOpK >>560
なんでわざわざ関係ないことを書いてわざわざ混乱させようとするかなあ
なんでわざわざ関係ないことを書いてわざわざ混乱させようとするかなあ
562デフォルトの名無しさん
2020/05/01(金) 16:20:54.72ID:tdkjZBPc 64ビットの演算1回の時間で、32ビットの演算4回出来るんですよ。
563デフォルトの名無しさん
2020/05/01(金) 16:22:03.22ID:wrmDV0oq >>547
なりません。
ならないからこそ、GPGPUのようにマルチコア化が進められています。
SIMD命令も扱いにくいので、マルチコア化が適しています。
例えば、3Dのレイトレーシングなどは、SIMD化することはとても難しい
のですが、マルチコア化は比較的容易です。
人工知能のニューラルネットワークの計算はSIMD化し易い部分もあります。
しかし、300コアなどのマルチコアと、8要素のSIMD命令では、
前者に軍配が上がり易く、しかも、コア数が増えてもプログラムの修正が
ほぼ不要なので、マルチコアの方がSIMDより好まれます。
ただし、命令自体の速度がx86系は速いため、どちらが実際に速いかは
単純ではありませんが。
なりません。
ならないからこそ、GPGPUのようにマルチコア化が進められています。
SIMD命令も扱いにくいので、マルチコア化が適しています。
例えば、3Dのレイトレーシングなどは、SIMD化することはとても難しい
のですが、マルチコア化は比較的容易です。
人工知能のニューラルネットワークの計算はSIMD化し易い部分もあります。
しかし、300コアなどのマルチコアと、8要素のSIMD命令では、
前者に軍配が上がり易く、しかも、コア数が増えてもプログラムの修正が
ほぼ不要なので、マルチコアの方がSIMDより好まれます。
ただし、命令自体の速度がx86系は速いため、どちらが実際に速いかは
単純ではありませんが。
564デフォルトの名無しさん
2020/05/01(金) 16:23:18.73ID:wrmDV0oq565デフォルトの名無しさん
2020/05/01(金) 16:25:25.15ID:tdkjZBPc 測ると大抵そうなってるというお話です。
566デフォルトの名無しさん
2020/05/01(金) 16:33:18.55ID:DtDCGOpK 測定結果みせて
567デフォルトの名無しさん
2020/05/01(金) 16:33:57.33ID:tdkjZBPc これ最初に気が付いたのは、固定小数点は速いらしいというのを見て、いろいろやってみたら、特に早いことは無くて。
じゃあ何が影響するかというと、単にビット幅だったんですよ。
floatとint32_tは同じ、doubleとint64_tは同じ。
つまり、アキュムレータの性能はあまり関係なくて、バス幅とキャッシュがすべてなんですよ。
じゃあ32ビット2回分が64ビット相当になるかというとそうでもなくて。
たいてい4回分で64ビット相当になるんですね。
じゃあ何が影響するかというと、単にビット幅だったんですよ。
floatとint32_tは同じ、doubleとint64_tは同じ。
つまり、アキュムレータの性能はあまり関係なくて、バス幅とキャッシュがすべてなんですよ。
じゃあ32ビット2回分が64ビット相当になるかというとそうでもなくて。
たいてい4回分で64ビット相当になるんですね。
568デフォルトの名無しさん
2020/05/01(金) 16:37:43.83ID:DtDCGOpK だから測定結果早くみせて
>>558
まさか!
2^32 bit 空間が狭すぎる、というのは windows XP の頃から問題になっており、2^64 bit 空間は必然でした
>メモリ容量に関してはたいていのアプリでは32bitでも既に十分。
個々のアプリ単体ではそうであっても、個々のアプリを複数稼動させる OS では32bit では足りないのでは?
そして 64bit OS に対応した 64bit アプリの存在も必要でしょう
まさか!
2^32 bit 空間が狭すぎる、というのは windows XP の頃から問題になっており、2^64 bit 空間は必然でした
>メモリ容量に関してはたいていのアプリでは32bitでも既に十分。
個々のアプリ単体ではそうであっても、個々のアプリを複数稼動させる OS では32bit では足りないのでは?
そして 64bit OS に対応した 64bit アプリの存在も必要でしょう
570デフォルトの名無しさん
2020/05/01(金) 16:38:26.67ID:tdkjZBPc 自分で測ってもらえませんかね。
571デフォルトの名無しさん
2020/05/01(金) 16:41:04.33ID:tdkjZBPc あと、僕はベンチマークのカタログとしてVSのテストエクスプローラ使ってますよ。
テストケースを一つずつ呼び出せるので大変便利です。
テストケースを一つずつ呼び出せるので大変便利です。
572デフォルトの名無しさん
2020/05/01(金) 16:42:32.75ID:8qmJgOle 何をして速くなったと言っているのか不明なのに自分でってw
573デフォルトの名無しさん
2020/05/01(金) 16:45:05.04ID:uatxyJey574デフォルトの名無しさん
2020/05/01(金) 16:46:27.92ID:tdkjZBPc575デフォルトの名無しさん
2020/05/01(金) 16:51:31.85ID:wrmDV0oq Qz は馬鹿だ。
576デフォルトの名無しさん
2020/05/01(金) 16:54:18.57ID:uatxyJey577デフォルトの名無しさん
2020/05/01(金) 16:57:02.32ID:tdkjZBPc めんどくさいんですよ。
アセンブラ見れば速度がわかると言ってる時点で、僕は得るもの無いじゃないですか。
何か作業を手伝ってくれるならわかりやすく提示しても良いんですが。
作業を手伝ってもらうのに、色々教えないといけないなら、やっぱりめんどくさい。
アセンブラ見れば速度がわかると言ってる時点で、僕は得るもの無いじゃないですか。
何か作業を手伝ってくれるならわかりやすく提示しても良いんですが。
作業を手伝ってもらうのに、色々教えないといけないなら、やっぱりめんどくさい。
578デフォルトの名無しさん
2020/05/01(金) 17:00:18.65ID:DtDCGOpK 64bit命令を使うと4倍以上速くなるのは
64bitの乗算くらい
64bit加減算もCPUによっては数倍にはなる
それ以外は特殊な場合のみ
64bitの乗算くらい
64bit加減算もCPUによっては数倍にはなる
それ以外は特殊な場合のみ
579デフォルトの名無しさん
2020/05/01(金) 17:17:48.30ID:9YfMO5iP intとint64_tで適当なfor分で配列計算やらせてみればわかる。
手元じゃint64_tのが若干遅い
手元じゃint64_tのが若干遅い
580デフォルトの名無しさん
2020/05/01(金) 18:21:10.38ID:wrmDV0oq >>569
それは当たり前で、マシンには4GB以上のメモリが乗っているので、32BIT
では、OSレベルでは扱いにくい。
多くのプログラマにとって大事なのは、個々のアプリの問題だから、
OSレベルの話は関係ない。、
また、Windows OSがメモリーを食いすぎているという問題もある。
それは当たり前で、マシンには4GB以上のメモリが乗っているので、32BIT
では、OSレベルでは扱いにくい。
多くのプログラマにとって大事なのは、個々のアプリの問題だから、
OSレベルの話は関係ない。、
また、Windows OSがメモリーを食いすぎているという問題もある。
581デフォルトの名無しさん
2020/05/01(金) 18:23:48.97ID:wrmDV0oq >>580
補足すれば、グラフィック用のRAMは大きくなりがちで、最近のWindowsでは、
1つのWindowに仮想VRAMを割り当てているから、アプリが起動するたびに
グラフィック用になかなか大きなメモリーを消費する。
それと、ブラウザで複数のタブを開いている影響。
あれもグラフィックのレンダリング用に大量のメモリーを食っているのかもしれない。
補足すれば、グラフィック用のRAMは大きくなりがちで、最近のWindowsでは、
1つのWindowに仮想VRAMを割り当てているから、アプリが起動するたびに
グラフィック用になかなか大きなメモリーを消費する。
それと、ブラウザで複数のタブを開いている影響。
あれもグラフィックのレンダリング用に大量のメモリーを食っているのかもしれない。
582デフォルトの名無しさん
2020/05/01(金) 18:31:06.76ID:IyliQkiG >>577
他人を説得するつもりがないなら不特定多数が集まる場で自論を展開せず、馬鹿なこと言ってるなフフッて一人悦に入ってればいいんでない?
他人を説得するつもりがないなら不特定多数が集まる場で自論を展開せず、馬鹿なこと言ってるなフフッて一人悦に入ってればいいんでない?
583デフォルトの名無しさん
2020/05/01(金) 18:32:39.35ID:IyliQkiG >>575
全面的に同意
全面的に同意
584デフォルトの名無しさん
2020/05/01(金) 18:40:33.09ID:DtDCGOpK >>575
私も同意
私も同意
585デフォルトの名無しさん
2020/05/01(金) 19:15:32.79ID:wrmDV0oq >>580
今は、見えないものまで含めれば50個のプロセスが動いているなんてことは当たり前になっている。
だから、個々のプロセスが80MBのメモリしか使って無くても、合計すれば4GBになる。
さらにファイルバッファや、OSが高速化のためにさまざまなキャッシュ的なデータを保持している。
しかも、ファイルバッファやキャッシュはいくらあっても不足する時代となった。
ブラウザがページを記録するためのキャッシュも必要だ。
そういう訳で、アプリが80MBしか使って無くても、OS全体では4GBではメモリが不足する。
というわけで、4GBを超えるメモリが必要となっている。
タスクマネージャーで見ていても、個々のアプリは、多くても数百MB程度のものが多い。
ファイル高速検索ツールなんかが、1.6GBも使っていたりするが、それは特殊。
だから「特殊なものを除いては」今のアプリが2GBを超えるメモリーを必要とすることは稀、だと言っている。
今は、見えないものまで含めれば50個のプロセスが動いているなんてことは当たり前になっている。
だから、個々のプロセスが80MBのメモリしか使って無くても、合計すれば4GBになる。
さらにファイルバッファや、OSが高速化のためにさまざまなキャッシュ的なデータを保持している。
しかも、ファイルバッファやキャッシュはいくらあっても不足する時代となった。
ブラウザがページを記録するためのキャッシュも必要だ。
そういう訳で、アプリが80MBしか使って無くても、OS全体では4GBではメモリが不足する。
というわけで、4GBを超えるメモリが必要となっている。
タスクマネージャーで見ていても、個々のアプリは、多くても数百MB程度のものが多い。
ファイル高速検索ツールなんかが、1.6GBも使っていたりするが、それは特殊。
だから「特殊なものを除いては」今のアプリが2GBを超えるメモリーを必要とすることは稀、だと言っている。
586デフォルトの名無しさん
2020/05/01(金) 19:19:38.83ID:DtDCGOpK それ
64bitで4倍
とどういう関係?
64bitで4倍
とどういう関係?
587デフォルトの名無しさん
2020/05/01(金) 19:22:30.31ID:DtDCGOpK 32bit Windowsが4GBまでなのはWindowsの仕様であってCPU自体はそんな縛りは無いし
588デフォルトの名無しさん
2020/05/01(金) 19:51:53.68ID:wrmDV0oq589デフォルトの名無しさん
2020/05/01(金) 20:58:17.99ID:9yUywlA0 64GBまで使えるようになったのPentium Proからだぜ?w
Klamathより前!!
Klamathより前!!
590デフォルトの名無しさん
2020/05/02(土) 00:04:20.13ID:jVHOaTi/ >>547
釣り針でかいなw ここム板だぜw
釣り針でかいなw ここム板だぜw
591デフォルトの名無しさん
2020/05/02(土) 00:05:14.57ID:jVHOaTi/ >>587
おまえ嘘ばかりだなw
おまえ嘘ばかりだなw
592デフォルトの名無しさん
2020/05/02(土) 01:38:26.25ID:2lkgjmOV >>591
いや、彼は正しいことを言っている。
あなたがIntel CPUの仕様を詳しく知らないだけ。
PAEという仕組みなどで32BITモードでも4GBを超える物理メモリーを扱うことができるようになっていた。
いや、彼は正しいことを言っている。
あなたがIntel CPUの仕様を詳しく知らないだけ。
PAEという仕組みなどで32BITモードでも4GBを超える物理メモリーを扱うことができるようになっていた。
593デフォルトの名無しさん
2020/05/02(土) 01:45:40.91ID:ZXOrLboX PAEが何なのか全く分かってなさそう
594デフォルトの名無しさん
2020/05/02(土) 02:28:22.28ID:2lkgjmOV QZは女なのだろうか。
ショックかも知れないがはっきり言えば、本質的に物事が正確に理解できていないようだ。
ショックかも知れないがはっきり言えば、本質的に物事が正確に理解できていないようだ。
595デフォルトの名無しさん
2020/05/03(日) 09:20:54.04ID:slLa0KBW EMSなら前に聞いたことがある
596デフォルトの名無しさん
2020/05/03(日) 09:24:35.32ID:WVD/IFzz 8bit CPUは256Bしか扱えないと思ってる人いる?
597デフォルトの名無しさん
2020/05/03(日) 09:29:47.71ID:6v/wuiGx 16bitのCPUでも16bitアドレスの最大値である64KBを超えて1MBもアクセスできていたからな。
598デフォルトの名無しさん
2020/05/03(日) 10:03:25.11ID:WVD/IFzz >>594
女なら180度対応を変えます
女なら180度対応を変えます
599デフォルトの名無しさん
2020/05/03(日) 10:22:47.73ID:LxtsyLet >>597
16BIT CPU であった 8086は、16bit アドレスを超える範囲は、セグメントレジスタ
と合わせた seg:ofs の形式の far pointer を使わなくてはならならず、
単純に扱えるのは16BITまでで、16BITを超えた範囲では、seg レジスタの値を
足していかないといけなかった。しかも、segがアドレスの上位16BITだったなら
まだしも、16バイト単位のアドレスだったので、segレジスタに入れる値を計算
するのがとても重くなってしまっていた。
ところが、Z80 などの 8BIT CPUは、普通に 16BIT レジスタの
HL や DE, BC, IX, IY をもっており、8086 と比べれば扱いは容易だった。
その意味では、8086は、メモリーアクセスに関してはZ80と同じくらいしか
能力を持っていなかった。
それで8086の16BITモードでは限界が来て32BITモードのOSが待望された。
そしてMacのGUIを真似た機能を持っていたこととも合わせて32BITモードで
動いたWin95となった。
ただし、このような状況は64BIT化に関しては全く無い。
16BIT CPU であった 8086は、16bit アドレスを超える範囲は、セグメントレジスタ
と合わせた seg:ofs の形式の far pointer を使わなくてはならならず、
単純に扱えるのは16BITまでで、16BITを超えた範囲では、seg レジスタの値を
足していかないといけなかった。しかも、segがアドレスの上位16BITだったなら
まだしも、16バイト単位のアドレスだったので、segレジスタに入れる値を計算
するのがとても重くなってしまっていた。
ところが、Z80 などの 8BIT CPUは、普通に 16BIT レジスタの
HL や DE, BC, IX, IY をもっており、8086 と比べれば扱いは容易だった。
その意味では、8086は、メモリーアクセスに関してはZ80と同じくらいしか
能力を持っていなかった。
それで8086の16BITモードでは限界が来て32BITモードのOSが待望された。
そしてMacのGUIを真似た機能を持っていたこととも合わせて32BITモードで
動いたWin95となった。
ただし、このような状況は64BIT化に関しては全く無い。
600デフォルトの名無しさん
2020/05/03(日) 10:32:19.81ID:6v/wuiGx そりゃまあ、64bitCPUがすでにいきわたっていてOS変えるだけで対応できたからね
WINAPIだって16→32のコンパイルはまず動かないけど32→64なら普通は動く
DOS時代のUMBみたいなみみっちい事態にならなくてよかったじゃん
WINAPIだって16→32のコンパイルはまず動かないけど32→64なら普通は動く
DOS時代のUMBみたいなみみっちい事態にならなくてよかったじゃん
601デフォルトの名無しさん
2020/05/03(日) 10:35:22.17ID:OJMdC3Cv 86用コンパイラでnearとfarの他にhugeが有ると知らず、無限ループ作ってOSごと来なくなったあの頃
602デフォルトの名無しさん
2020/05/03(日) 11:16:28.83ID:WVD/IFzz 結局64bit CPUだと速度4倍のコードは?
603デフォルトの名無しさん
2020/05/03(日) 13:08:16.85ID:m/iHOjCC long longとint64_tの違いってlong longは環境によって64bitじゃなくなるけどint64_tは常に64ってことですか?
604デフォルトの名無しさん
2020/05/03(日) 13:13:36.85ID:LxtsyLet >>603
まあ、そういうこと。
まあ、そういうこと。
605デフォルトの名無しさん
2020/05/03(日) 14:04:07.52ID:slLa0KBW |
| 彡⌒ミ
\ (´・ω・`) またhugeの話してる・・・
(| |)::::
(γ /:::::::
し \:::
\
| 彡⌒ミ
\ (´・ω・`) またhugeの話してる・・・
(| |)::::
(γ /:::::::
し \:::
\
606デフォルトの名無しさん
2020/05/03(日) 14:24:10.29ID:m/iHOjCC >>604
ありがとうございます
ありがとうございます
607デフォルトの名無しさん
2020/05/03(日) 15:56:11.79ID:gvP0MmQx 32bitの環境で32bitの境界を超えるような64bit値の計算ってどうやって実現してるの?
608デフォルトの名無しさん
2020/05/03(日) 16:00:56.90ID:uzK0zokK cpuに命令なければソフト的にやるに決まってんじゃん
609デフォルトの名無しさん
2020/05/03(日) 16:06:34.35ID:uzK0zokK ちなみに32bitの掛け算の答えに64bit必要ってわかってない人多いよね
同様に64bitなら128bit
同様に64bitなら128bit
611デフォルトの名無しさん
2020/05/03(日) 16:54:49.03ID:+PpSUNNp 64bitだとdoubleとかの書き込みはアトミックになるの
612デフォルトの名無しさん
2020/05/03(日) 17:17:29.21ID:VkK7EFZv C/C++にキャリーフラグ観る機能が無いのはなせ?
613デフォルトの名無しさん
2020/05/03(日) 17:56:41.69ID:baOIQvWk アトミックにしたけりゃstd::atomicを使え
使わない場合は保証されない
使わない場合は保証されない
614デフォルトの名無しさん
2020/05/03(日) 18:16:14.79ID:uzK0zokK615デフォルトの名無しさん
2020/05/03(日) 18:19:51.49ID:uzK0zokK >>613
64bitでない環境だとatomic持ち出したところで使えないじゃん
64bitでない環境だとatomic持ち出したところで使えないじゃん
616デフォルトの名無しさん
2020/05/03(日) 18:25:40.26ID:baOIQvWk 使えるぞ
内部でロックするから遅いけど
内部でロックするから遅いけど
617デフォルトの名無しさん
2020/05/03(日) 20:09:19.86ID:7Ft0FuY4 >>598
90度だろ?
90度だろ?
618デフォルトの名無しさん
2020/05/03(日) 20:16:01.21ID:s7MuzCvB モダンc++入門ってどこみたらいい?
619デフォルトの名無しさん
2020/05/03(日) 21:01:49.43ID:0Fr9Yznx cpprefjp
620デフォルトの名無しさん
2020/05/03(日) 22:43:31.73ID:WVD/IFzz621デフォルトの名無しさん
2020/05/03(日) 22:46:00.66ID:WVD/IFzz622デフォルトの名無しさん
2020/05/03(日) 22:52:17.09ID:WVD/IFzz623デフォルトの名無しさん
2020/05/03(日) 22:53:53.78ID:WVD/IFzz624デフォルトの名無しさん
2020/05/04(月) 03:33:26.41ID:BnrivxPo int128でもint256でも自由に型が作れるのがC++の強みなのに書けないってw
625デフォルトの名無しさん
2020/05/04(月) 06:12:26.01ID:/zUHO7E0 int_<256>みたいの作ってたけど
サイズが発散する問題がすぐ起きる
サイズが発散する問題がすぐ起きる
628デフォルトの名無しさん
2020/05/04(月) 07:22:03.70ID:nMCshN11 x86
629デフォルトの名無しさん
2020/05/04(月) 08:03:18.75ID:S2aUUuq2 shared_ptr<Hoge>をvoid *の領域に格納したいのですがどうすればいいでしょうか?
SetPointer(void *),void* GetPointer()で設定します
shared_ptr<Hoge> hoge
として
SetPointer(hoge)
取り出す時
shared_ptr<Hoge> hoge = GetPointer()
SetPointer(void *),void* GetPointer()で設定します
shared_ptr<Hoge> hoge
として
SetPointer(hoge)
取り出す時
shared_ptr<Hoge> hoge = GetPointer()
630デフォルトの名無しさん
2020/05/04(月) 08:04:47.44ID:S2aUUuq2 後、SetPointerする前にshared_ptrの参照カウントを一つ増やしたいです。
631デフォルトの名無しさん
2020/05/04(月) 09:54:06.17ID:Fiop0J3e >>629-630
所有権込みで格納したいだけなら。
SetPointer(new shared_ptr<Hoge>(hoge));
shared_ptr<Hoge> hoge = *static_cast<shared_ptr<Hoge>*>(GetPointer());
あとはどうにか delete が抜けないようにする。
所有権込みで格納したいだけなら。
SetPointer(new shared_ptr<Hoge>(hoge));
shared_ptr<Hoge> hoge = *static_cast<shared_ptr<Hoge>*>(GetPointer());
あとはどうにか delete が抜けないようにする。
632デフォルトの名無しさん
2020/05/04(月) 10:27:13.66ID:aMJtnkBw 本当にshared_ptrごと格納する必要があるの?
これで良かったりはしない?
shared_ptr<Hoge> p(new(buffer) Hoge, [](Hoge* p){p->~Hoge();});
これで良かったりはしない?
shared_ptr<Hoge> p(new(buffer) Hoge, [](Hoge* p){p->~Hoge();});
633デフォルトの名無しさん
2020/05/04(月) 11:04:11.62ID:BnrivxPo つまりshareする気がないけどshared_ptrを使いたいわけだな
634デフォルトの名無しさん
2020/05/04(月) 11:24:26.33ID:7IQ5DE83 誰かと食べる気はないけど、マックのシェアポテトを食べたい感覚だね
635デフォルトの名無しさん
2020/05/04(月) 12:42:16.41ID:S2aUUuq2 >>632
これ難しすぎて解読できません
まず、やりたいことはWindowsのTreeViewでノードを追加するときに、ノードにLPARAM型の任意のデータを関連づけれるんですが、そこに他の関数から受け取ったshared_ptr<Hoge>を関連付けたいのです
shared_ptrごと格納する必要ないと言えばないのかもしれません
でも中身だけ格納すると、deleter?の情報がとんじゃう?
これ難しすぎて解読できません
まず、やりたいことはWindowsのTreeViewでノードを追加するときに、ノードにLPARAM型の任意のデータを関連づけれるんですが、そこに他の関数から受け取ったshared_ptr<Hoge>を関連付けたいのです
shared_ptrごと格納する必要ないと言えばないのかもしれません
でも中身だけ格納すると、deleter?の情報がとんじゃう?
636デフォルトの名無しさん
2020/05/04(月) 12:55:51.13ID:S2aUUuq2 >>631
こっちの方で後で試してみます
こっちの方で後で試してみます
637デフォルトの名無しさん
2020/05/04(月) 13:16:44.39ID:0skWT8b9 なにがしたいのだかいまいちよくわからない
638デフォルトの名無しさん
2020/05/04(月) 13:20:23.37ID:/R09lZ8N 所有したいのか/参照持ちたいだけなのか
shared_ptrとして使う必要があるのか
参照だけ持ちたいとしてダングリングの可能性が有るのか
shared_ptrとして使う必要があるのか
参照だけ持ちたいとしてダングリングの可能性が有るのか
639デフォルトの名無しさん
2020/05/04(月) 13:46:24.04ID:S2aUUuq2 あーあ。shared_ptrごと格納できるならそっちの方がいいです。
そうしないと誰が最後にdeleteするかめんどくさくなりなすね。
すみませんでした
そうしないと誰が最後にdeleteするかめんどくさくなりなすね。
すみませんでした
640デフォルトの名無しさん
2020/05/04(月) 13:47:34.57ID:aMJtnkBw TreeViewが持つのはポインタだけで、オブジェクトの寿命管理するわけじゃないんだろ?
だったらshared_ptrのdeleterの情報なんか渡す必要ないんじゃないか
オブジェクトの寿命管理する奴が知ってればそれでいい
だったらshared_ptrのdeleterの情報なんか渡す必要ないんじゃないか
オブジェクトの寿命管理する奴が知ってればそれでいい
641デフォルトの名無しさん
2020/05/04(月) 13:56:33.16ID:tzWRkvZC642デフォルトの名無しさん
2020/05/04(月) 14:01:15.39ID:S2aUUuq2 すみません。何か頭混乱してきた・・
>>630が余計だったのか・・
まず、基本方針としてオブジェクトの寿命管理を楽にするためにクラス間でデータをやり取りする場合は
全部shared_ptr経由で参照カウントにより自動で管理してもらおうという方針です。
ですが、既存のライブラリとの都合で例えば、今回のTreeViewのノードにはLPARAM型のデータしか関連づけらられない
ということで、ノードに関連づけるときに参照カウント手動で?増やしてあげて、ノードを削除するときに、
参照カウントを手動で減らして?あげて調整するものなのかなぁーと思った次第です。
>>630が余計だったのか・・
まず、基本方針としてオブジェクトの寿命管理を楽にするためにクラス間でデータをやり取りする場合は
全部shared_ptr経由で参照カウントにより自動で管理してもらおうという方針です。
ですが、既存のライブラリとの都合で例えば、今回のTreeViewのノードにはLPARAM型のデータしか関連づけらられない
ということで、ノードに関連づけるときに参照カウント手動で?増やしてあげて、ノードを削除するときに、
参照カウントを手動で減らして?あげて調整するものなのかなぁーと思った次第です。
643デフォルトの名無しさん
2020/05/04(月) 14:02:14.17ID:/R09lZ8N データの本体は別にあってそっちで所有権管理しているなら、treeviewにはshared_ptr::getで得られるpointer持たせればいい
使う側でshared_ptrである必要があるなら、shared_from_this使う
ダングリングする可能性無いならならこれでおk
使う側でshared_ptrである必要があるなら、shared_from_this使う
ダングリングする可能性無いならならこれでおk
644デフォルトの名無しさん
2020/05/04(月) 14:12:18.91ID:aMJtnkBw void*で渡しちゃう以上はTreeViewに参照カウント減らさせるのは不可能なので、そこは外側で管理してやるしかない
だったらTreeViewはshared_ptrがどうのこうのという情報は知らなくていいし、知らせるべきでない
だったらTreeViewはshared_ptrがどうのこうのという情報は知らなくていいし、知らせるべきでない
645デフォルトの名無しさん
2020/05/04(月) 14:19:40.83ID:tzWRkvZC646デフォルトの名無しさん
2020/05/04(月) 14:23:16.16ID:aMJtnkBw647デフォルトの名無しさん
2020/05/04(月) 14:33:47.37ID:tzWRkvZC648デフォルトの名無しさん
2020/05/04(月) 14:47:05.48ID:aMJtnkBw 何が気に食わなくて噛み付いてるのかよくわかんないけど
TreeViewはshared_ptrのことなんか知らないんだから、そんなものは知らせずに
関連のあるデータを与える(要はshared_ptr<Hoge>*じゃなくてHoge*を渡す)方が設計すっきりするんじゃない?
って言ってるだけなんだがそんなにおかしいか?
TreeViewはshared_ptrのことなんか知らないんだから、そんなものは知らせずに
関連のあるデータを与える(要はshared_ptr<Hoge>*じゃなくてHoge*を渡す)方が設計すっきりするんじゃない?
って言ってるだけなんだがそんなにおかしいか?
649デフォルトの名無しさん
2020/05/04(月) 14:51:53.81ID:Zy37Y+hL 何か追加して問題が出て別の何か追加して解決するの繰り返し
C++の仕様は余計なものが多い
メモリーの所有権の移動とかの暗黙知の極みを気にできるくらいならdelete忘れることはないだろうに
C++の仕様は余計なものが多い
メモリーの所有権の移動とかの暗黙知の極みを気にできるくらいならdelete忘れることはないだろうに
650デフォルトの名無しさん
2020/05/04(月) 14:57:19.53ID:Fiop0J3e Hoge* 渡して済むなら最初から相談なんて発生しないだろうと思ってたんだけど、
>642 みたいな「基本方針」だと shared_ptr の必要性が胡散臭いんで、確かに
Hoge* で済む可能性もありそうな気がしてきた。
>642 みたいな「基本方針」だと shared_ptr の必要性が胡散臭いんで、確かに
Hoge* で済む可能性もありそうな気がしてきた。
651デフォルトの名無しさん
2020/05/04(月) 15:00:15.13ID:tzWRkvZC652デフォルトの名無しさん
2020/05/04(月) 15:10:46.19ID:S2aUUuq2 >Hoge* 渡して済むなら最初から相談なんて発生しないだろう
そうです。Hoge*で渡したくないから質問した次第です。
元のデータが先に捨てられようと、先にTreeViewのノードが破棄されようと、どっちが先でも
OKなように、それらを意識しないようになるべく参照カウントの仕組みで破棄したかったわけです。
そうです。Hoge*で渡したくないから質問した次第です。
元のデータが先に捨てられようと、先にTreeViewのノードが破棄されようと、どっちが先でも
OKなように、それらを意識しないようになるべく参照カウントの仕組みで破棄したかったわけです。
653デフォルトの名無しさん
2020/05/04(月) 15:22:06.17ID:aMJtnkBw だったら>>631も、結局TreeViewの破棄を監視して破棄前にdelete GetPointer()かけないといけないんだけど
それでもいいのか?本当に意識すべきことは減ってるのか?無用な複雑さを持ち込んでるだけじゃないのか?
っていうことを一回冷静に考えた方がいいよ
それでもいいのか?本当に意識すべきことは減ってるのか?無用な複雑さを持ち込んでるだけじゃないのか?
っていうことを一回冷静に考えた方がいいよ
654デフォルトの名無しさん
2020/05/04(月) 15:23:27.04ID:Zy37Y+hL 逆にHoge*で受け取って、
Tree破棄時にPointer破棄処理省いてしまって、
あとはsharedのスコープで全消しすればいい
もちろんノード追加時に参照カウンタ増やす必要もない
Tree破棄時にPointer破棄処理省いてしまって、
あとはsharedのスコープで全消しすればいい
もちろんノード追加時に参照カウンタ増やす必要もない
655デフォルトの名無しさん
2020/05/04(月) 15:24:48.96ID:S2aUUuq2656デフォルトの名無しさん
2020/05/04(月) 15:44:09.03ID:S2aUUuq2 前調べたら
https://docs.microsoft.com/en-us/windows/win32/controls/tvn-deleteitem
ノード削除時に発生するイベントがあるので、ここ1か所にかくだけでいいのかなと
思ったので、その方が分かりやすいかなと思った次第です
てか、この方法駄目そうですね?
>delete GetPointer()
じゃなくて、参照カウントを減らしたいんですけど、無理っぽいのかな・・
COMならAddRef,Releaseで調整できるんですけど
もうちょっと調べて駄目そうならHoge*でいきます
https://docs.microsoft.com/en-us/windows/win32/controls/tvn-deleteitem
ノード削除時に発生するイベントがあるので、ここ1か所にかくだけでいいのかなと
思ったので、その方が分かりやすいかなと思った次第です
てか、この方法駄目そうですね?
>delete GetPointer()
じゃなくて、参照カウントを減らしたいんですけど、無理っぽいのかな・・
COMならAddRef,Releaseで調整できるんですけど
もうちょっと調べて駄目そうならHoge*でいきます
657デフォルトの名無しさん
2020/05/04(月) 15:54:22.23ID:Fiop0J3e658デフォルトの名無しさん
2020/05/04(月) 16:04:26.16ID:aMJtnkBw そもそもTreeViewってViewだから見た目を整えるための奴でしょ
自分ならロジックデータの寿命管理にそんな奴参加させたくないな
まあ、削除時のコールバックが指定できるんだったら、それで後始末するのも手ではあるかもね
小さいプログラムで、見た目の要素の何かとHogeが論理的に一対一対応してるんだったら許容範囲かな
自分ならロジックデータの寿命管理にそんな奴参加させたくないな
まあ、削除時のコールバックが指定できるんだったら、それで後始末するのも手ではあるかもね
小さいプログラムで、見た目の要素の何かとHogeが論理的に一対一対応してるんだったら許容範囲かな
659デフォルトの名無しさん
2020/05/04(月) 16:11:26.04ID:tzWRkvZC >>653
質問者はクラス間で共有するデータは一律shared_ptrにすると言っている
これは全体設計の選択としてまぁある話
しかしこれによって既存コンポーネントのTreeViewで
インタフェースのミスマッチが起こった、さてどうしたらいいでしょう?
という質問なわけ
これもよくある問題
だからって全体設計のポリシーをとりやめようとはならのよ
解決できる手段があるなら部分的な問題は個別に解決したらそれでいい
質問者はクラス間で共有するデータは一律shared_ptrにすると言っている
これは全体設計の選択としてまぁある話
しかしこれによって既存コンポーネントのTreeViewで
インタフェースのミスマッチが起こった、さてどうしたらいいでしょう?
という質問なわけ
これもよくある問題
だからって全体設計のポリシーをとりやめようとはならのよ
解決できる手段があるなら部分的な問題は個別に解決したらそれでいい
660デフォルトの名無しさん
2020/05/04(月) 16:29:01.02ID:aMJtnkBw >>659
言ってることは分かるけど
それでどうしてTreeViewにshared_ptrを埋め込むことに固執するのかがわからない
そこはおとなしくTreeViewには生ポで参照してもらうっていうのも一つの「部分的な問題の個別解決」じゃないの?
言ってることは分かるけど
それでどうしてTreeViewにshared_ptrを埋め込むことに固執するのかがわからない
そこはおとなしくTreeViewには生ポで参照してもらうっていうのも一つの「部分的な問題の個別解決」じゃないの?
661デフォルトの名無しさん
2020/05/04(月) 16:58:42.06ID:b5BOjBYY Linux でのライブラリについて質問があります。
静的リンクライブラリ(拡張子が.aのファイル)は複数のオブジェクトファイル(拡張子が.oのファイル)を ar コマンドでアーカイブしたものと理解しています。
一方自分で調べた限り、動的リンクライブラリ(拡張子が.soのファイル)を作る場合には gcc を用いる場合は-shared (と-fPIC )を指定して一つのソースファイルから一つの.soファイルを作成しているように思います。
例: g++ -shared -fPIC -o sample.so sample.cpp
この理解の上で質問です。
動的リンクライブラリは静的リンクライブラリのように一つのファイルにまとめられないのでしょうか?ソースの数だけ.soファイルが出きてしまうのは避けられないのでしょうか?
静的リンクライブラリ(拡張子が.aのファイル)は複数のオブジェクトファイル(拡張子が.oのファイル)を ar コマンドでアーカイブしたものと理解しています。
一方自分で調べた限り、動的リンクライブラリ(拡張子が.soのファイル)を作る場合には gcc を用いる場合は-shared (と-fPIC )を指定して一つのソースファイルから一つの.soファイルを作成しているように思います。
例: g++ -shared -fPIC -o sample.so sample.cpp
この理解の上で質問です。
動的リンクライブラリは静的リンクライブラリのように一つのファイルにまとめられないのでしょうか?ソースの数だけ.soファイルが出きてしまうのは避けられないのでしょうか?
662デフォルトの名無しさん
2020/05/04(月) 17:07:30.46ID:aMJtnkBw 単に.oを複数与えればいいんじゃないの?
何か問題あったっけ
何か問題あったっけ
663デフォルトの名無しさん
2020/05/04(月) 17:11:45.42ID:mcNTUyFW664デフォルトの名無しさん
2020/05/04(月) 17:12:19.55ID:heXhx7kW >>628
ちょっx86やx64でアトミックに読み書きできる(バスサイクルが他コアに割り込まれない)ことが保証されているのは
32 bitまででしかも32 bit境界に整列している場合のみのでは…
ちなdoubleは64 bit
ちょっx86やx64でアトミックに読み書きできる(バスサイクルが他コアに割り込まれない)ことが保証されているのは
32 bitまででしかも32 bit境界に整列している場合のみのでは…
ちなdoubleは64 bit
665デフォルトの名無しさん
2020/05/04(月) 17:30:50.31ID:b5BOjBYY666デフォルトの名無しさん
2020/05/04(月) 18:05:00.17ID:hwmiGMKy667デフォルトの名無しさん
2020/05/04(月) 18:43:33.39ID:wRQD0Fqh wandbox上だとatomic<double>はロックフリーらしい、多分x86-64環境なら同じ
https://wandbox.org/permlink/0LWMsNPNmSn6rpZ4
https://wandbox.org/permlink/0LWMsNPNmSn6rpZ4
668デフォルトの名無しさん
2020/05/04(月) 18:54:28.70ID:heXhx7kW >>666
>64bit境界であることは必須
ハア(゚Д゚)?
ていうことは
char *p = 〜;
*p = 'a';
は、pが8の倍数でなければ非アトミック??
short *q = 〜;
*q = 123;
もまた、qが8の倍数でなければ非アトミック???
なんと?!
>64bit境界であることは必須
ハア(゚Д゚)?
ていうことは
char *p = 〜;
*p = 'a';
は、pが8の倍数でなければ非アトミック??
short *q = 〜;
*q = 123;
もまた、qが8の倍数でなければ非アトミック???
なんと?!
669デフォルトの名無しさん
2020/05/04(月) 18:56:20.07ID:/R09lZ8N doubleの話をcharに拡大して何がしたいのか
670デフォルトの名無しさん
2020/05/04(月) 18:57:04.84ID:aRLx0l42 アスペは文脈が読めない
671デフォルトの名無しさん
2020/05/04(月) 19:00:17.65ID:aMJtnkBw shortだって64bit境界跨いでたら非アトミックだぞ
わざわざ作らなければそんなことにならないだろうけど
わざわざ作らなければそんなことにならないだろうけど
672デフォルトの名無しさん
2020/05/04(月) 19:06:17.15ID:heXhx7kW つかインテルアーキテクチャーのソフトウェアーデベロッパーズマニュアルによると
「8.1.1 Guaranteed Atomic Operations」
に書いてあったわサーセン;;;;
「8.1.1 Guaranteed Atomic Operations」
に書いてあったわサーセン;;;;
673デフォルトの名無しさん
2020/05/04(月) 19:09:35.51ID:heXhx7kW The Intel486 processor (and newer processors since) guarantees:
- Reading or writing a byte
- Reading or writing a word aligned on a 16-bit boundary
- Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees:
- Reading or writing a quadword aligned on a 64-bit boundary
- 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee:
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
とのことなので「The Pentium processor (and newer processors since) 」ならおk
- Reading or writing a byte
- Reading or writing a word aligned on a 16-bit boundary
- Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees:
- Reading or writing a quadword aligned on a 64-bit boundary
- 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee:
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
とのことなので「The Pentium processor (and newer processors since) 」ならおk
674デフォルトの名無しさん
2020/05/04(月) 19:15:43.74ID:heXhx7kW で、「The P6 family processors (and newer processors since) 」において
キャッシュラインを跨ぐとatomicが保証されない旨がその下に書かれているので、
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
は妄信はできん
やっぱalignedな場合しか信用できん
キャッシュラインを跨ぐとatomicが保証されない旨がその下に書かれているので、
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
は妄信はできん
やっぱalignedな場合しか信用できん
675デフォルトの名無しさん
2020/05/04(月) 19:18:59.34ID:/R09lZ8N まあ今時のプロセッサだとキャッシュライン単位でしかdramアクセスしないからそうなるのが自然なんだよね
676デフォルトの名無しさん
2020/05/04(月) 20:44:57.79ID:Aib9AjJN こういう非常時でも特に誰かがプログラムで社会貢献してるとは聞かないな
677デフォルトの名無しさん
2020/05/05(火) 05:46:34.77ID:EU5dGh0t アングル:コロナ感染経路、スマホ使った「接触追跡」の最前線
https://jp.reuters.com/article/health-coronavirus-tracing-idJPKCN21X0LE
つかビッグデータ取り扱い系分野は災害時に地味に活躍している印象
ホンダとか東日本大震災翌日からインターナビで収集した情報で被災地の道路寸断マップを
作って公開したんだったと思った(記憶モード
https://www.honda.co.jp/news/2011/4111109.html
https://jp.reuters.com/article/health-coronavirus-tracing-idJPKCN21X0LE
つかビッグデータ取り扱い系分野は災害時に地味に活躍している印象
ホンダとか東日本大震災翌日からインターナビで収集した情報で被災地の道路寸断マップを
作って公開したんだったと思った(記憶モード
https://www.honda.co.jp/news/2011/4111109.html
678デフォルトの名無しさん
2020/05/05(火) 07:41:06.24ID:NyxHUKM5 ビッグデータを公開してくれれば誰か作るんじゃね
679デフォルトの名無しさん
2020/05/05(火) 07:46:04.08ID:pSJxQCb1680デフォルトの名無しさん
2020/05/06(水) 11:06:32.37ID:lE4/XlkX >>611
その変の話は詳しくないので分からないのですが、この質問は、マルチコアやマルチCPUでの話ですか。
前から、その辺は、CriticalSection()などで排他処理すれば問題ないのではないかと思っていたのですが、その変どうなんでしょう?
それとも、自作OSなどで、 CriticalSection()のようなものを自作する場合の話でしょうか?
ちなみに、xor xchg などの話はよく理解できてません。
これらは、複数のCPUが1つのフラグを同時に読み書きした場合の問題なんでしょうか。
その変の話は詳しくないので分からないのですが、この質問は、マルチコアやマルチCPUでの話ですか。
前から、その辺は、CriticalSection()などで排他処理すれば問題ないのではないかと思っていたのですが、その変どうなんでしょう?
それとも、自作OSなどで、 CriticalSection()のようなものを自作する場合の話でしょうか?
ちなみに、xor xchg などの話はよく理解できてません。
これらは、複数のCPUが1つのフラグを同時に読み書きした場合の問題なんでしょうか。
681デフォルトの名無しさん
2020/05/06(水) 11:15:03.91ID:lE4/XlkX >>680
マルチCPUなどの場合は、キャッシュの同期(?)も関係してくるので、
そもそも何を持って「atomic」かどうかということが疑問になってきます。
キャッシュの内側で、CPUが、atomicにキャッシュに書きこんだつもりで
あっても、他の CPU のキャッシュに反映されない可能性があるので意味が
ないように思えます。
となれば、キャッシュ制御まで含めて考えないといけません。
キャッシュも、1次キャッシュ、2次キャッシュ、データ用キャッシュ、
コード用キャッシュ、パイプライン、などものすごく複雑になっているので、
果たしてそういうようなものを含めて「atomic」という言葉ですべてを語ることが
出来るのかどうかも疑問です。
マルチCPUなどの場合は、キャッシュの同期(?)も関係してくるので、
そもそも何を持って「atomic」かどうかということが疑問になってきます。
キャッシュの内側で、CPUが、atomicにキャッシュに書きこんだつもりで
あっても、他の CPU のキャッシュに反映されない可能性があるので意味が
ないように思えます。
となれば、キャッシュ制御まで含めて考えないといけません。
キャッシュも、1次キャッシュ、2次キャッシュ、データ用キャッシュ、
コード用キャッシュ、パイプライン、などものすごく複雑になっているので、
果たしてそういうようなものを含めて「atomic」という言葉ですべてを語ることが
出来るのかどうかも疑問です。
682デフォルトの名無しさん
2020/05/06(水) 11:18:02.52ID:q6Rk1GB6 自演かと思ったらレス繋いでるだけか
紛らわしい
紛らわしい
683はちみつ餃子 ◆8X2XSCHEME
2020/05/06(水) 11:26:57.76ID:exILxtx0684デフォルトの名無しさん
2020/05/06(水) 12:03:09.47ID:+O5RjP+P >>611の意味は
読み書きの途中で他のCPUやコア、スレッドが別の処理を行う事で一貫性が無くなる事は無いということ
例えばatomicでないと
64bitの一部を書き込んだところで
他のスレッドが値を読んでしまって
64bit全体としてあり得ない値になる
というような事が起こらない
というだけ
同期とか他の読み書きとの順番とか
そういう事はatomicは何も保証しない
読み書きの途中で他のCPUやコア、スレッドが別の処理を行う事で一貫性が無くなる事は無いということ
例えばatomicでないと
64bitの一部を書き込んだところで
他のスレッドが値を読んでしまって
64bit全体としてあり得ない値になる
というような事が起こらない
というだけ
同期とか他の読み書きとの順番とか
そういう事はatomicは何も保証しない
685はちみつ餃子 ◆8X2XSCHEME
2020/05/06(水) 12:24:44.67ID:exILxtx0 データベースとかで言う Atomicity と同じやね。
686デフォルトの名無しさん
2020/05/06(水) 14:18:32.19ID:lE4/XlkX687デフォルトの名無しさん
2020/05/06(水) 14:20:11.10ID:lE4/XlkX OSカーネルの実装以外では、命令自体の atomic 性に期待するのではなくて、
ちゃんと、OS が用意している API や system call を使って、CriticalSection
的なブロックを作って、その中で読み書きするのが基本ではないですかね。
ちゃんと、OS が用意している API や system call を使って、CriticalSection
的なブロックを作って、その中で読み書きするのが基本ではないですかね。
688デフォルトの名無しさん
2020/05/06(水) 14:25:21.35ID:E/8R3YZo689デフォルトの名無しさん
2020/05/06(水) 14:39:37.52ID:lE4/XlkX MotherBoard上にもキャッシュがありますし、マルチコアではなく、マルチCPUの
環境だと、いくらCPUがatomicに書いているつもりでも、バスでつながっている
他のCPUのキャッシュには反映されていない可能性もあるのではないでしょうか。
環境だと、いくらCPUがatomicに書いているつもりでも、バスでつながっている
他のCPUのキャッシュには反映されていない可能性もあるのではないでしょうか。
690デフォルトの名無しさん
2020/05/06(水) 14:47:57.71ID:E/8R3YZo691デフォルトの名無しさん
2020/05/06(水) 14:50:55.17ID:E/8R3YZo お前のバカなところはてめぇの無知を自覚せずに
atomicは不要というぶったぎり論を始めたところだ
もしいい年したおっさんなら芽がない
atomicは不要というぶったぎり論を始めたところだ
もしいい年したおっさんなら芽がない
693デフォルトの名無しさん
2020/05/06(水) 15:28:47.16ID:dxwAL6rC >>691
そんなに物知りなら、こんなところで聞かずにIntelマニュアルでも調べたら分かることじゃないか。
そんなに物知りなら、こんなところで聞かずにIntelマニュアルでも調べたら分かることじゃないか。
694デフォルトの名無しさん
2020/05/06(水) 15:32:15.22ID:dxwAL6rC はっきり言って、ここで double 値への書き込み atomic だなんて言ってる人の言うことはどこまで信用できるか分からん。
x86 CPU的には、xchg命令など一部の命令を除いてはそんなことは保障されてるかどうか定かではない。
x86 CPU的には、xchg命令など一部の命令を除いてはそんなことは保障されてるかどうか定かではない。
695デフォルトの名無しさん
2020/05/06(水) 15:40:04.68ID:g1nQsgpd696デフォルトの名無しさん
2020/05/06(水) 16:04:50.82ID:dxwAL6rC lock prefix は、mov 命令には付けられないがな。
697デフォルトの名無しさん
2020/05/06(水) 16:15:13.22ID:zSUZ9nVL データ競合と競合状態ごっちゃにしてない?
698デフォルトの名無しさん
2020/05/06(水) 16:36:19.56ID:DK2U3wBE アトミックはいわゆるout of thin airな値の発生を防ぐためのもの
それ以上でもそれ以下でもない
それ以上でもそれ以下でもない
699デフォルトの名無しさん
2020/05/06(水) 16:50:28.87ID:8YawtAIF std::atomic の意味付けとごっちゃになるから、「割り込み不可」「不可分」あたりと使い分けてほしいなぁ。
700デフォルトの名無しさん
2020/05/06(水) 17:03:54.41ID:dxwAL6rC もしかして、
double g_dbl[1024];
に対して、何かの値を足すような動作を、2つ以上のスレッドで
分担して行うことで高速化しようとしているのか?
そんなやり方は、マルチスレッドプログラミングでやっていいのだろうか。
普通は、要素番号 0〜511 までをスレッド1が、512〜1023 までをスレッド2
が計算して高速化する。
全く同じ場所に複数のスレッドが書きこむことは原則としてやらないはずだ。
double g_dbl[1024];
に対して、何かの値を足すような動作を、2つ以上のスレッドで
分担して行うことで高速化しようとしているのか?
そんなやり方は、マルチスレッドプログラミングでやっていいのだろうか。
普通は、要素番号 0〜511 までをスレッド1が、512〜1023 までをスレッド2
が計算して高速化する。
全く同じ場所に複数のスレッドが書きこむことは原則としてやらないはずだ。
701デフォルトの名無しさん
2020/05/06(水) 17:08:11.44ID:dxwAL6rC >>701
GPGPUを使ったレイトレーシングでも、画面上の別のピクセルをそれぞれのコアが
計算するのが原則で、1つのピクセルを複数のコアが分担して計算するには、それなりの
工夫がいる。
工夫というのは、途中までは別のワーキングエリアに書きこんでおいて、最後に
その結果を基本的にシングルコアで足し合わせて最終結果とするようなことだ。
これだと、例えば、途中の計算を double型で行うとしても、doubleへの書き込みが
atomicであることは特に必要ない。
GPGPUを使ったレイトレーシングでも、画面上の別のピクセルをそれぞれのコアが
計算するのが原則で、1つのピクセルを複数のコアが分担して計算するには、それなりの
工夫がいる。
工夫というのは、途中までは別のワーキングエリアに書きこんでおいて、最後に
その結果を基本的にシングルコアで足し合わせて最終結果とするようなことだ。
これだと、例えば、途中の計算を double型で行うとしても、doubleへの書き込みが
atomicであることは特に必要ない。
702デフォルトの名無しさん
2020/05/06(水) 17:11:26.13ID:E/8R3YZo703デフォルトの名無しさん
2020/05/06(水) 17:14:17.87ID:dxwAL6rC 気になったのは、「atomic」というコンピュータサイエンスで用いられている
言葉を >>611 のように実際のCPUで出来ているかどうか質問していること。
IntelのCPUマニュアルでは、atomicという言葉は使わずに、#LOCK PINアサート
が立つかどうかや、キャッシュコヒーレンシー、といった言葉で説明されている。
「atomic」という言葉は、キャッシュなどが「無いものとして分かり易く」
理解するには有効であるが、実際のCPUではキャッシュの一貫性や、PCIバス規格
と絡んだ詳細な説明が必要となる。
何を持って「atomic」というか、という問題が起きるからだ。
言葉を >>611 のように実際のCPUで出来ているかどうか質問していること。
IntelのCPUマニュアルでは、atomicという言葉は使わずに、#LOCK PINアサート
が立つかどうかや、キャッシュコヒーレンシー、といった言葉で説明されている。
「atomic」という言葉は、キャッシュなどが「無いものとして分かり易く」
理解するには有効であるが、実際のCPUではキャッシュの一貫性や、PCIバス規格
と絡んだ詳細な説明が必要となる。
何を持って「atomic」というか、という問題が起きるからだ。
704デフォルトの名無しさん
2020/05/06(水) 17:18:53.44ID:dxwAL6rC >>702
movも、実際のCPUでは必ずしもatomicとは限らない。
まず、alignment 境界を跨いででいるような場合や、
物理的に複数のCPUがマザーボード上にある場合のキャッシュの一貫性の問題が
あるから。
Intelの最適化マニュアルなどで、マルチコア並列化の例として上がってないような
方法は、勝手にやると破綻するかもしれない。
実機で実験してやるのは自由だが、他の人のCPUでは誤動作するのは覚悟した方がいい。
「アメリカ人は、書いてないものを勝手に使ったあなたが悪い」
という思想だぞ。
movも、実際のCPUでは必ずしもatomicとは限らない。
まず、alignment 境界を跨いででいるような場合や、
物理的に複数のCPUがマザーボード上にある場合のキャッシュの一貫性の問題が
あるから。
Intelの最適化マニュアルなどで、マルチコア並列化の例として上がってないような
方法は、勝手にやると破綻するかもしれない。
実機で実験してやるのは自由だが、他の人のCPUでは誤動作するのは覚悟した方がいい。
「アメリカ人は、書いてないものを勝手に使ったあなたが悪い」
という思想だぞ。
705デフォルトの名無しさん
2020/05/06(水) 17:31:25.73ID:E/8R3YZo >>704
マニュアルに安全な具体例として載ってないから疑ってるって話ね
ご自由にどうぞ
でもそれはあくまでお前の判断
メジャーコンパイラがintelのサポートうけてないとは思えないから
おれはコンパイラの出力眺めてみるけどね
マニュアルに安全な具体例として載ってないから疑ってるって話ね
ご自由にどうぞ
でもそれはあくまでお前の判断
メジャーコンパイラがintelのサポートうけてないとは思えないから
おれはコンパイラの出力眺めてみるけどね
706デフォルトの名無しさん
2020/05/06(水) 17:39:01.96ID:dxwAL6rC707デフォルトの名無しさん
2020/05/06(水) 17:49:26.97ID:+O5RjP+P708デフォルトの名無しさん
2020/05/06(水) 17:51:54.81ID:+O5RjP+P 色々な理由でやむを得ず使う上級者の技を
素人がまねしなくて良い
素人がまねしなくて良い
709デフォルトの名無しさん
2020/05/06(水) 17:57:11.74ID:E/8R3YZo >>706
ちなみにメジャーコンパイラが
std::atomic<double> & std::memory_order::relaxed
をどう展開するか知ってるんだよね?
これを疑ったらコンパイラを自作するしかないんでは?
ちなみにメジャーコンパイラが
std::atomic<double> & std::memory_order::relaxed
をどう展開するか知ってるんだよね?
これを疑ったらコンパイラを自作するしかないんでは?
710デフォルトの名無しさん
2020/05/06(水) 18:31:40.49ID:dxwAL6rC711デフォルトの名無しさん
2020/05/06(水) 18:56:13.77ID:E/8R3YZo712デフォルトの名無しさん
2020/05/06(水) 18:57:46.10ID:dxwAL6rC >>711
だったらそれでいいじゃない。
だったらそれでいいじゃない。
713デフォルトの名無しさん
2020/05/06(水) 19:17:44.45ID:E/8R3YZo714デフォルトの名無しさん
2020/05/06(水) 19:18:48.57ID:dlDgLyfe ちょっ(キャッシュの)一貫性とアトミック(なアクセス)は別概念なのでは…
後者はあくまで>>664の括弧内の意味
一貫性が保証されている単一キャッシュライン内のデータに対するアクセスでも
アトミックでないケースが理論上はありえる
後者はあくまで>>664の括弧内の意味
一貫性が保証されている単一キャッシュライン内のデータに対するアクセスでも
アトミックでないケースが理論上はありえる
715デフォルトの名無しさん
2020/05/06(水) 19:19:22.45ID:ZjhSP/3u なんで揉めてんだか訳わかんね
716デフォルトの名無しさん
2020/05/06(水) 19:21:46.08ID:dlDgLyfe つか同一キャッシュラインに乗っているからといって
配列アクセスは非アトミック、
配列アクセスは非アトミック、
717デフォルトの名無しさん
2020/05/06(水) 19:23:51.44ID:dlDgLyfe718デフォルトの名無しさん
2020/05/06(水) 19:44:30.16ID:6g3bWVkt C++でdoubleで同期取ろうとしてることすら意味不明なんだがキミたちは結局何がしたいんだい?
処理系依存するものはOSの同期を使えよ。
処理系依存するものはOSの同期を使えよ。
719デフォルトの名無しさん
2020/05/06(水) 19:47:35.61ID:S060FgXU720デフォルトの名無しさん
2020/05/06(水) 19:48:49.83ID:kak2WxQU 同期がめっちゃ遅いから困ってんだってよ
721デフォルトの名無しさん
2020/05/06(水) 19:55:48.41ID:6g3bWVkt 同期は遅くて当たり前だろ。
並列化したら速くなるとか同期コスト知らないIT音痴の妄想なんだから。
処理系依存していいならIntelのTSX試せよ。
並列化したら速くなるとか同期コスト知らないIT音痴の妄想なんだから。
処理系依存していいならIntelのTSX試せよ。
722デフォルトの名無しさん
2020/05/06(水) 19:58:00.21ID:DK2U3wBE 同期を速くするのは無理だぞ
高速化したければ同期を減らすんだぞ
高速化したければ同期を減らすんだぞ
723デフォルトの名無しさん
2020/05/06(水) 20:12:52.44ID:E/8R3YZo724843
2020/05/06(水) 21:51:51.19ID:U6CLxvSb Atomicの話と同期の話の区別も宜しくねw
725デフォルトの名無しさん
2020/05/06(水) 22:20:21.87ID:+O5RjP+P726デフォルトの名無しさん
2020/05/07(木) 00:01:22.08ID:hoUWiCnf 同期をとればatomicである必要はない
そういうことじゃないのか
そういうことじゃないのか
727デフォルトの名無しさん
2020/05/07(木) 00:24:54.15ID:N8w6+mz8 話をまとめるとこうなる。
・8byteの読み書き命令がatomicかどうかは処理系依存する話でC++の話ではない。スレチだが聞くならチップを指定して聞け。チップ仕様見れば答えは出る。議論の余地はない。
・8byteの読み書きを同期したい、atomicにしたい。OSの同期か適当な同期ライブラリ使え。悩む余地なし。
・atomicと同期は話は別だ →ありえないw ハードでatomic命令の実装に同期が必要だし、ソフトの同期処理の実装にCPUのatomic命令を使う。atomicの実装を知りたければVHDLスレにでも行け。
・馬鹿は同期を理解できない←30年前から言われてる名言。C++スレでdoubleがatomicかというアホ質問自体が証左。
・8byteの読み書き命令がatomicかどうかは処理系依存する話でC++の話ではない。スレチだが聞くならチップを指定して聞け。チップ仕様見れば答えは出る。議論の余地はない。
・8byteの読み書きを同期したい、atomicにしたい。OSの同期か適当な同期ライブラリ使え。悩む余地なし。
・atomicと同期は話は別だ →ありえないw ハードでatomic命令の実装に同期が必要だし、ソフトの同期処理の実装にCPUのatomic命令を使う。atomicの実装を知りたければVHDLスレにでも行け。
・馬鹿は同期を理解できない←30年前から言われてる名言。C++スレでdoubleがatomicかというアホ質問自体が証左。
728デフォルトの名無しさん
2020/05/07(木) 01:03:56.90ID:M+iqUPlL EOF
729デフォルトの名無しさん
2020/05/07(木) 01:11:02.02ID:0pZrsm5h >>719
なんだ、そこにそのまま書いてあるじゃない。
つまり、alignされているなら quadword は atomically に Read/Write できる。
キャッシュラインの中に納まっているなら align されてなくても OK、と。
8.1.1 Guaranteed Atomic Operations
The Intel486 processor (and newer processors since) guarantees that
the following basic memory operations will
always be carried out atomically:
・Reading or writing a byte
・Reading or writing a word aligned on a 16-bit boundary
・Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees that
the following additional memory operations will always be carried out
atomically:
・Reading or writing a quadword aligned on a 64-bit boundary 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee that the following additional memory operation will always be carried out atomically:
・Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line.
なんだ、そこにそのまま書いてあるじゃない。
つまり、alignされているなら quadword は atomically に Read/Write できる。
キャッシュラインの中に納まっているなら align されてなくても OK、と。
8.1.1 Guaranteed Atomic Operations
The Intel486 processor (and newer processors since) guarantees that
the following basic memory operations will
always be carried out atomically:
・Reading or writing a byte
・Reading or writing a word aligned on a 16-bit boundary
・Reading or writing a doubleword aligned on a 32-bit boundary
The Pentium processor (and newer processors since) guarantees that
the following additional memory operations will always be carried out
atomically:
・Reading or writing a quadword aligned on a 64-bit boundary 16-bit accesses to uncached memory locations that fit within a 32-bit data bus
The P6 family processors (and newer processors since) guarantee that the following additional memory operation will always be carried out atomically:
・Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line.
730デフォルトの名無しさん
2020/05/07(木) 06:07:03.34ID:cLsDnrKi731デフォルトの名無しさん
2020/05/07(木) 06:35:21.80ID:N8w6+mz8 その486の話でいうと、当時、486は自己書き換えコードを駆逐した。Prefetchされたコードは非同期のまま実行されたからだ。Prefetchされたものはメモリではないと言い訳してもPGはそうは思ってないのだから高速なCPUだけ動かないコードがいっぱいあったわけだ。
結局、Intelが折れたのかPenから正しく同期されるようになった。TSXといいIntelも結構やらかしてるし、PICじゃ今でも同期エラッタてんこ盛り。MIPSの実装なんて言わずもがな。
結局、Intelが折れたのかPenから正しく同期されるようになった。TSXといいIntelも結構やらかしてるし、PICじゃ今でも同期エラッタてんこ盛り。MIPSの実装なんて言わずもがな。
732デフォルトの名無しさん
2020/05/07(木) 06:52:28.04ID:Xvq6sZ7Q 同期って用語の使い方に違和感があるなあ
734デフォルトの名無しさん
2020/05/07(木) 08:02:12.59ID:wkYaXeHy 8086時代は結構あった
古いコードのおもりをさせられた人は苦痛だったろうね
今よりはるかにパズルコードが多かったし
古いコードのおもりをさせられた人は苦痛だったろうね
今よりはるかにパズルコードが多かったし
735デフォルトの名無しさん
2020/05/07(木) 08:27:36.65ID:N8w6+mz8 >>730
atomic命令=排他制御(同期処理)された命令。同義。
doubleアクセスがatomicか知りたい=double値で同期したいと解釈するのは普通じゃないかな。
まぁatomicであろうとなかろうと、C/C++的にはOSの同期オブジェクト使えって結論になるわな。
マルチスレッドの再現性ないバグの99%は同期のおれおれ実装が原因だし。
atomic命令=排他制御(同期処理)された命令。同義。
doubleアクセスがatomicか知りたい=double値で同期したいと解釈するのは普通じゃないかな。
まぁatomicであろうとなかろうと、C/C++的にはOSの同期オブジェクト使えって結論になるわな。
マルチスレッドの再現性ないバグの99%は同期のおれおれ実装が原因だし。
736843
2020/05/07(木) 09:26:23.94ID:rgMcdocw アトミックと排他制御と同期処理って同じじゃねーぞ
doubleでアトミックと言うのは例えば
double d = 1.23;
…
d = 2.34;
ってやった時にdが1.23と2.34以外の値にならない事を言う
どっちの値になるかまでを保証するわけじゃない
doubleでアトミックと言うのは例えば
double d = 1.23;
…
d = 2.34;
ってやった時にdが1.23と2.34以外の値にならない事を言う
どっちの値になるかまでを保証するわけじゃない
737デフォルトの名無しさん
2020/05/07(木) 09:34:04.25ID:qJNaSSxu 何に基づいた主張なのかわからない
論拠も書くべき
論拠も書くべき
738デフォルトの名無しさん
2020/05/07(木) 09:50:51.36ID:N8w6+mz8739デフォルトの名無しさん
2020/05/07(木) 09:53:56.60ID:Uptrp4d8740843
2020/05/07(木) 10:01:49.95ID:EiluKhsY741デフォルトの名無しさん
2020/05/07(木) 10:21:20.74ID:N8w6+mz8 >>739
単発IDのくせにいなきり「お前」かよ。GWはほんと口の聞き方も知らないリアルクズ野郎ばかりだな。
おまえのような礼儀も知らず妄想しかできない低能クズに寛容なるおれ様が特別に教えてやろう。
違いますよ^^ 礼儀を知らない馬鹿は二度とおれにレスすんなw
単発IDのくせにいなきり「お前」かよ。GWはほんと口の聞き方も知らないリアルクズ野郎ばかりだな。
おまえのような礼儀も知らず妄想しかできない低能クズに寛容なるおれ様が特別に教えてやろう。
違いますよ^^ 礼儀を知らない馬鹿は二度とおれにレスすんなw
742デフォルトの名無しさん
2020/05/07(木) 10:32:16.12ID:PvsEcGe8 同期とアトミックと排他制御が同じとは
ヤバいのがいるなこのスレ
ソフトウェアの基礎を学んだ方が良い
ヤバいのがいるなこのスレ
ソフトウェアの基礎を学んだ方が良い
743デフォルトの名無しさん
2020/05/07(木) 10:36:17.88ID:0pZrsm5h 個人的に並列化処理といえば、例えば2coreの場合、
double buf[1024];
の内の、0-511 までを core1、512-1023 までを core2で処理するものだと思っていた。
atomicであるかどうかを気にしている人は、
buf[0] を core1とcore2で
[core1]
for(・・・) {
buf[0] += 1.0;
}
[core2]
for(・・・) {
buf[0] += 1.0;
}
みたいに同時に書きこみたいと思っているの????
でも、atomicというのは、書き込みのみ、または、読み込みのみ、のどちらかの
場合だと適用できるけど、↑のコードの場合、+= 演算子は、直前の値を読み取ってから、
1.0 を足して、同じ場所に書きこむ動作をするので、いくら、double値の書き込みが
atomicであっても、結果はめちゃくちゃになるよ。
double buf[1024];
の内の、0-511 までを core1、512-1023 までを core2で処理するものだと思っていた。
atomicであるかどうかを気にしている人は、
buf[0] を core1とcore2で
[core1]
for(・・・) {
buf[0] += 1.0;
}
[core2]
for(・・・) {
buf[0] += 1.0;
}
みたいに同時に書きこみたいと思っているの????
でも、atomicというのは、書き込みのみ、または、読み込みのみ、のどちらかの
場合だと適用できるけど、↑のコードの場合、+= 演算子は、直前の値を読み取ってから、
1.0 を足して、同じ場所に書きこむ動作をするので、いくら、double値の書き込みが
atomicであっても、結果はめちゃくちゃになるよ。
744デフォルトの名無しさん
2020/05/07(木) 10:45:35.17ID:Uptrp4d8 >>741
- std::atomicの使いどころを理解してない
- "OS"の同期プリミティブを使えと主張 (なぜOSと限定?)
この二つの条件を満たす別人が現れる確率は結構低いと思ったんでね
非礼の詫びとしてatomicの使いどころ知りたかったら教えてやるけどどう?
- std::atomicの使いどころを理解してない
- "OS"の同期プリミティブを使えと主張 (なぜOSと限定?)
この二つの条件を満たす別人が現れる確率は結構低いと思ったんでね
非礼の詫びとしてatomicの使いどころ知りたかったら教えてやるけどどう?
745デフォルトの名無しさん
2020/05/07(木) 10:50:13.38ID:Uptrp4d8746843
2020/05/07(木) 11:13:09.18ID:lQhGrp4h747デフォルトの名無しさん
2020/05/07(木) 11:20:48.41ID:Xvq6sZ7Q std::atomic<double>はoperator+=ないね
748デフォルトの名無しさん
2020/05/07(木) 12:09:28.57ID:0pZrsm5h749デフォルトの名無しさん
2020/05/07(木) 12:11:04.76ID:0pZrsm5h750843
2020/05/07(木) 12:17:56.15ID:FtlEpNqJ751デフォルトの名無しさん
2020/05/07(木) 12:53:58.73ID:N+2vUAWE752デフォルトの名無しさん
2020/05/07(木) 17:00:45.03ID:jqbAFx8V C++に限ったことじゃないかもしれないんですけど質問させてください
typedefで型に別名つけることについてです。今いじってるコードでたとえばvector<animal>にanimalsって型名をつけるようなのが山のようにあるんです
これすごくわかりにくいなと思います。例えばvector<animals>で宣言されてればその変数にどんな操作ができるのか一発ですが突然animalsで宣言されても何ができる型なのか初見では分かりません
別名をつけることがメリットになることってあるんでしょうか
typedefで型に別名つけることについてです。今いじってるコードでたとえばvector<animal>にanimalsって型名をつけるようなのが山のようにあるんです
これすごくわかりにくいなと思います。例えばvector<animals>で宣言されてればその変数にどんな操作ができるのか一発ですが突然animalsで宣言されても何ができる型なのか初見では分かりません
別名をつけることがメリットになることってあるんでしょうか
753デフォルトの名無しさん
2020/05/07(木) 17:14:48.12ID:8jv+kISL メリットは君が言ってる通り特定の言語に限った話では特定の回答は出て来ないし
言語を取り巻く環境(エディタや統合環境や諸々)でも答えは変わってくる
言語を取り巻く環境(エディタや統合環境や諸々)でも答えは変わってくる
>>752
using animals = std::vector<animal>;
わたしも、こういう typedef はしない方ですね、リッチなエディターを使っていないせいかもしれません
書いた人は別名を細かく付けた方がいいと考えているようですが、こういうのは記述の粒度の問題かもしれませんね
using animals = std::vector<animal>;
わたしも、こういう typedef はしない方ですね、リッチなエディターを使っていないせいかもしれません
書いた人は別名を細かく付けた方がいいと考えているようですが、こういうのは記述の粒度の問題かもしれませんね
755デフォルトの名無しさん
2020/05/07(木) 18:08:47.80ID:cLsDnrKi >>752
例えば後からvectorじゃなくてlistにしたいなーと思ったときに修正箇所が一箇所で済む
例えば後からvectorじゃなくてlistにしたいなーと思ったときに修正箇所が一箇所で済む
756デフォルトの名無しさん
2020/05/07(木) 18:14:03.65ID:V086WOzl テンプレートで使うからでは。
757デフォルトの名無しさん
2020/05/07(木) 18:29:01.78ID:0pZrsm5h >>752
書くのが簡単になり、見るのも分かり易くなることがある。
また、animal_s とちゃんと最後に複数形を現す「_s」を付けるという
自分なりの命名規則を付けておけば、vector<animal> のことである
こともすぐに分かる。
書くのが簡単になり、見るのも分かり易くなることがある。
また、animal_s とちゃんと最後に複数形を現す「_s」を付けるという
自分なりの命名規則を付けておけば、vector<animal> のことである
こともすぐに分かる。
758デフォルトの名無しさん
2020/05/07(木) 18:31:07.04ID:0pZrsm5h >>757
なお、型名は小文字ではなく、Animal か、CAnimal、TAnimal のようにするのが慣例。
vector<Animal> の場合、AnimalVector とすると、書くのも理解するのも楽になる。
templateのままをコード中に大量に書くとわずかな書き間違いで変な動作になりかねない。
なお、型名は小文字ではなく、Animal か、CAnimal、TAnimal のようにするのが慣例。
vector<Animal> の場合、AnimalVector とすると、書くのも理解するのも楽になる。
templateのままをコード中に大量に書くとわずかな書き間違いで変な動作になりかねない。
759デフォルトの名無しさん
2020/05/07(木) 18:36:04.65ID:0pZrsm5h >>758
templateは、C++の中でも最も複雑で、書き間違えたときのエラーが理解しにくい
とされる部分。
だから、vector<Animal>とコードのそこかしこに書きまくるのはお勧めしない。
それと、<や> は、キーボードの配置からして打ち込みにくいという事情もある。
指が届きにくい場所にあるというか。
また、vector<Animal
と> を書き損じたような場合、>を探してコンパイラが変な場所でエラーを出して
しまい、どこでエラーが始まったか探し出すのに苦労するようなこともある。
だから、このような「組み立てられた型」は、毎度毎度そのまま使うと痛い目に
遭う可能性があるので、animals と typedef した人は賢い。
templateは、C++の中でも最も複雑で、書き間違えたときのエラーが理解しにくい
とされる部分。
だから、vector<Animal>とコードのそこかしこに書きまくるのはお勧めしない。
それと、<や> は、キーボードの配置からして打ち込みにくいという事情もある。
指が届きにくい場所にあるというか。
また、vector<Animal
と> を書き損じたような場合、>を探してコンパイラが変な場所でエラーを出して
しまい、どこでエラーが始まったか探し出すのに苦労するようなこともある。
だから、このような「組み立てられた型」は、毎度毎度そのまま使うと痛い目に
遭う可能性があるので、animals と typedef した人は賢い。
760デフォルトの名無しさん
2020/05/07(木) 18:37:12.86ID:N8w6+mz8 >>744
レスするなと言ってるのにほんと人の話を聞いてないな。だから別人だって言ってるだろう。
std::atomicの使いどころってstd::atomicの話題に一度もレスしてないし、std::atomicの話を振られてもいない。
しかもOS限定とか妄想そのもの。
> OSの同期か適当な同期ライブラリ使え。悩む余地なし。
と最初に言ってる。逆にキミのその発言で、キミは今まで禄にコードを書いたことのない糞ガキの学生ということがよくわかったよ。
仮にOS提供の同期機構かstd::atomicかという選択であっても1nmもstd::atomicの選択余地はない。0%だ。
枯れてないライブラリは論外。同期バグはOr****やIntelでもやらかすし、枯れてるほうを使う。
何十年もカーネル開発者が注力し、コキ使われてきた実績のある同期コードを選ぶのがまともな社会人。
キミのような無責任な子供やテストしないOSSな人じゃないからね。OS提供がなくても同じ。
組み込み系ならチップメーカーが提供する同期ライブラリを使う。
レスするなと言ってるのにほんと人の話を聞いてないな。だから別人だって言ってるだろう。
std::atomicの使いどころってstd::atomicの話題に一度もレスしてないし、std::atomicの話を振られてもいない。
しかもOS限定とか妄想そのもの。
> OSの同期か適当な同期ライブラリ使え。悩む余地なし。
と最初に言ってる。逆にキミのその発言で、キミは今まで禄にコードを書いたことのない糞ガキの学生ということがよくわかったよ。
仮にOS提供の同期機構かstd::atomicかという選択であっても1nmもstd::atomicの選択余地はない。0%だ。
枯れてないライブラリは論外。同期バグはOr****やIntelでもやらかすし、枯れてるほうを使う。
何十年もカーネル開発者が注力し、コキ使われてきた実績のある同期コードを選ぶのがまともな社会人。
キミのような無責任な子供やテストしないOSSな人じゃないからね。OS提供がなくても同じ。
組み込み系ならチップメーカーが提供する同期ライブラリを使う。
761デフォルトの名無しさん
2020/05/07(木) 18:39:12.04ID:0pZrsm5h 命名規則は、animals よりも、
vector<animal> の時には、AnimalVector
list<animal>の時は、AnimalList
とするのがお勧め。
最後の s だけだと、見落とす可能性があることと、集合体であることだけは
分かっても、それが、どんな種類の集合体かまでは分からないため。
vector<animal> の時には、AnimalVector
list<animal>の時は、AnimalList
とするのがお勧め。
最後の s だけだと、見落とす可能性があることと、集合体であることだけは
分かっても、それが、どんな種類の集合体かまでは分からないため。
762デフォルトの名無しさん
2020/05/07(木) 18:42:48.91ID:0pZrsm5h もうひとつ、vector<animal> より、AnimalVector とした方がいい理由は、
正規表現検索する場合のため。
正規表現だと、< や > は何らかの meta 表現的な意味を持っている場合があるかも
知れないので、型名は単純な alphabet 列の方が何かと便利。
正規表現検索する場合のため。
正規表現だと、< や > は何らかの meta 表現的な意味を持っている場合があるかも
知れないので、型名は単純な alphabet 列の方が何かと便利。
763デフォルトの名無しさん
2020/05/07(木) 19:54:24.58ID:RMklkh4T 今どきシステムハンガリアンもどきなんてやだよぅ
764デフォルトの名無しさん
2020/05/07(木) 20:03:35.58ID:wkYaXeHy vectorからlistに変えられなくなる
>>761
vector から list に変えるときに、名前もいちいち変えないといけないのだったら、その命名ルールは今いちですね…
vector から list に変えるときに、名前もいちいち変えないといけないのだったら、その命名ルールは今いちですね…
766デフォルトの名無しさん
2020/05/07(木) 20:56:23.62ID:V9Hy6a5I Animalsの話題はわたくしがC++最大の謎と呼ぶvector継承不可問題だ
Javaだと「class Animal extends ArrayList<Animal>{」とできる
でもC++だとvectorそのものの継承はデストラクタの関係で認められていない
つまりクラスを作るかtypedefするか、C++には2通りの解決方法が存在する
Javaだと「class Animal extends ArrayList<Animal>{」とできる
でもC++だとvectorそのものの継承はデストラクタの関係で認められていない
つまりクラスを作るかtypedefするか、C++には2通りの解決方法が存在する
767デフォルトの名無しさん
2020/05/07(木) 21:04:23.79ID:+JcfXk10 自分作りゃいいだろ
コンテナくらい
コンテナくらい
768デフォルトの名無しさん
2020/05/07(木) 21:04:44.42ID:Gk4UMZDB 別にvector継承してもいいんだよ
protectedかprivate継承する分には何の問題もない
役には立たないけど
protectedかprivate継承する分には何の問題もない
役には立たないけど
769デフォルトの名無しさん
2020/05/07(木) 21:07:22.98ID:qT/QDoOR この程度でs付け忘れるとか不注意にもほどがある
770デフォルトの名無しさん
2020/05/07(木) 21:10:02.94ID:QyPqnZke いや、vectorは今となっては継承すべきでないってこともないだろ
771デフォルトの名無しさん
2020/05/07(木) 21:21:54.60ID:hoUWiCnf vector<>のデストラクタが仮想でないのは仕様の欠陥ですか?
772はちみつ餃子 ◆8X2XSCHEME
2020/05/07(木) 21:30:23.98ID:8B1BhNza 注意深さに自信があるならデストラクタが virtual でないクラスを public 継承しても
それ自体は言語仕様には反しないけど、人間は間違うのでな……。
>>768
private 継承した上で外部から呼び出しを許すメンバ関数は using すればいい。
役に立たないということはないと思う。
それ自体は言語仕様には反しないけど、人間は間違うのでな……。
>>768
private 継承した上で外部から呼び出しを許すメンバ関数は using すればいい。
役に立たないということはないと思う。
773デフォルトの名無しさん
2020/05/08(金) 01:16:40.31ID:Fn7VYFHg 基本的なことだと思うけどよく
よくあるイベントループってどうやったらシンプルかつMT安全かつ効率的に実装できる?
次のような条件で
- qeueuが空ならwaitする
- qeueuにイベントが追加されたら直ちにおきてdispatchする
- dispatchに長い時間かかることもありえる
- add_eventは可能な限り短い処理で完了する。
- stopがよばれたらloopから直ちにぬける。dispatch中の場合は終わってから抜ける。
次に雰囲気コード書きます。
よくあるイベントループってどうやったらシンプルかつMT安全かつ効率的に実装できる?
次のような条件で
- qeueuが空ならwaitする
- qeueuにイベントが追加されたら直ちにおきてdispatchする
- dispatchに長い時間かかることもありえる
- add_eventは可能な限り短い処理で完了する。
- stopがよばれたらloopから直ちにぬける。dispatch中の場合は終わってから抜ける。
次に雰囲気コード書きます。
774デフォルトの名無しさん
2020/05/08(金) 01:21:33.28ID:Fn7VYFHg loop()がこれではいかんのはわかってるけど、どうすれば簡潔に書けるのかわからん
他にもあやしいところがある気がする
bool running = true;
std::deque<int> unsafe_queue;
std::mutex mtx;
std::condition_variable cond;
using unique_lock = std::unique_lock<std::mutex>;
void stop() { running = false; }
void add_event(int i)
{
unique_lock _(mtx);
unsafe_queue.push_back(i);
cond.notify_one();
}
void dispatch(int) { /*do something*/ }
void loop()
{
unique_lock lock(mtx);
while (running) {
cond.wait(lock, [] { return !unsafe_queue.empty(); });
auto ev = unsafe_queue.front();
unsafe_queue.pop_front();
dispatch(ev);
}
}
他にもあやしいところがある気がする
bool running = true;
std::deque<int> unsafe_queue;
std::mutex mtx;
std::condition_variable cond;
using unique_lock = std::unique_lock<std::mutex>;
void stop() { running = false; }
void add_event(int i)
{
unique_lock _(mtx);
unsafe_queue.push_back(i);
cond.notify_one();
}
void dispatch(int) { /*do something*/ }
void loop()
{
unique_lock lock(mtx);
while (running) {
cond.wait(lock, [] { return !unsafe_queue.empty(); });
auto ev = unsafe_queue.front();
unsafe_queue.pop_front();
dispatch(ev);
}
}
775デフォルトの名無しさん
2020/05/08(金) 03:21:51.97ID:7git1+gm まずconcurrent_queueを持ってくるなり作るなりして用意した方がいいよ
イベントループにロックやイベント混ぜて書くとわけわからなくなる
イベントループにロックやイベント混ぜて書くとわけわからなくなる
776デフォルトの名無しさん
2020/05/08(金) 03:34:19.21ID:7git1+gm イベントって同期イベントね
777デフォルトの名無しさん
2020/05/08(金) 03:38:35.90ID:FOXu+lyu concurrent_queueは必要ないと言うかこの用途だと無駄な処理増えるだけじゃね
779デフォルトの名無しさん
2020/05/08(金) 06:51:21.78ID:M/JmLjh0 >>774
それ、イベント発行しないと止まらなくね?
それ、イベント発行しないと止まらなくね?
780デフォルトの名無しさん
2020/05/08(金) 11:45:01.04ID:Fn7VYFHg781デフォルトの名無しさん
2020/05/08(金) 12:06:11.41ID:Fn7VYFHg782デフォルトの名無しさん
2020/05/08(金) 12:18:21.10ID:Fn7VYFHg >>778
BlockingCollectionってどこにあります?
ぐぐったらC#のクラスは見つかりましたが
上に書いた通り、stop時の処理がまわりくどくなりそうなのを気にしてます
実行時のロジックがシンプルなやり方を追求したいです
BlockingCollectionってどこにあります?
ぐぐったらC#のクラスは見つかりましたが
上に書いた通り、stop時の処理がまわりくどくなりそうなのを気にしてます
実行時のロジックがシンプルなやり方を追求したいです
783843
2020/05/08(金) 12:23:41.84ID:UXU8nfWQ784デフォルトの名無しさん
2020/05/08(金) 12:39:35.76ID:N+8ZKU+/ 普通は終了を意味する番兵オブジェクトを用意するんじゃないの
キューの中身を最後まで処理して欲しいなら単に番兵を積めばいいし、無理矢理終わらせたいならキューを強制的に空にしてから番兵放り込めばいい
キューの中身を最後まで処理して欲しいなら単に番兵を積めばいいし、無理矢理終わらせたいならキューを強制的に空にしてから番兵放り込めばいい
785デフォルトの名無しさん
2020/05/08(金) 13:50:27.60ID:Fn7VYFHg >>784
なるほどそれだときれいに書けますね
runningフラグは不要にできると
しかしわりとクリティカルな処理を想定してるので
stopを呼ぶスレッドで(イベントオブジェクトの)解放処理が起るのは問題に
なるかもしれないです(例ではintですが実際はもうちょっと凝った構造体)
runningフラグ前提だときれいに書けないですかね?
なるほどそれだときれいに書けますね
runningフラグは不要にできると
しかしわりとクリティカルな処理を想定してるので
stopを呼ぶスレッドで(イベントオブジェクトの)解放処理が起るのは問題に
なるかもしれないです(例ではintですが実際はもうちょっと凝った構造体)
runningフラグ前提だときれいに書けないですかね?
786デフォルトの名無しさん
2020/05/08(金) 17:13:05.00ID:+t+L26mC こんなんでいいのでは。running2回チェックは避けられそうにないなあ。チェックよろ
start() {
{
lock()
running = true
}
run(loop)
}
stop() {
{
lock()
running = false
}
notify()
join()
}
loop() {
lock()
while(true) {
cond_wait(!empty() or !running)
if (!running) {
break
}
pop()
}
}
start() {
{
lock()
running = true
}
run(loop)
}
stop() {
{
lock()
running = false
}
notify()
join()
}
loop() {
lock()
while(true) {
cond_wait(!empty() or !running)
if (!running) {
break
}
pop()
}
}
787デフォルトの名無しさん
2020/05/08(金) 17:29:10.43ID:NOJZfKLR スレッド動作トリガーはcond 1個にして
スレッド内で、キューやrunningフラグを見る
スレッド内で、キューやrunningフラグを見る
788デフォルトの名無しさん
2020/05/08(金) 17:32:31.56ID:NOJZfKLR Windowsみたいな高機能な同期が有れば
イベント、タイマー、ファイルアクセス、ネットワーク通信
などなど色々な物を同時にトリガーに出来る
linux系はその辺が貧弱
スレッドを動かす為のスレッドが必要になったりする
イベント、タイマー、ファイルアクセス、ネットワーク通信
などなど色々な物を同時にトリガーに出来る
linux系はその辺が貧弱
スレッドを動かす為のスレッドが必要になったりする
789デフォルトの名無しさん
2020/05/08(金) 17:46:30.97ID:+t+L26mC >>788
全部selectやepollでまとめて待てるけど、winはもっと高機能なん?
全部selectやepollでまとめて待てるけど、winはもっと高機能なん?
790デフォルトの名無しさん
2020/05/08(金) 18:43:53.40ID:NOJZfKLR yes
791デフォルトの名無しさん
2020/05/08(金) 19:10:58.40ID:Fn7VYFHg >>786
インデントつけました
void loop() {
lock()
while (true) {
cond_wait(!empty() or !running)
if (!running) {
break
}
pop()
}
}
cond_waitの前にrunningみなくて大丈夫ですかね?
startの直後loopが始まる直前でstopが呼ばれた場合cond_waitって起きます?
インデントつけました
void loop() {
lock()
while (true) {
cond_wait(!empty() or !running)
if (!running) {
break
}
pop()
}
}
cond_waitの前にrunningみなくて大丈夫ですかね?
startの直後loopが始まる直前でstopが呼ばれた場合cond_waitって起きます?
792デフォルトの名無しさん
2020/05/08(金) 19:27:16.63ID:V12mYFi1793デフォルトの名無しさん
2020/05/08(金) 20:07:48.20ID:DADrWmcq >>791
cond.waitはブロックする前に一度条件式を確認する動きになってる。
条件式が初めからtrueであればそもそもブロッキングをしないからcond.waitの前にrunningをみなくても大丈夫だと思う
cond.waitはブロックする前に一度条件式を確認する動きになってる。
条件式が初めからtrueであればそもそもブロッキングをしないからcond.waitの前にrunningをみなくても大丈夫だと思う
794デフォルトの名無しさん
2020/05/08(金) 20:36:08.72ID:Fn7VYFHg795デフォルトの名無しさん
2020/05/08(金) 22:51:30.97ID:Fn7VYFHg もうひとつ質問させてください
>>774 のrunningはstd::atomic_boolにする必要はあります?
C言語だとこの手の変数はvolatileにすると思うのですが
C++ならatomicでしょうか?
上の方でatomicのこといろいろ書いてありますがこの場合はどうなんでしょう?
>>774 のrunningはstd::atomic_boolにする必要はあります?
C言語だとこの手の変数はvolatileにすると思うのですが
C++ならatomicでしょうか?
上の方でatomicのこといろいろ書いてありますがこの場合はどうなんでしょう?
796デフォルトの名無しさん
2020/05/09(土) 00:53:16.27ID:8wHk9BWj void Foo::pushReq(const XXXReq& req)
{
EnterCriticalSection(&m_csec);
{
if (!m_bTerminate) {
m_requests.push(req);
SetEvent(m_hEvtNewRequest);
}
}
LeaveCriticalSection(&m_csec);
}
{
EnterCriticalSection(&m_csec);
{
if (!m_bTerminate) {
m_requests.push(req);
SetEvent(m_hEvtNewRequest);
}
}
LeaveCriticalSection(&m_csec);
}
797デフォルトの名無しさん
2020/05/09(土) 00:57:33.61ID:8wHk9BWj bool Foo::popReq(XXXReq& req)
for (;;) {
if (!m_bInOperation) {
// イベント待機
WaitForSingleObject(m_hEvtNewRequest, INFINITE);
if (m_bTerminate) {
return false;
}
m_bInOperation = true;
} else {
EnterCriticalSection(&m_csec);
{
if (m_requests.empty()) {
m_bInOperation = false;
// 今入っているイベントはbInProcess中に入ったもので
// 明らかに古いのでリセット
ResetEvent(m_hEvtNewRequest);
} else {
// 要求があればpopして処理
req = m_requests.front();
m_requests.pop();
}
}
LeaveCriticalSection(&m_csec);
if (m_bInOperation) {
// 処理すべきリクエスト有り
break;
}
}
}
}
for (;;) {
if (!m_bInOperation) {
// イベント待機
WaitForSingleObject(m_hEvtNewRequest, INFINITE);
if (m_bTerminate) {
return false;
}
m_bInOperation = true;
} else {
EnterCriticalSection(&m_csec);
{
if (m_requests.empty()) {
m_bInOperation = false;
// 今入っているイベントはbInProcess中に入ったもので
// 明らかに古いのでリセット
ResetEvent(m_hEvtNewRequest);
} else {
// 要求があればpopして処理
req = m_requests.front();
m_requests.pop();
}
}
LeaveCriticalSection(&m_csec);
if (m_bInOperation) {
// 処理すべきリクエスト有り
break;
}
}
}
}
798デフォルトの名無しさん
2020/05/09(土) 01:01:13.28ID:8wHk9BWj ウィンドーズの同期APIの仕様により
同期API呼び出し時点であらゆる変数のメモリへの書込みとメモリからの読み込みが完了するので
とくにvolatileは不要
なはず、
同期API呼び出し時点であらゆる変数のメモリへの書込みとメモリからの読み込みが完了するので
とくにvolatileは不要
なはず、
799デフォルトの名無しさん
2020/05/09(土) 06:06:39.41ID:1JWVR6vl >>795
>>786のようにrunningの更新をlockで保護するのであればatomic_boolにする必要はないと思うよ
void stop() {
std::lock_guard<std::mutex> lk(mtx);
running = false;
cond.notify_all();
}
お手本でも普通のboolを使ってる
https://cpprefjp.github.io/reference/condition_variable/condition_variable.html
https://cpprefjp.github.io/article/lib/how_to_use_cv.html
>>786のようにrunningの更新をlockで保護するのであればatomic_boolにする必要はないと思うよ
void stop() {
std::lock_guard<std::mutex> lk(mtx);
running = false;
cond.notify_all();
}
お手本でも普通のboolを使ってる
https://cpprefjp.github.io/reference/condition_variable/condition_variable.html
https://cpprefjp.github.io/article/lib/how_to_use_cv.html
800デフォルトの名無しさん
2020/05/09(土) 11:17:56.00ID:KZFWOt7Z >>799
loop()内のrunningは毎度メモリから読まれる必要があるので
C言語ならvolatileにすると理解しています
つまりループ内で最適化されてしまわないようにするためだと思います
これがC++だと仕様的にもともと問題ないのでしょうか?
逆に最適化がかかりにくくなってしまう気がします
ただ手元で実装したものは最適化かけていても確かに期待通り動いています
loop()内のrunningは毎度メモリから読まれる必要があるので
C言語ならvolatileにすると理解しています
つまりループ内で最適化されてしまわないようにするためだと思います
これがC++だと仕様的にもともと問題ないのでしょうか?
逆に最適化がかかりにくくなってしまう気がします
ただ手元で実装したものは最適化かけていても確かに期待通り動いています
801デフォルトの名無しさん
2020/05/09(土) 12:59:28.79ID:1JWVR6vl >>800
POSIX準拠のシステムでは同時アクセスを防ぐ書き方(mutexによるlockとかstd::atomicによるstore/loadとか)
をすれば自動的にメモリ同期(メモリへのフラッシュ)が行われる作りになっていてvolatileとかを気にする必要がないらしい
https://yupo5656.hatenadiary.org/entry/20040618/p2
POSIX準拠のシステムでは同時アクセスを防ぐ書き方(mutexによるlockとかstd::atomicによるstore/loadとか)
をすれば自動的にメモリ同期(メモリへのフラッシュ)が行われる作りになっていてvolatileとかを気にする必要がないらしい
https://yupo5656.hatenadiary.org/entry/20040618/p2
802デフォルトの名無しさん
2020/05/09(土) 13:06:53.14ID:8wHk9BWj >>800
>>774のコードの全体の当否はおくとして
while()の中でlockしているのであればlockされるブロックに出入りする際に
>runningは毎度メモリから読まれる
が実現されるからrunningフラグはvolatile無しでもむ無問題、
C++の標準的なlockの仕様は知らんがlockに出入りするときに
CPUのライトキューやリードキューに未処理のライトコマンドやリードコマンドが乗ったままだと
正しいロックにならないから普通のlockの実装ではメモリバリアを行う
メモリバリアはコンパイラに対してはイントリンシックな関数か何かとして定義されており、
それらの呼び出しのときコンパイラは空気を読んでレジスタに乗ったままの変数を放置しないはず…
(変数に対する副作用がある関数呼び出しとみなす
>>774のコードの全体の当否はおくとして
while()の中でlockしているのであればlockされるブロックに出入りする際に
>runningは毎度メモリから読まれる
が実現されるからrunningフラグはvolatile無しでもむ無問題、
C++の標準的なlockの仕様は知らんがlockに出入りするときに
CPUのライトキューやリードキューに未処理のライトコマンドやリードコマンドが乗ったままだと
正しいロックにならないから普通のlockの実装ではメモリバリアを行う
メモリバリアはコンパイラに対してはイントリンシックな関数か何かとして定義されており、
それらの呼び出しのときコンパイラは空気を読んでレジスタに乗ったままの変数を放置しないはず…
(変数に対する副作用がある関数呼び出しとみなす
803デフォルトの名無しさん
2020/05/09(土) 13:16:40.60ID:2pLCfdPK POSIXスレッドはetchになってからようやく使い物になった
woody以前は酷い出来だったのは酔い思い出
woody以前は酷い出来だったのは酔い思い出
804デフォルトの名無しさん
2020/05/09(土) 13:46:46.99ID:8wHk9BWj しかし以下のような実装のときrunningにvolatileが本当に要らないかどうかわわからん…
void bar() { (内部でlockを行う) }
====↓↓↓異なる翻訳単位↓↓↓====
void foo {
bool running = false; // runningはローカル変数
while (running) {
bar(); // 一見runninguへの副作用が考えられないシグネチャ
}
}
どうやっているのかは知らんが、ウィンドーズの同期系API(上の例でbar()にあたる)は
うまいことやってくれる(と思う!
void bar() { (内部でlockを行う) }
====↓↓↓異なる翻訳単位↓↓↓====
void foo {
bool running = false; // runningはローカル変数
while (running) {
bar(); // 一見runninguへの副作用が考えられないシグネチャ
}
}
どうやっているのかは知らんが、ウィンドーズの同期系API(上の例でbar()にあたる)は
うまいことやってくれる(と思う!
806デフォルトの名無しさん
2020/05/09(土) 13:52:06.16ID:8wHk9BWj よく考えたら上のコードではrunningへのポインタを他のスレッドが知っていることもありえないから、
そういう意味でvolatile不要(最適化上等)か…orz
一方、runningがグローバル変数なら、異なる翻訳系で定義された関数を呼び出した後に、
runningは改めてメモリから読まれることはコンパイラが生成するコードの規定の動作なので
volatile不要
まとめると、runningがグローバル変数でありかつ同期目的の関数内でメモリフェンスしており、
かつそこが毎回通る限り、runningにvolatileは不要
そういう意味でvolatile不要(最適化上等)か…orz
一方、runningがグローバル変数なら、異なる翻訳系で定義された関数を呼び出した後に、
runningは改めてメモリから読まれることはコンパイラが生成するコードの規定の動作なので
volatile不要
まとめると、runningがグローバル変数でありかつ同期目的の関数内でメモリフェンスしており、
かつそこが毎回通る限り、runningにvolatileは不要
807デフォルトの名無しさん
2020/05/09(土) 13:53:07.30ID:VRhqXw8t >>804
running がローカル変数なら bar() での副作用は無理だから volatile の有無によらず foo() は空にできちゃうのでは?
running がローカル変数なら bar() での副作用は無理だから volatile の有無によらず foo() は空にできちゃうのでは?
808デフォルトの名無しさん
2020/05/09(土) 13:54:44.10ID:VRhqXw8t (リロードしてなかった・・・)
>>806 つまり volatile が必要なケースは無いね?
>>806 つまり volatile が必要なケースは無いね?
809デフォルトの名無しさん
2020/05/09(土) 14:01:00.47ID:8wHk9BWj810デフォルトの名無しさん
2020/05/09(土) 14:22:58.21ID:KZFWOt7Z811デフォルトの名無しさん
2020/05/09(土) 14:32:48.74ID:KZFWOt7Z >>802
> >>800
> >>774のコードの全体の当否はおくとして
> while()の中でlockしているのであればlockされるブロックに出入りする際に
> >runningは毎度メモリから読まれる
> が実現されるからrunningフラグはvolatile無しでもむ無問題、
一度目はメモリから読まれるのは確実だと思います
ただループの場合、2度目のリードからはコンパイラが最適化をかけて
一度目の値を使いまわす可能性があると思います
void loop()
{
unique_lock lock(mtx);
auto r = running
while (r) {
....
}
}
と置き換えてしまう可能性があるのでは?ということを心配しています
私のC言語開発の経験ではこの場合はvolatileにするのが鉄則でした
c++のコンパイラはかしこくrunningは都度メモリから読み出すべしと判断していると
なるとその判定はどうやって行っているのでしょう?
一律にローカル変数以外はメモリから呼び出すわけではないと思います
(それだとかなり性能が落ちると思います)
> >>800
> >>774のコードの全体の当否はおくとして
> while()の中でlockしているのであればlockされるブロックに出入りする際に
> >runningは毎度メモリから読まれる
> が実現されるからrunningフラグはvolatile無しでもむ無問題、
一度目はメモリから読まれるのは確実だと思います
ただループの場合、2度目のリードからはコンパイラが最適化をかけて
一度目の値を使いまわす可能性があると思います
void loop()
{
unique_lock lock(mtx);
auto r = running
while (r) {
....
}
}
と置き換えてしまう可能性があるのでは?ということを心配しています
私のC言語開発の経験ではこの場合はvolatileにするのが鉄則でした
c++のコンパイラはかしこくrunningは都度メモリから読み出すべしと判断していると
なるとその判定はどうやって行っているのでしょう?
一律にローカル変数以外はメモリから呼び出すわけではないと思います
(それだとかなり性能が落ちると思います)
812デフォルトの名無しさん
2020/05/09(土) 14:56:31.18ID:8wHk9BWj >>811
コンパイラ視点で見れば中身のわからないcond.wait()と言う関数呼び出しが
グローバル変数runningに対する副作用を持たない(値を書き換えない)ことの保証が無いから、
cond.wait()をループ外にくくりだす最適化が行われることは普通は無い。 --- (A)
また、ソースコード上cond.wait()を呼び出した後にrunningを参照する箇所があれば、
普通はかならずメモリからrunningを読み直すコードが吐かれる --- (B)
普通でない場合というのはコンパイラがcond.wait()メソッドの中身まで知っていて
runningに対する副作用が無いと結論付ける場合が考えられるが、
それでもcond.wait()の中で
(1) メモリバリアを行っており、
(2) その意味をコンパイラが知っている
限り、コンパイラが「(cond.wait()呼び出しによる)runningに対する副作用が無い」と結論付けることはありえない --- (C)
というわけで、普通は(A)、(B)が成立するからrunningのvolatileは不要
(A)、(B)非成立な変に賢いコンパイラでも、(1)と(2)が成立するなら(C)が成立するからrunningのvolatileは不要
コンパイラ視点で見れば中身のわからないcond.wait()と言う関数呼び出しが
グローバル変数runningに対する副作用を持たない(値を書き換えない)ことの保証が無いから、
cond.wait()をループ外にくくりだす最適化が行われることは普通は無い。 --- (A)
また、ソースコード上cond.wait()を呼び出した後にrunningを参照する箇所があれば、
普通はかならずメモリからrunningを読み直すコードが吐かれる --- (B)
普通でない場合というのはコンパイラがcond.wait()メソッドの中身まで知っていて
runningに対する副作用が無いと結論付ける場合が考えられるが、
それでもcond.wait()の中で
(1) メモリバリアを行っており、
(2) その意味をコンパイラが知っている
限り、コンパイラが「(cond.wait()呼び出しによる)runningに対する副作用が無い」と結論付けることはありえない --- (C)
というわけで、普通は(A)、(B)が成立するからrunningのvolatileは不要
(A)、(B)非成立な変に賢いコンパイラでも、(1)と(2)が成立するなら(C)が成立するからrunningのvolatileは不要
813デフォルトの名無しさん
2020/05/09(土) 15:08:39.92ID:1JWVR6vl814デフォルトの名無しさん
2020/05/09(土) 15:08:46.08ID:KZFWOt7Z >>812
それはstd:::condition_variableを使った場合に限定していますか?
基本的にpthreadのwrapperだと思うのですが、仮にコンパイラがそれを特別扱いしているとすると
pthreadをダイレクトに使った場合はどうなりますか?
あと客観的な文献を示してほしいです
それはstd:::condition_variableを使った場合に限定していますか?
基本的にpthreadのwrapperだと思うのですが、仮にコンパイラがそれを特別扱いしているとすると
pthreadをダイレクトに使った場合はどうなりますか?
あと客観的な文献を示してほしいです
815デフォルトの名無しさん
2020/05/09(土) 15:11:10.97ID:KZFWOt7Z816デフォルトの名無しさん
2020/05/09(土) 15:20:05.99ID:1JWVR6vl817デフォルトの名無しさん
2020/05/09(土) 15:38:10.36ID:8wHk9BWj >>814
>それはstd:::condition_variableを使った場合に限定していますか?
いいえ
>pthreadをダイレクトに使った場合はどうなりますか?
どう使うつもりかわわからんが、コンパイラに中身を知りようが無い関数の
呼び出しがループ内に生じる限り同じ話
>客観的な文献を示してほしいです
(1) 変数に対する副作用がある(かもしれない)関数がループ外にくくりだされないこと
コンパイラはソースコードをオブジェクトコードに翻訳する際、
ソースコードに書かれたアルゴリズム(有限ステップで終わる&非同期要素無し)の
動作結果を変えてはならない。この原則はコンパイラの教科書に書いてあるし常識と言っても過言ではない
で、変数に対する副作用がある(かもしれない)関数の不適切な最適化はこの原則にひっかかる
(2) 少なくともMSVCがメモリバリアの意味を知っている根拠
https://docs.microsoft.com/ja-jp/cpp/intrinsics/readwritebarrier?view=vs-2015
これ、VS2010までは非推奨ではなかったし、サンプルコードも載っていたが無くなってたorz
>それはstd:::condition_variableを使った場合に限定していますか?
いいえ
>pthreadをダイレクトに使った場合はどうなりますか?
どう使うつもりかわわからんが、コンパイラに中身を知りようが無い関数の
呼び出しがループ内に生じる限り同じ話
>客観的な文献を示してほしいです
(1) 変数に対する副作用がある(かもしれない)関数がループ外にくくりだされないこと
コンパイラはソースコードをオブジェクトコードに翻訳する際、
ソースコードに書かれたアルゴリズム(有限ステップで終わる&非同期要素無し)の
動作結果を変えてはならない。この原則はコンパイラの教科書に書いてあるし常識と言っても過言ではない
で、変数に対する副作用がある(かもしれない)関数の不適切な最適化はこの原則にひっかかる
(2) 少なくともMSVCがメモリバリアの意味を知っている根拠
https://docs.microsoft.com/ja-jp/cpp/intrinsics/readwritebarrier?view=vs-2015
これ、VS2010までは非推奨ではなかったし、サンプルコードも載っていたが無くなってたorz
818デフォルトの名無しさん
2020/05/09(土) 15:40:22.80ID:VRhqXw8t >>814
標準スレッドライブラリを使った前後の読み書きについては、
ライブラリ関数呼び出し( lock/unlock など)が提供するスレッドをまたぐ "synchronize with" 関係と
スレッド内での, "sequenced before/after" による前後関係とをつないだ
"inter-thread happens before" 関係(順序付け)に基づく挙動が規定されている。
https://timsong-cpp.github.io/cppwp/n4659/intro.multithread#intro.races-9
>811 のような書き換えは許されない。
規格化以前の pthread などをダイレクトに使った場合は >>812 の挙げるような
「事実上問題にならない」に頼ることになり、これに volatile を加えても「事実上問題にならない」の
範疇であることに変わりはない。
問題の可能性が減ったり、実際に起こっていた問題の解決につながることはあっただろうけどね。
これについては「客観的な文献」といったものが無かったことも規格化の動機になっただろう。
https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals
> - Machine model and concurrency ? provide stronger guarantees for and better facilities
> for using modern hardware (e.g. multicores and weakly coherent memory models). ...
標準スレッドライブラリを使った前後の読み書きについては、
ライブラリ関数呼び出し( lock/unlock など)が提供するスレッドをまたぐ "synchronize with" 関係と
スレッド内での, "sequenced before/after" による前後関係とをつないだ
"inter-thread happens before" 関係(順序付け)に基づく挙動が規定されている。
https://timsong-cpp.github.io/cppwp/n4659/intro.multithread#intro.races-9
>811 のような書き換えは許されない。
規格化以前の pthread などをダイレクトに使った場合は >>812 の挙げるような
「事実上問題にならない」に頼ることになり、これに volatile を加えても「事実上問題にならない」の
範疇であることに変わりはない。
問題の可能性が減ったり、実際に起こっていた問題の解決につながることはあっただろうけどね。
これについては「客観的な文献」といったものが無かったことも規格化の動機になっただろう。
https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals
> - Machine model and concurrency ? provide stronger guarantees for and better facilities
> for using modern hardware (e.g. multicores and weakly coherent memory models). ...
819デフォルトの名無しさん
2020/05/09(土) 16:27:23.02ID:KZFWOt7Z >>817
なるほど
つまりc/c++コンパイラの最適化において、
副作用がある(pure functionでない)関数があると、それをまたいだ
リオーダーや値の流用をすることはない
当然メモリバリアを張るcond(pthreadも含む)は副作用ありなので
これがループ中に存在する場合はrunningは毎度メモリから読み出されることになる
ということですね
非常によくわかりました
なるほど
つまりc/c++コンパイラの最適化において、
副作用がある(pure functionでない)関数があると、それをまたいだ
リオーダーや値の流用をすることはない
当然メモリバリアを張るcond(pthreadも含む)は副作用ありなので
これがループ中に存在する場合はrunningは毎度メモリから読み出されることになる
ということですね
非常によくわかりました
820デフォルトの名無しさん
2020/05/09(土) 16:30:24.63ID:KZFWOt7Z >>817
しかし、この場合volatileが不要といえることはわかりましたが、
これはあくまで副作用あり関数の存在に依存しています
と考えると一般的にはvolatileはつけておく方習慣の方がやはり無難だと思いますがいかがでしょう?
(c++ならatomicに置き換えるとして)
しかし、この場合volatileが不要といえることはわかりましたが、
これはあくまで副作用あり関数の存在に依存しています
と考えると一般的にはvolatileはつけておく方習慣の方がやはり無難だと思いますがいかがでしょう?
(c++ならatomicに置き換えるとして)
821デフォルトの名無しさん
2020/05/09(土) 16:33:07.67ID:KZFWOt7Z822デフォルトの名無しさん
2020/05/09(土) 16:41:37.74ID:8wHk9BWj >>819
レジスタに載ったままな変数の流用はともかく、
リオーダーは副作用がある(pure functionでない)関数をまたいでも特に阻害されないんじゃね;
リオーダーの効果はプログラムの実行に関して普通の状況では透過的なので、普通の状況でコンパイラがそれをやめさせる理由が無い
普通でない状況としては>>714みたく同一データに対する複数コアからの同時アクセスがありえるケース
(コンパイラが知りようが無い非同期事象が生じるケース)があるが、
これは(ユーザーコードかライブラリの)プログラマがメモリバリアを明示的に書き、
コンパイラが空気を呼んでその前後の変数の流用も抑止することで処置される
と思うが真実は知らん
気分としてはあくまで>>800の立場であって非同期の問題に関してはノーコメント
事実として出来上がったプログラムが正しく動いているなら問題ないのじゃガッハッハッハ、
レジスタに載ったままな変数の流用はともかく、
リオーダーは副作用がある(pure functionでない)関数をまたいでも特に阻害されないんじゃね;
リオーダーの効果はプログラムの実行に関して普通の状況では透過的なので、普通の状況でコンパイラがそれをやめさせる理由が無い
普通でない状況としては>>714みたく同一データに対する複数コアからの同時アクセスがありえるケース
(コンパイラが知りようが無い非同期事象が生じるケース)があるが、
これは(ユーザーコードかライブラリの)プログラマがメモリバリアを明示的に書き、
コンパイラが空気を呼んでその前後の変数の流用も抑止することで処置される
と思うが真実は知らん
気分としてはあくまで>>800の立場であって非同期の問題に関してはノーコメント
事実として出来上がったプログラムが正しく動いているなら問題ないのじゃガッハッハッハ、
823デフォルトの名無しさん
2020/05/09(土) 16:43:21.63ID:8wHk9BWj824デフォルトの名無しさん
2020/05/09(土) 17:00:35.76ID:1JWVR6vl >>820
複数スレッドで共有する変数を読み込む以上絶対にlockなりatomicなりを使うわけだから必ず副作用あり関数が存在する
複数スレッドで共有する変数を読み込む以上絶対にlockなりatomicなりを使うわけだから必ず副作用あり関数が存在する
825はちみつ餃子 ◆8X2XSCHEME
2020/05/09(土) 18:56:58.72ID:MmeKQuXy >>820
見かけ上の挙動が仕様通りだったらどうコンパイルしてもよいというのが言語としての基本的なルール。
https://timsong-cpp.github.io/cppwp/n3337/intro.execution
昔は並列実行に関する動作モデルの既定がなかったので、
既定にないことをするプログラムを書いたときに
最適化で除去されたり順序が入れ替わったりしてもそれは仕様通りだったんだよ。
volatile はプログラムとして書いてある通りのことを (たとえ観測できなくても) 実際の動作にも
反映させろというヒントをコンパイラに伝えるものではあるけど、
言語仕様の記述に用いられる抽象機械と実際の実行環境が完全にマッピングできるわけでもない
から volatile が具体的にどう影響するかってのは分からん。
言語仕様外のことをするときのために用意されていると考えてもいい。
つまり、ロックやアトミックまわりの仕様で規定されていることなら volatile を付けようが付けまいが
その通りになるし、既定されていないことなら volatile を付けても言語仕様として得られる保証は何もない。
処理系として言語仕様以上の保証を付けているということはあるだろうけど。
見かけ上の挙動が仕様通りだったらどうコンパイルしてもよいというのが言語としての基本的なルール。
https://timsong-cpp.github.io/cppwp/n3337/intro.execution
昔は並列実行に関する動作モデルの既定がなかったので、
既定にないことをするプログラムを書いたときに
最適化で除去されたり順序が入れ替わったりしてもそれは仕様通りだったんだよ。
volatile はプログラムとして書いてある通りのことを (たとえ観測できなくても) 実際の動作にも
反映させろというヒントをコンパイラに伝えるものではあるけど、
言語仕様の記述に用いられる抽象機械と実際の実行環境が完全にマッピングできるわけでもない
から volatile が具体的にどう影響するかってのは分からん。
言語仕様外のことをするときのために用意されていると考えてもいい。
つまり、ロックやアトミックまわりの仕様で規定されていることなら volatile を付けようが付けまいが
その通りになるし、既定されていないことなら volatile を付けても言語仕様として得られる保証は何もない。
処理系として言語仕様以上の保証を付けているということはあるだろうけど。
826デフォルトの名無しさん
2020/05/09(土) 18:58:03.61ID:KZFWOt7Z >>824
確かに、正しく排他制御しているのならばそれはいえそうです
確かに、正しく排他制御しているのならばそれはいえそうです
827デフォルトの名無しさん
2020/05/09(土) 19:14:29.09ID:TBKnesgm volatileは簡潔に言うとregisterの逆の作用だね
828デフォルトの名無しさん
2020/05/09(土) 22:27:01.93ID:IGvav/BT volatileはコンパイラに、コード通り読み書きを行うコードを吐けと指示するだけ
CPUが勝手に順番を変えたりしないようにCPUに指示をする命令は別途行わなければならない
x86の場合は何もしなくて良い場合が多く
ARMの場合は追加しなければならない場合が多い
CPUが勝手に順番を変えたりしないようにCPUに指示をする命令は別途行わなければならない
x86の場合は何もしなくて良い場合が多く
ARMの場合は追加しなければならない場合が多い
829デフォルトの名無しさん
2020/05/09(土) 22:31:00.74ID:TVkAIoUw いいえ、単に昔からGCCが糞なだけです。
830デフォルトの名無しさん
2020/05/09(土) 22:42:09.15ID:G+eyUkVB 最近日本式のやつが再注目されてるじゃないか。
それは欧州式のやつのことじゃないか?
それは欧州式のやつのことじゃないか?
831843
2020/05/09(土) 23:22:12.13ID:NXsGMAUL >>824
片方は書き出し、もう一方は読み出しだけなら排他制御しなくてもアトミックでありさえすれば大丈夫だし、そういう実装はそれなりにあるよ
片方は書き出し、もう一方は読み出しだけなら排他制御しなくてもアトミックでありさえすれば大丈夫だし、そういう実装はそれなりにあるよ
832デフォルトの名無しさん
2020/05/10(日) 02:46:29.69ID:EdgxbLB4 可変長引数テンプレートから型の文字列を組み合わせて配列を定数化して取り出せるようにするために
以下のようなコードを書いたのですが、
template<typename ... ComponentsData> struct ComponentTypeGroup {
static constexpr std::size_t ComponentCount = sizeof...( ComponentsData );
static constexpr std::string_view TypeTexts[ComponentCount];
template<typename Type> constexpr void TypeGroupText( std::size_t _uIndex ) {
TypeTexts[_uIndex] = Detail::Nameof<Type>(); // 定数文字列を生成する関数です。
}
template<typename First, typename Second, typename ... ArgTypes> constexpr void TypeGroupText( std::size_t _uIndex ) {
TypeGroupText<First>( _uIndex );
TypeGroupText<Second, ArgTypes...>( _uIndex + 1 );
}
constexpr ComponentGroup(){ TypeGroupText<ComponentsData...>( 0 ); }
};
constexpr ComponentGroup()で「型指定子がありません」と出てコンパイルエラーが取れません。
何故このエラーが出ているのかがいまいちわからず、途方に暮れています。
誰かご教授いただけないでしょうか?
以下のようなコードを書いたのですが、
template<typename ... ComponentsData> struct ComponentTypeGroup {
static constexpr std::size_t ComponentCount = sizeof...( ComponentsData );
static constexpr std::string_view TypeTexts[ComponentCount];
template<typename Type> constexpr void TypeGroupText( std::size_t _uIndex ) {
TypeTexts[_uIndex] = Detail::Nameof<Type>(); // 定数文字列を生成する関数です。
}
template<typename First, typename Second, typename ... ArgTypes> constexpr void TypeGroupText( std::size_t _uIndex ) {
TypeGroupText<First>( _uIndex );
TypeGroupText<Second, ArgTypes...>( _uIndex + 1 );
}
constexpr ComponentGroup(){ TypeGroupText<ComponentsData...>( 0 ); }
};
constexpr ComponentGroup()で「型指定子がありません」と出てコンパイルエラーが取れません。
何故このエラーが出ているのかがいまいちわからず、途方に暮れています。
誰かご教授いただけないでしょうか?
833デフォルトの名無しさん
2020/05/10(日) 02:51:01.26ID:KxiPn0ce ComponentTypeGroupのtypoでなくて?
834デフォルトの名無しさん
2020/05/10(日) 03:20:50.69ID:s7BT3+bq まずそのインターコンチネンタルホテルみたいな長ったらしい名前やめろ
835デフォルトの名無しさん
2020/05/10(日) 03:25:28.56ID:wE52EU/R 古いコードの一時的メンテのため、stdとstd::tr1をC++11で混在させて使う話なんですが、
元々C++11以前のコンパイラ用に書かれた
using namespace std;
using std::tr1::shared_ptr;
shared_ptr<Hoge> hoge = ...
みたいなコードをC++11でビルドすると、C++11には std::shared_ptr があり ambiguous エラーになりますよね。
最初 share_ptr を std::shared_ptr ということにしてビルドしようかと思ったら、ところどころ std::tr1::shared_ptr と
フル宣言してあり面倒なことが判明。なので shared_ptr は std::str1::shared_ptr とみなす方針に戻りました。
なので using namepace std; を保持しつつ shared_ptr を std::tr1::shared_ptr としてビルドしたいんですが、
それって可能でしょうか? 例えば using namespace std; で std::shared_ptr を除外するようなことってできます?
古いコードを出来るだけいじらずビルドしたい、というのが一番のポイントですw
元々C++11以前のコンパイラ用に書かれた
using namespace std;
using std::tr1::shared_ptr;
shared_ptr<Hoge> hoge = ...
みたいなコードをC++11でビルドすると、C++11には std::shared_ptr があり ambiguous エラーになりますよね。
最初 share_ptr を std::shared_ptr ということにしてビルドしようかと思ったら、ところどころ std::tr1::shared_ptr と
フル宣言してあり面倒なことが判明。なので shared_ptr は std::str1::shared_ptr とみなす方針に戻りました。
なので using namepace std; を保持しつつ shared_ptr を std::tr1::shared_ptr としてビルドしたいんですが、
それって可能でしょうか? 例えば using namespace std; で std::shared_ptr を除外するようなことってできます?
古いコードを出来るだけいじらずビルドしたい、というのが一番のポイントですw
836デフォルトの名無しさん
2020/05/10(日) 03:46:29.57ID:oMXEUzlE 単に#include<tr1/memory>してstd::tr1::shared_ptrのusingを消すんではあかんの?
新しいコンパイラではstd::shared_ptrとstd::tr1::shared_ptrって同じものでしょ
新しいコンパイラではstd::shared_ptrとstd::tr1::shared_ptrって同じものでしょ
837デフォルトの名無しさん
2020/05/10(日) 05:06:37.17ID:wE52EU/R >>836
using std::tr1::shared_ptrを取るとただのshared_ptrはstd::shared_ptrになります (using namespace std)。
すると今回の場合、
std::tr1::shared_ptr<Hoge> boge; // たまにちゃんと名前空間を使ってる宣言がある
boge = shared_ptr<Hoge>(new Hoge);
みたいなコードが駄目になるようですが。
std::tr1::shared_ptrとstd::shared_ptrはとりあえず名前としては違うんじゃないですか? 違うとコンパイラー
が認識しているように見えますが。
using std::tr1::shared_ptrを取るとただのshared_ptrはstd::shared_ptrになります (using namespace std)。
すると今回の場合、
std::tr1::shared_ptr<Hoge> boge; // たまにちゃんと名前空間を使ってる宣言がある
boge = shared_ptr<Hoge>(new Hoge);
みたいなコードが駄目になるようですが。
std::tr1::shared_ptrとstd::shared_ptrはとりあえず名前としては違うんじゃないですか? 違うとコンパイラー
が認識しているように見えますが。
838デフォルトの名無しさん
2020/05/10(日) 11:05:22.30ID:sYQDYC6t 淫乱チンポメンタルヘルス?
>>838
それ、面白いと思ったのですか?
それ、面白いと思ったのですか?
840デフォルトの名無しさん
2020/05/10(日) 11:25:22.96ID:5OK5MvZd841デフォルトの名無しさん
2020/05/10(日) 11:49:35.32ID:sYQDYC6t インサートチンポレンタルホテル!
842デフォルトの名無しさん
2020/05/10(日) 12:12:32.27ID:6Ru0pW3/ >>840
> namespace std { namespace tr1 = ::std; }
おお、これで std名前空間の中に tr1 のエイリアスを定義できる感じですか?
結果 std::tr1 は ::std -> std を指す、と。
> namespace std { namespace tr1 = ::std; }
おお、これで std名前空間の中に tr1 のエイリアスを定義できる感じですか?
結果 std::tr1 は ::std -> std を指す、と。
843デフォルトの名無しさん
2020/05/10(日) 12:19:21.29ID:KGOVLWXM844デフォルトの名無しさん
2020/05/10(日) 12:49:31.40ID:uBqrUzQt コンストラクタの綴り間違えているんじゃね?
何れにしろconstexpr static memberをコンストラクタやメンバ関数内で初期化は出来ないと思うが。
やるならstatic constexpr member関数の戻り値で初期化するとかしないと
何れにしろconstexpr static memberをコンストラクタやメンバ関数内で初期化は出来ないと思うが。
やるならstatic constexpr member関数の戻り値で初期化するとかしないと
845デフォルトの名無しさん
2020/05/10(日) 13:27:57.96ID:EdgxbLB4846デフォルトの名無しさん
2020/05/10(日) 17:58:29.32ID:Pcmn53iK namespace std { inline namespace tr1 {} }
#include <memory>
#include <memory>
847デフォルトの名無しさん
2020/05/10(日) 18:02:33.35ID:LV0wbaaG std名前空間に何かするのは基本的に未定義動作に繋がるのでやめようね
848デフォルトの名無しさん
2020/05/10(日) 18:15:05.57ID:3khm8gAC カラオケで自分が歌いながら録音したカセットテープを爆音でドライブしながら女に聞かすようなものだな
これどう?オレが歌ってんだけど?的な
これどう?オレが歌ってんだけど?的な
849デフォルトの名無しさん
2020/05/10(日) 18:53:54.11ID:0gvZuU03 >>848
それ良くやる
それ良くやる
850デフォルトの名無しさん
2020/05/10(日) 19:05:46.41ID:m91+LxrO 女「さむっ・・・オープンカーかと思ったわ」
851デフォルトの名無しさん
2020/05/10(日) 19:30:31.12ID:657zsB50 >>846
どうもです、しかし自分の環境だとうまくいかないですね。gcc 5.4.0 です。
error: ‘shared_ptr’ is not a member of ‘std::tr1’
std::tr1::shared_ptr<Hoge> hoge;
^
とりあえず>>840を試してみたんですが、やってみるとインクルードファイルが意外と多く、そのほとんどに
#include <tr1/なんちゃら> があり、これらを全て tr1無しにする必要が。
コンパイラーのフラグ等でtr1無しをインクルードするようなことってできましたっけ? うわーさらに脇道。
とりあえず上記を書き直すとした場合、変更量が増えるにつれ、やっぱ全部のファイルで素直にtr1を
全部置換したほうがいいんじゃないかという気が徐々に... っておい > 自分
>>847
御意。ちなみにstdは普通の名前空間とは違うということですか?
しかし namespace の使い方の勉強になりました。いやあ色々思い付かれてすごいです。
どうもです、しかし自分の環境だとうまくいかないですね。gcc 5.4.0 です。
error: ‘shared_ptr’ is not a member of ‘std::tr1’
std::tr1::shared_ptr<Hoge> hoge;
^
とりあえず>>840を試してみたんですが、やってみるとインクルードファイルが意外と多く、そのほとんどに
#include <tr1/なんちゃら> があり、これらを全て tr1無しにする必要が。
コンパイラーのフラグ等でtr1無しをインクルードするようなことってできましたっけ? うわーさらに脇道。
とりあえず上記を書き直すとした場合、変更量が増えるにつれ、やっぱ全部のファイルで素直にtr1を
全部置換したほうがいいんじゃないかという気が徐々に... っておい > 自分
>>847
御意。ちなみにstdは普通の名前空間とは違うということですか?
しかし namespace の使い方の勉強になりました。いやあ色々思い付かれてすごいです。
852デフォルトの名無しさん
2020/05/10(日) 19:41:27.78ID:5OK5MvZd853デフォルトの名無しさん
2020/05/10(日) 21:40:19.38ID:LV0wbaaG854デフォルトの名無しさん
2020/05/11(月) 06:44:06.91ID:WjiQACf7 使われないけど標準なんです。
855デフォルトの名無しさん
2020/05/11(月) 10:06:29.78ID:ihiMo4aq 関数内で宣言した変数を途中でconst化したいときってどうやったらいいですか?
関数というのはこんな感じです
void func() {
int a;
〜aの値を設定する百行くらいの処理〜
〜aを用いたメイン処理。途中で誤ってaを変更しないようにしたい〜
}
aをconstで宣言しておいてaを設定するところはconst_castするというのはやりたくないです。
初期化用関数initializeを作って const int a = initialize(〜); とするしか方法はないですか?
できればそれもしたくないのですが
関数というのはこんな感じです
void func() {
int a;
〜aの値を設定する百行くらいの処理〜
〜aを用いたメイン処理。途中で誤ってaを変更しないようにしたい〜
}
aをconstで宣言しておいてaを設定するところはconst_castするというのはやりたくないです。
初期化用関数initializeを作って const int a = initialize(〜); とするしか方法はないですか?
できればそれもしたくないのですが
856デフォルトの名無しさん
2020/05/11(月) 10:09:55.63ID:MhpqGE2N &a にアクセスする権限を readonly にするとか
環境依存だろうけど
環境依存だろうけど
857デフォルトの名無しさん
2020/05/11(月) 10:13:30.52ID:vLTbwMZ+ >>855
a に設定する値を求める処理を関数化して、その戻り値でconstのaを初期化する。
a に設定する値を求める処理を関数化して、その戻り値でconstのaを初期化する。
858デフォルトの名無しさん
2020/05/11(月) 10:14:29.69ID:vLTbwMZ+ あ、したくないって書いてあったね
859デフォルトの名無しさん
2020/05/11(月) 10:18:49.75ID:m+8/4tPw860デフォルトの名無しさん
2020/05/11(月) 10:53:26.16ID:ihiMo4aq861デフォルトの名無しさん
2020/05/11(月) 11:22:30.96ID:rmb+jfMY どうしてもなら、こうだな
int a_;
//a_で初期化処理をする
int const& a = a_;
//aはconst
int a_;
//a_で初期化処理をする
int const& a = a_;
//aはconst
862デフォルトの名無しさん
2020/05/11(月) 11:26:38.90ID:rmb+jfMY アホらしいけど、こんな手も考えられる
struct sample
{
int a;
void func() {
//初期化処理
std::as_const(*this).func();
}
void func() const {
//aをconst扱い
}
};
struct sample
{
int a;
void func() {
//初期化処理
std::as_const(*this).func();
}
void func() const {
//aをconst扱い
}
};
863デフォルトの名無しさん
2020/05/11(月) 11:30:27.88ID:tShYcoYg 後半をlambda化すれば
aをコピーキャプチャしてmutableにしなければconstになる
aをコピーキャプチャしてmutableにしなければconstになる
864はちみつ餃子 ◆8X2XSCHEME
2020/05/11(月) 11:37:55.81ID:pGzfxkdL GCC や Clang の拡張を使ってよいならこういう書き方は出来る。
void func() {
const int a = ({int a; a=1; a;}); // ブロック内で初期化処理を書いて値を返す
std::cout << a << std::endl; // メイン処理
}
たぶん >>855 が考えている用途だとこれが一番楽なんじゃなかろうかと思うんだけど、
標準ではないってのはやっぱりネックになってくるな。
void func() {
const int a = ({int a; a=1; a;}); // ブロック内で初期化処理を書いて値を返す
std::cout << a << std::endl; // メイン処理
}
たぶん >>855 が考えている用途だとこれが一番楽なんじゃなかろうかと思うんだけど、
標準ではないってのはやっぱりネックになってくるな。
865デフォルトの名無しさん
2020/05/11(月) 11:54:09.12ID:WjiQACf7 constウイルスw
866デフォルトの名無しさん
2020/05/11(月) 12:17:38.26ID:oXH9qZIA ポインタ使えばいいのに
const付きのポインタを宣言だけしといて初期化のスコープ内でアドレス渡せばいい
const付きのポインタを宣言だけしといて初期化のスコープ内でアドレス渡せばいい
867デフォルトの名無しさん
2020/05/11(月) 12:21:06.88ID:vUv7mwxB >>860
RAII教に入信しておとなしく初期化ラムダ関数を使うがよい
RAII教に入信しておとなしく初期化ラムダ関数を使うがよい
868デフォルトの名無しさん
2020/05/11(月) 14:54:10.97ID:NX9zuntd IT掲示板群 ttp://x0000.net/forum.aspx?id=15
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0
869デフォルトの名無しさん
2020/05/11(月) 14:54:11.07ID:NX9zuntd IT掲示板群 ttp://x0000.net/forum.aspx?id=15
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など
simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0
870デフォルトの名無しさん
2020/05/11(月) 14:58:27.84ID:vIusnhzf871デフォルトの名無しさん
2020/05/11(月) 15:01:13.87ID:vIusnhzf 変数名として灰化の用にすればわかりやすいかもしれない。
物理学では、a0 は、a の初期値を意味することが多いので、学術的にも分かり易い。
int a0;
(a0 に対する初期化処理);
const int &a = a0;
(a を読み取るだけの処理);
物理学では、a0 は、a の初期値を意味することが多いので、学術的にも分かり易い。
int a0;
(a0 に対する初期化処理);
const int &a = a0;
(a を読み取るだけの処理);
872デフォルトの名無しさん
2020/05/11(月) 15:02:26.79ID:rdm6Cg4w873デフォルトの名無しさん
2020/05/11(月) 15:28:25.94ID:ZT/W926b a0がスコープから消えないのは片手落ち
どのみちトリッキーなことして読み手を混乱させることしない方がいい
単純にスコープを一画面に収まるぐらいに短くしろ
どのみちトリッキーなことして読み手を混乱させることしない方がいい
単純にスコープを一画面に収まるぐらいに短くしろ
874デフォルトの名無しさん
2020/05/11(月) 15:33:11.51ID:rmb+jfMY キモい個人サイトの宣伝をNG登録っと
875デフォルトの名無しさん
2020/05/11(月) 16:16:12.98ID:rdm6Cg4w876デフォルトの名無しさん
2020/05/11(月) 16:35:15.76ID:gZOsi0FN 処理を途中で止めて、変数とかvectorの中身を確認したりするソフト知らない?
877デフォルトの名無しさん
2020/05/11(月) 16:37:43.30ID:rdm6Cg4w >>873
以下のようにすればその問題も一応は解決する。
int a;
(a に対する初期化処理);
{
const int &a0 = a;
const int &a = a0; // 外の a とは別の a を宣言。
(a を読み取るだけの処理);
}
さらに
#define XXX(_x_) const int &_x_##0 = _x_; const int &_x_ = _x_##0
というマクロを導入すれば、
int a;
(a に対する初期化処理);
{
XXX(a);
(a を読み取るだけの処理);
}
でいける。
以下のようにすればその問題も一応は解決する。
int a;
(a に対する初期化処理);
{
const int &a0 = a;
const int &a = a0; // 外の a とは別の a を宣言。
(a を読み取るだけの処理);
}
さらに
#define XXX(_x_) const int &_x_##0 = _x_; const int &_x_ = _x_##0
というマクロを導入すれば、
int a;
(a に対する初期化処理);
{
XXX(a);
(a を読み取るだけの処理);
}
でいける。
878デフォルトの名無しさん
2020/05/11(月) 16:38:36.67ID:rdm6Cg4w879デフォルトの名無しさん
2020/05/11(月) 16:59:50.23ID:rmb+jfMY >>876
Visual Studioに標準で入ってるよ
Visual Studioに標準で入ってるよ
880デフォルトの名無しさん
2020/05/11(月) 17:54:34.39ID:ihiMo4aq やはり大人しく初期化関数使います
いろいろとアドバイスありがとうございました
いろいろとアドバイスありがとうございました
881デフォルトの名無しさん
2020/05/11(月) 18:09:25.84ID:UkUll7O4 幅優先探索において座標によって侵入コストが均一でない場合に対応するためにプライオリティキューを用いて、
スタート地点からの総移動コスト値(int)を格納する2次元配列と、
それに対応するインデックスとなる座標を格納する構造体(POINT)で実装したいのですが、
ProgrammingPlacePlusというサイトのC++編の「標準ライブラリ」の第12章(priority_queue)のサンプルコードに習って、
使用コンテナがvectorの場合はうまくいくのですが、listにするとコンパイルエラーになってしまいます
int move_cost[256][256];
bool operator >( POINT a, POINT b )
{
return ( move_cost[a.y][a.x] > move_cost[b.y][b.x] );
}
//vector版
std::priority_queue< POINT, std::vector<POINT>, std::greater<POINT> > vector_prio_que;
//list版
std::priority_queue< POINT, std::list<POINT>, std::greater<POINT> > list_prio_que;
初心者ですみません
どうすればlistでも動作させられるのかご教示頂けませんでしょうか
スタート地点からの総移動コスト値(int)を格納する2次元配列と、
それに対応するインデックスとなる座標を格納する構造体(POINT)で実装したいのですが、
ProgrammingPlacePlusというサイトのC++編の「標準ライブラリ」の第12章(priority_queue)のサンプルコードに習って、
使用コンテナがvectorの場合はうまくいくのですが、listにするとコンパイルエラーになってしまいます
int move_cost[256][256];
bool operator >( POINT a, POINT b )
{
return ( move_cost[a.y][a.x] > move_cost[b.y][b.x] );
}
//vector版
std::priority_queue< POINT, std::vector<POINT>, std::greater<POINT> > vector_prio_que;
//list版
std::priority_queue< POINT, std::list<POINT>, std::greater<POINT> > list_prio_que;
初心者ですみません
どうすればlistでも動作させられるのかご教示頂けませんでしょうか
882デフォルトの名無しさん
2020/05/11(月) 18:20:43.09ID:rmb+jfMY883デフォルトの名無しさん
2020/05/11(月) 19:14:29.12ID:UkUll7O4 priority_queueの内部使用コンテナとしては、vector、list、dequeは条件を満たしていると書いてあったので、できるはずだと思ったのですが…
priority_queueは、topメンバ関数で最も優先度の高い要素にしかアクセスできず、
自分で書いたソースでは添え字やイテレータによる直接のアクセスは行っていない
(メンバ関数も、.push .pop .top .emptyしか呼び出していない)のですが、
コンパイルエラーの表示では、ご指摘のとおりリバースイテレータがどうのと出ていました
error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)'
:テンプレート引数を 'const std::reverse_iterator<_RanIt> &'に対して 'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
'std::operator -' の宣言を確認してください。
これは内部的にイテレータの操作がされておりそこでエラーになっている感じなのでしょうか?
algorithmやxutilityの該当箇所を見ても難しすぎてわかりませんorz
priority_queueは、topメンバ関数で最も優先度の高い要素にしかアクセスできず、
自分で書いたソースでは添え字やイテレータによる直接のアクセスは行っていない
(メンバ関数も、.push .pop .top .emptyしか呼び出していない)のですが、
コンパイルエラーの表示では、ご指摘のとおりリバースイテレータがどうのと出ていました
error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)'
:テンプレート引数を 'const std::reverse_iterator<_RanIt> &'に対して 'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
'std::operator -' の宣言を確認してください。
これは内部的にイテレータの操作がされておりそこでエラーになっている感じなのでしょうか?
algorithmやxutilityの該当箇所を見ても難しすぎてわかりませんorz
>>864
例の奴ですね、ならば、ここはラムダ式の出番でしょう、ラムダ式を定義して即評価します
const int a = [](){int a; a = 1; return a; }();
私以外にもこういうのを希望する人がいるということで、安心しました
例の奴ですね、ならば、ここはラムダ式の出番でしょう、ラムダ式を定義して即評価します
const int a = [](){int a; a = 1; return a; }();
私以外にもこういうのを希望する人がいるということで、安心しました
885デフォルトの名無しさん
2020/05/11(月) 19:28:56.75ID:VXScjWrk > priority_queueの内部使用コンテナとしては、vector、list、dequeは条件を満たしていると書いてあったので
それってどこ情報?
軽くググった限りだと、vector、dequeしか出てこないけど
それってどこ情報?
軽くググった限りだと、vector、dequeしか出てこないけど
886デフォルトの名無しさん
2020/05/11(月) 19:48:22.07ID:UkUll7O4 Programming Place Plus というサイトで配布されていた オフライン版(2019-07-01更新版)の C++編の「標準ライブラリ」の第12章(priority_queue)に書いてありました
887デフォルトの名無しさん
2020/05/11(月) 20:14:46.80ID:1e8qKpQP888デフォルトの名無しさん
2020/05/11(月) 20:21:27.91ID:UkUll7O4 vectorの部分をdequeに替えたら問題なく動作したので、対応してるのvectorとdequeだけの可能性高そう
できゅーならできる、なんちゃって
できゅーならできる、なんちゃって
889デフォルトの名無しさん
2020/05/11(月) 20:42:44.27ID:LZ5jZAGa (デックなんだけど楽しそうだから黙っとこう…)
890デフォルトの名無しさん
2020/05/11(月) 20:48:20.73ID:oppF2e3I >>886
そのサイトが取り違えている
https://cpprefjp.github.io/reference/queue/queue.html
>要件を満たすものとしては deque と list
queue | Programming Place Plus C++編【標準ライブラリ】 第11章
https://programming-place.net/ppp/contents/cpp/library/011.html
>Container には、vector(第5章) や list(第6章)
***
https://cpprefjp.github.io/reference/queue/priority_queue.html
>要件を満たすものとしてはvectorとdeque
priority_queue | Programming Place Plus C++編【標準ライブラリ】 第12章
https://programming-place.net/ppp/contents/cpp/library/012.html
>Container には、deque(第7章) や list(第6章)
そのサイトが取り違えている
https://cpprefjp.github.io/reference/queue/queue.html
>要件を満たすものとしては deque と list
queue | Programming Place Plus C++編【標準ライブラリ】 第11章
https://programming-place.net/ppp/contents/cpp/library/011.html
>Container には、vector(第5章) や list(第6章)
***
https://cpprefjp.github.io/reference/queue/priority_queue.html
>要件を満たすものとしてはvectorとdeque
priority_queue | Programming Place Plus C++編【標準ライブラリ】 第12章
https://programming-place.net/ppp/contents/cpp/library/012.html
>Container には、deque(第7章) や list(第6章)
891デフォルトの名無しさん
2020/05/11(月) 21:01:34.17ID:UkUll7O4 そこのサイト詳しくわかりやすく解説してくれているから頼りにしていたのですけど、間違いがあるとは残念ですね…
vectorは要素をずらしたりコピーしたりで実行速度が遅そうだと思ってlistを使いたかったのですが、
素人考えでしたかね
vectorは要素をずらしたりコピーしたりで実行速度が遅そうだと思ってlistを使いたかったのですが、
素人考えでしたかね
892デフォルトの名無しさん
2020/05/11(月) 21:10:39.83ID:1x7ET1G/ dequeでよくね
893デフォルトの名無しさん
2020/05/11(月) 21:30:43.10ID:rmb+jfMY894デフォルトの名無しさん
2020/05/11(月) 21:33:07.54ID:M5DpbX0A >>883
std::priority_queue
https://cpprefjp.github.io/reference/queue/priority_queue.html
ここには、vector・dequeがあると書いてある。
list は書いていない
std::priority_queue
https://cpprefjp.github.io/reference/queue/priority_queue.html
ここには、vector・dequeがあると書いてある。
list は書いていない
895デフォルトの名無しさん
2020/05/11(月) 21:37:14.43ID:VXScjWrk priority_queueって内部実装がヒープみたいだから、
末尾にしか追加削除しないと思われるので、vectorで十分では
末尾にしか追加削除しないと思われるので、vectorで十分では
896デフォルトの名無しさん
2020/05/11(月) 21:45:02.52ID:1e8qKpQP コンセプトがくればこういう悲しい出来事も減るのかな
897デフォルトの名無しさん
2020/05/11(月) 21:47:53.20ID:zAHWYKkR C++って何作れば勉強になるんだろ
898デフォルトの名無しさん
2020/05/11(月) 21:54:43.39ID:UkUll7O4 縦10マス×横40マスの地図で幅優先探索を100回まわして時間計ったら、
vectorだと989ms
dequeだと904ms
で大差ないかんじでした
デフォルトのままvectorを利用していきたいと思います
アドバイス下さいました熟練者の皆さまありがとうございましたm(_ _)m
vectorだと989ms
dequeだと904ms
で大差ないかんじでした
デフォルトのままvectorを利用していきたいと思います
アドバイス下さいました熟練者の皆さまありがとうございましたm(_ _)m
899デフォルトの名無しさん
2020/05/11(月) 22:38:15.90ID:M5DpbX0A 漏れは、2分ヒープを自分で作って、ソートしたりしたけど、
配列の[0]は使わず、[1]から始めると計算が楽なので、
親1, 左右の子は2, 3で、法則は親n, 子2n, 2n+1
コンテナの最後にオブジェクトを追加し、
それが親の数値より小さい場合は、
再帰的に親と交換していく (親子を交換)
再帰的に、親は両方の子以下の数値をもつ。
左右の子(兄弟)の大小関係は考慮しない
配列の先頭要素[1]をPopし、配列の最後の要素を、
[1]に持ってきて、そこから再帰的に、左右の子と比べながら、
子の数値より大きい場合は、入れ替える
ピッコロ大魔王は、これよりもさらに効率的な方法を言ってたけど
このアルゴリズムでは、deque のリンクは不要だろ?
親n, 子2n, 2n+1 で、メモリの場所が分かるのでは?
配列の[0]は使わず、[1]から始めると計算が楽なので、
親1, 左右の子は2, 3で、法則は親n, 子2n, 2n+1
コンテナの最後にオブジェクトを追加し、
それが親の数値より小さい場合は、
再帰的に親と交換していく (親子を交換)
再帰的に、親は両方の子以下の数値をもつ。
左右の子(兄弟)の大小関係は考慮しない
配列の先頭要素[1]をPopし、配列の最後の要素を、
[1]に持ってきて、そこから再帰的に、左右の子と比べながら、
子の数値より大きい場合は、入れ替える
ピッコロ大魔王は、これよりもさらに効率的な方法を言ってたけど
このアルゴリズムでは、deque のリンクは不要だろ?
親n, 子2n, 2n+1 で、メモリの場所が分かるのでは?
900はちみつ餃子 ◆8X2XSCHEME
2020/05/12(火) 00:41:18.87ID:NsC/lgb+901デフォルトの名無しさん
2020/05/12(火) 01:32:23.54ID:nCmEHjd6 >>899
なるほど、n, 2n, 2n+1 番の要素に格納してゆくかんじですか、素晴らしいアイデアですね
自力での実装がどうしても必要になったら、配列で作るときのヒントにさせていただきますね
>vectorだと989ms
探索1回あたり10msもかかるのはちょっとおかしいだろうと思って見直したら、
ソリューション構成をDebugにして、「デバッグ開始」してるせいでした
ソリューション構成をReleaseにして、「デバッグなしで開始」にしたら、
探索1回あたり0.02ms弱に収まりました(vector使用時)
STLコンテナ使っててデバッグモードだと500倍も遅くなりうるのか…
ちなみにdeque使用時は0.05msでやや遅めだったのでやはりvectorを使う方がよさそう
なるほど、n, 2n, 2n+1 番の要素に格納してゆくかんじですか、素晴らしいアイデアですね
自力での実装がどうしても必要になったら、配列で作るときのヒントにさせていただきますね
>vectorだと989ms
探索1回あたり10msもかかるのはちょっとおかしいだろうと思って見直したら、
ソリューション構成をDebugにして、「デバッグ開始」してるせいでした
ソリューション構成をReleaseにして、「デバッグなしで開始」にしたら、
探索1回あたり0.02ms弱に収まりました(vector使用時)
STLコンテナ使っててデバッグモードだと500倍も遅くなりうるのか…
ちなみにdeque使用時は0.05msでやや遅めだったのでやはりvectorを使う方がよさそう
902899
2020/05/12(火) 02:06:26.24ID:q3FkXSvr 普通の実装では、[0]から始めると、
親0, 左右の子は1, 2で、親1, 左右の子は3, 4で、
親n, 子2n+1, 2n+2、となり複雑
子3なら親は、(3-1)/2 = 1
子4なら親は、(4-1)/2 = 1.5 で、切り捨てて1
>>899
では、配列の[0]は使わない。[1]から始めると計算が楽
親1, 左右の子は2, 3で、親n, 子2n, 2n+1
子2なら親は、2/2 = 1
子3なら親は、3/2 = 1.5 で、切り捨てて1
親0, 左右の子は1, 2で、親1, 左右の子は3, 4で、
親n, 子2n+1, 2n+2、となり複雑
子3なら親は、(3-1)/2 = 1
子4なら親は、(4-1)/2 = 1.5 で、切り捨てて1
>>899
では、配列の[0]は使わない。[1]から始めると計算が楽
親1, 左右の子は2, 3で、親n, 子2n, 2n+1
子2なら親は、2/2 = 1
子3なら親は、3/2 = 1.5 で、切り捨てて1
903デフォルトの名無しさん
2020/05/12(火) 09:47:29.30ID:9iboxsgQ 呼び出し履歴で過去の状態に戻れるのは、記録してるからだし。
904デフォルトの名無しさん
2020/05/12(火) 11:15:54.23ID:4WwqN1hQ dequeue一択
905デフォルトの名無しさん
2020/05/12(火) 11:26:05.76ID:xLvzOPR4 そういえばdeque使ってよかったって経験ないなぁ
906デフォルトの名無しさん
2020/05/12(火) 11:33:14.56ID:8l4UOEBM heap構造ならvectorが速いよね
事前に適切なサイズでreserveしておけば再配置も起きないし
事前に適切なサイズでreserveしておけば再配置も起きないし
907デフォルトの名無しさん
2020/05/12(火) 11:52:31.54ID:Jgs88fl2 前後にニョキニョキ伸ばすような用途だとdequeが一番よ
908デフォルトの名無しさん
2020/05/12(火) 12:41:24.29ID:ph0RCKO5 複数のソース・ヘッダーファイルのセットから一つの動的dllは作れないのでしょうか?
910デフォルトの名無しさん
2020/05/12(火) 13:34:11.63ID:ph0RCKO5911はちみつ餃子 ◆8X2XSCHEME
2020/05/12(火) 13:43:29.89ID:NsC/lgb+912デフォルトの名無しさん
2020/05/12(火) 14:09:57.20ID:j/0vQ47K 何が困っているのかさっぱりだぜ
リンカでdllにするんだろ
複数のオブジェクトファイルをリンクすることになんの疑問が
リンカでdllにするんだろ
複数のオブジェクトファイルをリンクすることになんの疑問が
913デフォルトの名無しさん
2020/05/12(火) 14:15:34.04ID:9Z5koysX BASICとかやってた部類の人間だとリンクの概念とかわからんかもね
914デフォルトの名無しさん
2020/05/12(火) 14:17:43.22ID:9Z5koysX そういう化石の人がつい最近いじりはじめた可能性もある
915はちみつ餃子 ◆8X2XSCHEME
2020/05/12(火) 14:18:45.89ID:NsC/lgb+ コマンドラインから使うときでもだいたいコンパイラドライバが
いい感じにやってくれるから細かなことまで意識する機会も
あまり無いしな。
いい感じにやってくれるから細かなことまで意識する機会も
あまり無いしな。
916デフォルトの名無しさん
2020/05/12(火) 14:24:47.83ID:9Z5koysX 昔は依存関係調べるメイクファイルビルダーみたいなの使ってたけど
今はそこら辺もコンパイラが全自動で全部やってくれる
今はそこら辺もコンパイラが全自動で全部やってくれる
917デフォルトの名無しさん
2020/05/12(火) 14:24:51.94ID:s06VnCgE なんかデジャブ…
つい数日前にもまとめてlib化はできるけどdll化できないって質問があったような…
つい数日前にもまとめてlib化はできるけどdll化できないって質問があったような…
918デフォルトの名無しさん
2020/05/12(火) 14:24:57.48ID:SVn+5d28 >>912
おそらく本人は何も分かっていない、何が分かっていないか分からない、書いてあったことを真似るしか出来ない、ということなんだと思う。
おそらく本人は何も分かっていない、何が分かっていないか分からない、書いてあったことを真似るしか出来ない、ということなんだと思う。
919デフォルトの名無しさん
2020/05/12(火) 14:30:14.06ID:9Z5koysX 写経から悟りを得るかどうかの瀬戸際という辺りか
920デフォルトの名無しさん
2020/05/12(火) 14:32:49.45ID:0QBBSU9v 40年前の子供向けBASIC雑誌ですら動的生成を当たり前のようにしてたのになに言ってんだか
C++は何十年遅れてるのってレベル。ゲイツ舐めすぎ。おまえらはジョブス以下。
C++は何十年遅れてるのってレベル。ゲイツ舐めすぎ。おまえらはジョブス以下。
921デフォルトの名無しさん
2020/05/12(火) 15:24:55.89ID:j/0vQ47K プログラムからコンパイラ呼び出して動的ライブラリ作って呼び出せばいいじゃん
923デフォルトの名無しさん
2020/05/12(火) 19:33:06.04ID:zY2j7Z+k MacだとCMakeが便利だった。
924デフォルトの名無しさん
2020/05/12(火) 19:38:18.80ID:HKiNDHJQ 即時実行されるlambdaなんて
文法上殆んどblock変わらん見た目で、
最適化かければ性能上もblockと変わらんだろ
[&]{
}();
文法上殆んどblock変わらん見た目で、
最適化かければ性能上もblockと変わらんだろ
[&]{
}();
925デフォルトの名無しさん
2020/05/12(火) 19:48:18.72ID:Jgs88fl2 即実行ラムダのインライン展開って本当にやってくれるの?
もちろんプログラマとしては期待するところだけど本当に主要コンパイラがやってるか誰か検証してる?
もちろんプログラマとしては期待するところだけど本当に主要コンパイラがやってるか誰か検証してる?
926デフォルトの名無しさん
2020/05/12(火) 20:13:21.67ID:Qfzty+97 一回しか呼ばれないんならインラインも糞も無い罠
927デフォルトの名無しさん
2020/05/12(火) 20:26:40.11ID:HKiNDHJQ928デフォルトの名無しさん
2020/05/12(火) 20:28:32.15ID:u3gpKmNT 普通の関数コールだって呼び元が1箇所ならインライン展開する
929デフォルトの名無しさん
2020/05/12(火) 20:38:00.80ID:Jgs88fl2 そっかMSVCがやってるなら当然みんなやってるわな
サンクス
サンクス
930デフォルトの名無しさん
2020/05/12(火) 20:38:53.13ID:u3gpKmNT いやそんな事もないけど
>>924
式しかかけない場所というのがあって、そういう場所では文では駄目ですね
式しかかけない場所というのがあって、そういう場所では文では駄目ですね
932デフォルトの名無しさん
2020/05/12(火) 21:12:01.75ID:sL+fzMl7 set::insert()で警告が出るんですが、なんででしょう?vc2015です。
std::set<int> items;
items.insert(1); // ここで警告 C4800
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\utility(175): warning C4800: 'int': ブール値を 'true' または 'false' に強制的に設定します
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xtree(1823): note: コンパイル対象の関数 テンプレート インスタンス化 'std::pair<std::_Tree_const_iterator<・・・
std::set<int> items;
items.insert(1); // ここで警告 C4800
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\utility(175): warning C4800: 'int': ブール値を 'true' または 'false' に強制的に設定します
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xtree(1823): note: コンパイル対象の関数 テンプレート インスタンス化 'std::pair<std::_Tree_const_iterator<・・・
933デフォルトの名無しさん
2020/05/12(火) 21:13:55.56ID:u3gpKmNT 書いてある通りじゃね?
934デフォルトの名無しさん
2020/05/12(火) 22:10:57.80ID:sL+fzMl7935デフォルトの名無しさん
2020/05/12(火) 22:13:18.80ID:8l4UOEBM コンパイラを代える
936デフォルトの名無しさん
2020/05/13(水) 03:55:06.92ID:FY0MfQzC std::set<int> items;
items.insert((int)1); //明示的キャスト
items.insert((int)1); //明示的キャスト
937デフォルトの名無しさん
2020/05/13(水) 03:57:56.39ID:4cp2IEvR なんでintのコンテナにint突っ込もうとしたら型警告出るんだろうな?
やっぱMSVCってクソだわ
やっぱMSVCってクソだわ
938デフォルトの名無しさん
2020/05/13(水) 06:13:43.32ID:k7uwq6xu std::set::inster() の引数でbool型が優先されるのか。
どういうオーバーロードが作用してるんだろう。
どういうオーバーロードが作用してるんだろう。
939デフォルトの名無しさん
2020/05/13(水) 06:24:21.32ID:nnLD0aa0 >>929
頭悪すぎw
頭悪すぎw
940デフォルトの名無しさん
2020/05/13(水) 06:25:48.91ID:nnLD0aa0 >>937
おまえがウジ虫だからだよw
おまえがウジ虫だからだよw
941938
2020/05/13(水) 08:02:38.51ID:k7uwq6xu 誤; std::set::inster()
正: std::set::insert()
1文字での入れ替わりは珍しくないけど、2字ずれちゃったのは何故だ?
正: std::set::insert()
1文字での入れ替わりは珍しくないけど、2字ずれちゃったのは何故だ?
942デフォルトの名無しさん
2020/05/13(水) 08:08:13.33ID:OofdoMNm 両手でタイプしているとタイミングのずれでそうなることがある
943デフォルトの名無しさん
2020/05/13(水) 08:09:03.26ID:OofdoMNm しかしs, e, r, tすべて左手だな
944デフォルトの名無しさん
2020/05/13(水) 09:04:32.56ID:JcjM8CgX ドッペルゲンガーだろね。
945デフォルトの名無しさん
2020/05/13(水) 11:24:17.11ID:FY0MfQzC 即席打法inster
946デフォルトの名無しさん
2020/05/13(水) 12:06:10.95ID:xXY8eqGW >>922
自分も同じです
複数の変数の同時初期化が必要な場合も、前はタプルを返してたけど
c++17の構造化束縛のおかげでずいぶんスマートに書けるようになったと思う
こんな感じで
int i = 2;
int j = 3;
const auto [m, n] = [&](){ return make_tuple(i + j, i - j); }();
make_tupleの代わりにforward_as_tupleを使うと推論がうまくいかないことがあるけどラムダ式だからそんなもんかな
自分も同じです
複数の変数の同時初期化が必要な場合も、前はタプルを返してたけど
c++17の構造化束縛のおかげでずいぶんスマートに書けるようになったと思う
こんな感じで
int i = 2;
int j = 3;
const auto [m, n] = [&](){ return make_tuple(i + j, i - j); }();
make_tupleの代わりにforward_as_tupleを使うと推論がうまくいかないことがあるけどラムダ式だからそんなもんかな
947デフォルトの名無しさん
2020/05/13(水) 12:16:08.66ID:VSt/R8YQ948デフォルトの名無しさん
2020/05/13(水) 13:45:03.91ID:OofdoMNm C++17が現行規格で、C++14以前は廃止規格
ただし国内ではC++03が現行規格
ただし国内ではC++03が現行規格
949デフォルトの名無しさん
2020/05/13(水) 13:48:57.81ID:hlRp6n7l 妙な理解してるな
950デフォルトの名無しさん
2020/05/13(水) 18:26:46.18ID:4cp2IEvR 合ってるでしょ
JISの最新C++規格はC++03相当の翻訳(誤字誤訳脱文多数)で、今もそれが日本国内の正式な規格
従うメリットはないです
JISの最新C++規格はC++03相当の翻訳(誤字誤訳脱文多数)で、今もそれが日本国内の正式な規格
従うメリットはないです
951はちみつ餃子 ◆8X2XSCHEME
2020/05/13(水) 20:14:04.10ID:/XT35uGg ISO は国際的な性格をもつ機関で JIS は日本の機関だけど、
ISO の規格の全てが全世界で通用するわけではないし、
JIS 規格が日本国内だけの効力というわけでもない。
法律に反しない範囲で当事者の合意があればどんな規格だって有効だよ。
規格化活動の便宜のためにそれぞれが独立して活動してるだけなんで、
「JIS は」ならともかく「国内では」みたいな理解は誤り。
あと、「改正前」と「廃止」は別物。
ISO の規格の全てが全世界で通用するわけではないし、
JIS 規格が日本国内だけの効力というわけでもない。
法律に反しない範囲で当事者の合意があればどんな規格だって有効だよ。
規格化活動の便宜のためにそれぞれが独立して活動してるだけなんで、
「JIS は」ならともかく「国内では」みたいな理解は誤り。
あと、「改正前」と「廃止」は別物。
952デフォルトの名無しさん
2020/05/13(水) 21:36:34.19ID:OofdoMNm よっぽど決まりを守りたくないんだね
そういう人を説得しようとは思わない
そういう人を説得しようとは思わない
>>952
例えば、JIS が C++03 までしかない、からといって国内では C++11 or later が無効、というわけではないと思います
また「C++14 は廃止された」という言い方はそもそも変です
現時点で C++14 で記述するという「決まり」を立てて C++14 でソフトウェアを作成するとどんな問題が発生するのですか?
あなたのいう「決まり」とはなんですか?
例えば、JIS が C++03 までしかない、からといって国内では C++11 or later が無効、というわけではないと思います
また「C++14 は廃止された」という言い方はそもそも変です
現時点で C++14 で記述するという「決まり」を立てて C++14 でソフトウェアを作成するとどんな問題が発生するのですか?
あなたのいう「決まり」とはなんですか?
954デフォルトの名無しさん
2020/05/13(水) 22:04:10.21ID:KT7abTkK >>952
なんだこのバカ
なんだこのバカ
955デフォルトの名無しさん
2020/05/13(水) 22:28:38.42ID:NqwOCnph C++03でもC++11でも何でも良い
空気を読んでコードが書ければ
組み込みだといまだにC++03の環境も多くあるから
C++03だけでも書けた方が良いし
C++14の機能を使ったコードが読めないのもマズい
空気を読んでコードが書ければ
組み込みだといまだにC++03の環境も多くあるから
C++03だけでも書けた方が良いし
C++14の機能を使ったコードが読めないのもマズい
956デフォルトの名無しさん
2020/05/13(水) 22:31:02.14ID:NqwOCnph #defineで動いていて評価も終わってるコードを
わざわざconstexprやインライン関数に書き換えるようなアホな事はするなよ
わざわざconstexprやインライン関数に書き換えるようなアホな事はするなよ
957デフォルトの名無しさん
2020/05/13(水) 22:56:06.50ID:FY0MfQzC constexprはそんなバカコード修正するために在るものじゃないし
958デフォルトの名無しさん
2020/05/13(水) 23:33:51.70ID:RlNw0pdB 壊れていなくても直す…!
959デフォルトの名無しさん
2020/05/13(水) 23:39:11.22ID:FY0MfQzC カチャカチャやらなくてもそのうちバカコードをAIが直す時代がくるさ
シンギュラリティは近い
シンギュラリティは近い
960デフォルトの名無しさん
2020/05/13(水) 23:52:49.48ID:j5LG6G0L constexprは既存コードを壊すために在る
961デフォルトの名無しさん
2020/05/13(水) 23:59:58.84ID:GrmX4NGu constexpr大好き
962デフォルトの名無しさん
2020/05/14(木) 00:50:00.59ID:9MnQCjc/ コンスとエクスパ
963デフォルトの名無しさん
2020/05/14(木) 02:04:29.95ID:pTsZ6lRN #define N 100
#define square(x) ((x)*(x))
// 気持ちわる
#define square(x) ((x)*(x))
// 気持ちわる
964デフォルトの名無しさん
2020/05/14(木) 05:49:32.41ID:IJMYY156965デフォルトの名無しさん
2020/05/14(木) 07:15:55.89ID:Qhhsb9+b C++17には待ってましたという有り難い機能が色々あるのに
付いて来れない低脳に迎合するために使用禁止とか愚の骨頂だ
足引っ張るなぼけ
付いて来れない低脳に迎合するために使用禁止とか愚の骨頂だ
足引っ張るなぼけ
966デフォルトの名無しさん
2020/05/14(木) 07:16:46.37ID:Qhhsb9+b 不勉強は罪だぞ技術職では
967デフォルトの名無しさん
2020/05/14(木) 08:03:23.02ID:IJMYY156 >>965
冗談はよし子さんw 待ってましたって自分で実装せずに待ってたの? ただの低スキルプログラマじゃんw
C++はいつも十年遅れて標準化するから使われない機能満載だよ。
stringが必要とされたのはいつですか? 実行時型情報が必要とされたのはいつですか? マルチスレッドが使われるようになったのはいつですか?
キミは30年遅れてるんだよ。時代錯誤君。だから糞遅いJavaに簡単にシェア抜かれるんだよ。
冗談はよし子さんw 待ってましたって自分で実装せずに待ってたの? ただの低スキルプログラマじゃんw
C++はいつも十年遅れて標準化するから使われない機能満載だよ。
stringが必要とされたのはいつですか? 実行時型情報が必要とされたのはいつですか? マルチスレッドが使われるようになったのはいつですか?
キミは30年遅れてるんだよ。時代錯誤君。だから糞遅いJavaに簡単にシェア抜かれるんだよ。
968デフォルトの名無しさん
2020/05/14(木) 08:14:52.77ID:Qhhsb9+b 構造化バインディングなんか自分で実装できるわけねえだろアホ
何も知らないやつが頓珍漢なこと言ってんな
何も知らないやつが頓珍漢なこと言ってんな
969デフォルトの名無しさん
2020/05/14(木) 08:17:40.36ID:Qhhsb9+b それでプロとは笑わせるぜ
まあ、いるけどねHDDを指さしてメモリと言ったり
MTTR/MTBFを知らない「プロ」も世の中には
まあ、いるけどねHDDを指さしてメモリと言ったり
MTTR/MTBFを知らない「プロ」も世の中には
970デフォルトの名無しさん
2020/05/14(木) 08:18:39.38ID:jtTfGo9Q Javaって言うほど遅いか
競プロに最適化問題を競って解く分野があるが、Java使いで世界トップクラスの選手複数いる
競プロに最適化問題を競って解く分野があるが、Java使いで世界トップクラスの選手複数いる
971デフォルトの名無しさん
2020/05/14(木) 08:25:55.19ID:IJMYY156 >>968
まずは構造化バインディングの話をしようか。
キミはいつ頃この機能が必要になったのか、何の実装に必要になったのか詳しく聞かせてくれ。
そしてこの機能で今までどういった素晴らしいソフトを作ってきたのか紹介してくれ。
キミほどの優秀な技術者なら著名なプロジェクトを多数参加しているだろうしな。
まずは構造化バインディングの話をしようか。
キミはいつ頃この機能が必要になったのか、何の実装に必要になったのか詳しく聞かせてくれ。
そしてこの機能で今までどういった素晴らしいソフトを作ってきたのか紹介してくれ。
キミほどの優秀な技術者なら著名なプロジェクトを多数参加しているだろうしな。
972デフォルトの名無しさん
2020/05/14(木) 08:42:44.49ID:Qhhsb9+b973デフォルトの名無しさん
2020/05/14(木) 08:47:57.14ID:IJMYY156 答えれないと知ってて質問してるからいいよ。キミはコードを書かない側の人だからね。
プロジェクトでコード書く人は絶対にこんなこと言わない。こういうことはコードを書かない素人が言うこと。
> 有り難い機能が色々あるのに付いて来れない低脳に迎合するために使用禁止とか愚の骨頂だ
> 足引っ張るなぼけ
> 足引っ張るなぼけ
> 足引っ張るなぼけ
プロジェクトでコード書く人は絶対にこんなこと言わない。こういうことはコードを書かない素人が言うこと。
> 有り難い機能が色々あるのに付いて来れない低脳に迎合するために使用禁止とか愚の骨頂だ
> 足引っ張るなぼけ
> 足引っ張るなぼけ
> 足引っ張るなぼけ
974デフォルトの名無しさん
2020/05/14(木) 09:11:55.49ID:nTyJBG5I キモいのが湧いてるwwww
975デフォルトの名無しさん
2020/05/14(木) 09:19:04.16ID:QxbT6fEj >>967
よしこさんって書き込みたまに見かけるけど、なんで芳江さんじゃだめなん??
よしこさんって書き込みたまに見かけるけど、なんで芳江さんじゃだめなん??
976デフォルトの名無しさん
2020/05/14(木) 09:23:11.49ID:QxbT6fEj977デフォルトの名無しさん
2020/05/14(木) 09:27:45.71ID:IJMYY156 構造化バインディングの話をしたいのに誰もそっちには乗ってこないんだなw
一体誰がこんな機能待ってたんだろう 言い出した本人は逃げちゃったし
一体誰がこんな機能待ってたんだろう 言い出した本人は逃げちゃったし
978デフォルトの名無しさん
2020/05/14(木) 09:30:38.54ID:QxbT6fEj >>977
別に話し合うことも無いと思うけど、何を話し合うの?
別に話し合うことも無いと思うけど、何を話し合うの?
979デフォルトの名無しさん
2020/05/14(木) 10:34:07.03ID:Qhhsb9+b980デフォルトの名無しさん
2020/05/14(木) 10:50:24.81ID:T9ir0BrB >>964
逆じゃね
逆じゃね
981デフォルトの名無しさん
2020/05/14(木) 10:53:24.55ID:T9ir0BrB 構造化バインディングは多値返す関数の使う側が楽になる
mapのループ記述も楽
mapのループ記述も楽
982デフォルトの名無しさん
2020/05/14(木) 11:16:27.91ID:X1Z5LMNW983デフォルトの名無しさん
2020/05/14(木) 11:18:07.82ID:X1Z5LMNW ていうかプロを騙って何か良い事でもあんのかね
よっぼどアマチュアであることに強いコンプがあるんだろうな
よっぼどアマチュアであることに強いコンプがあるんだろうな
984デフォルトの名無しさん
2020/05/14(木) 11:36:20.08ID:8Z2Ww5c+ 最新の言語機能使う俺すげー
大人になろうぜおっさん
大人になろうぜおっさん
985843
2020/05/14(木) 11:46:09.81ID:X6Fr6WNg986デフォルトの名無しさん
2020/05/14(木) 11:47:37.81ID:4xm+WE1I 03至上主義もどうかと思うけどな
unique_ptrくらい使った方がコード品質も上がるよ
unique_ptrくらい使った方がコード品質も上がるよ
987デフォルトの名無しさん
2020/05/14(木) 11:48:08.43ID:tvxDWcUo 次スレよろ
989デフォルトの名無しさん
2020/05/14(木) 11:52:25.87ID:nTyJBG5I constでRAIIちゃんとやろうとしたら構造化バインディングはありがたいのだが
990デフォルトの名無しさん
2020/05/14(木) 11:54:33.42ID:aX0QHk6r991デフォルトの名無しさん
2020/05/14(木) 12:19:53.50ID:Qhhsb9+b 技術職の不勉強は罪だと言っている
居直るやつはクズの中のクズだ
居直るやつはクズの中のクズだ
992デフォルトの名無しさん
2020/05/14(木) 13:09:18.91ID:8Z2Ww5c+ 言語の文法の勉強なんで優先度低い
多くの場合大してソフトウェアの品質上がらない
(そもそも定量化できていない、可読性とかいうあいまいな個人の感想だけ)
そんなもんは枯れたころに導入すれば十分
多くの場合大してソフトウェアの品質上がらない
(そもそも定量化できていない、可読性とかいうあいまいな個人の感想だけ)
そんなもんは枯れたころに導入すれば十分
993デフォルトの名無しさん
2020/05/14(木) 13:12:11.41ID:8Z2Ww5c+ ↑は仕事で使う場合の話ね
趣味の人はご自由に
実際おれだって個人開発では17使ってる
趣味の人はご自由に
実際おれだって個人開発では17使ってる
994デフォルトの名無しさん
2020/05/14(木) 14:19:57.47ID:Qhhsb9+b 優先度って、まるで他の勉強に忙しいような言い方だな
こんなところで下らない言い訳ばかりしてるやつが
こんなところで下らない言い訳ばかりしてるやつが
995デフォルトの名無しさん
2020/05/14(木) 15:23:11.51ID:X1Z5LMNW いいからC++スゲー=俺スゲーしたいだけの馬鹿は黙ってろ
996デフォルトの名無しさん
2020/05/14(木) 15:28:43.92ID:8Z2Ww5c+ そうだね、忙しいね
computer vision系やってるから日々数学の勉強でいっぱいいっぱいだよ
c++の学習は特に頭いらないから週末気分転換にちょっとやる感じ
構造化バインディング使ったところで、認識エラーは1ミリも下がらない
computer vision系やってるから日々数学の勉強でいっぱいいっぱいだよ
c++の学習は特に頭いらないから週末気分転換にちょっとやる感じ
構造化バインディング使ったところで、認識エラーは1ミリも下がらない
997デフォルトの名無しさん
2020/05/14(木) 15:29:06.89ID:x0qWbzDY 根性で五万行組み上げたみたいなバカコードは嫌い
そんなのは女にもモテない
もっとスマートにこなすべき
そんなのは女にもモテない
もっとスマートにこなすべき
998デフォルトの名無しさん
2020/05/14(木) 15:46:10.49ID:Qhhsb9+b 見え透いた嘘ぬかすな
週末気分転換にちょっとやってりゃ
未だにC++03にしがみついているわけがない
もし本当にそうならC++には絶望的に向かないバカだ
週末気分転換にちょっとやってりゃ
未だにC++03にしがみついているわけがない
もし本当にそうならC++には絶望的に向かないバカだ
999デフォルトの名無しさん
2020/05/14(木) 15:47:05.57ID:Qhhsb9+b C++11から何年経ったと思ってるんだ
週末は年に52回もあるんだぞ
週末は年に52回もあるんだぞ
1000デフォルトの名無しさん
2020/05/14(木) 15:51:59.69ID:X1Z5LMNW ん?
>未だにC++03にしがみついているわけがない
>>993で17使ってると言ってたようだが
てかもうちょい生産的な話出来んのか
仕事でも趣味でも都合の良いコンパイラ使えばいいだけの話
構造化束縛をマクロとテンプレートで実現するとかなら面白い話題なんだけどな(面白いだけで実用性があるとは言ってない
>未だにC++03にしがみついているわけがない
>>993で17使ってると言ってたようだが
てかもうちょい生産的な話出来んのか
仕事でも趣味でも都合の良いコンパイラ使えばいいだけの話
構造化束縛をマクロとテンプレートで実現するとかなら面白い話題なんだけどな(面白いだけで実用性があるとは言ってない
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 51日 15時間 47分 26秒
新しいスレッドを立ててください。
life time: 51日 15時間 47分 26秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
