C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part150
https://mevius.5ch.net/test/read.cgi/tech/1584975873/
このスレもよろしくね。
【初心者歓迎】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++相談室 part151
レス数が1000を超えています。これ以上書き込みはできません。
2020/05/14(木) 11:53:25.59ID:ZPCfyTux
2デフォルトの名無しさん
2020/05/14(木) 12:14:02.15ID:tvxDWcUo >>1
O2
O2
2020/05/14(木) 15:59:11.45ID:Qhhsb9+b
https://mevius.5ch.net/test/read.cgi/tech/1584975873/1000
> 1000 名前:デフォルトの名無しさん[sage] 投稿日:2020/05/14(木) 15:51:59.69 ID:X1Z5LMNW [4/4]
> ん?
> >未だにC++03にしがみついているわけがない
> >>993で17使ってると言ってたようだが
>
> てかもうちょい生産的な話出来んのか
> 仕事でも趣味でも都合の良いコンパイラ使えばいいだけの話
> 構造化束縛をマクロとテンプレートで実現するとかなら面白い話題なんだけどな(面白いだけで実用性があるとは言ってない
なんだ、17で俺スゲーやってんのおまえじゃん
俺は仕事で17は当たり前という立場
おまえは仕事には危なくて使えないという立場
俺に教えを請うて突っぱねられたのがおまえ
あとはわかるな?
> 1000 名前:デフォルトの名無しさん[sage] 投稿日:2020/05/14(木) 15:51:59.69 ID:X1Z5LMNW [4/4]
> ん?
> >未だにC++03にしがみついているわけがない
> >>993で17使ってると言ってたようだが
>
> てかもうちょい生産的な話出来んのか
> 仕事でも趣味でも都合の良いコンパイラ使えばいいだけの話
> 構造化束縛をマクロとテンプレートで実現するとかなら面白い話題なんだけどな(面白いだけで実用性があるとは言ってない
なんだ、17で俺スゲーやってんのおまえじゃん
俺は仕事で17は当たり前という立場
おまえは仕事には危なくて使えないという立場
俺に教えを請うて突っぱねられたのがおまえ
あとはわかるな?
2020/05/14(木) 16:04:10.28ID:X1Z5LMNW
5デフォルトの名無しさん
2020/05/14(木) 16:04:50.89ID:QxbT6fEj ホスト環境は17、組み込みは03で良いのでは?
2020/05/14(木) 16:06:44.92ID:Qhhsb9+b
2020/05/14(木) 16:07:42.33ID:Qhhsb9+b
2020/05/14(木) 16:44:48.92ID:7nN34odP
extern "C" 以下が、宣言になるなのか、定義になるのかについて、以下のページには、
extern "C" { int i; } と書くと、i は、「定義」される。
宣言で済ましたい場合には、
extern "C" { extern int i; }としなくてはならない。しかし、中括弧で囲まずに、
extern "C" int i;
と書いた場合には、i は「宣言」だけされる、とあります。
さらに、これは変数の場合で、関数の場合には、戻り値 関数名(仮引数列) の後に関数定義部の{・・・}
があるかどうかで宣言か定義かが変わるだけのようです。といいますか、関数の場合は、関数定義部
がなければ、「定義」しようがないのでそれは当然かもしれませんが(結構複雑です。)。
これらの動作について、cppreference などで述べられているページがあれば、
教えていただければ幸いです。
https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c
Note that extern "C" { int i; } is a definition.
This may not be what you intended, next to the non-definition of void g(char);.
To make it a non-definition, you would need extern "C" { extern int i; }.
On the other hand, the one-declaration syntax without braces does make the declaration a non-definition: extern "C" int i; is the same as extern "C" { extern int i; }
extern "C" { int i; } と書くと、i は、「定義」される。
宣言で済ましたい場合には、
extern "C" { extern int i; }としなくてはならない。しかし、中括弧で囲まずに、
extern "C" int i;
と書いた場合には、i は「宣言」だけされる、とあります。
さらに、これは変数の場合で、関数の場合には、戻り値 関数名(仮引数列) の後に関数定義部の{・・・}
があるかどうかで宣言か定義かが変わるだけのようです。といいますか、関数の場合は、関数定義部
がなければ、「定義」しようがないのでそれは当然かもしれませんが(結構複雑です。)。
これらの動作について、cppreference などで述べられているページがあれば、
教えていただければ幸いです。
https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c
Note that extern "C" { int i; } is a definition.
This may not be what you intended, next to the non-definition of void g(char);.
To make it a non-definition, you would need extern "C" { extern int i; }.
On the other hand, the one-declaration syntax without braces does make the declaration a non-definition: extern "C" int i; is the same as extern "C" { extern int i; }
2020/05/14(木) 17:19:49.87ID:7nN34odP
>>8
【関連事項】
[winnt.h の中]
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
[urlmon.h の中]
EXTERN_C const IID CLSID_CdlProtocol; // (100)
[考察]
(100)は、EXTERN_C のマクロ展開後
*pure C では、
extern const IID CLSID_CdlProtocol; // (101)
*C++ では、
extern "C" const IID CLSID_CdlProtocol; // (102)
となります。
(101)は明らかに(「定義」ではなく)「宣言」なので、モード間のバランスから考えて、
(102)も宣言でなくてはなりません。一方、
#ifdef __cplusplus
extern "C" {
#endif
int aaa;
#ifdef __cplusplus
}
#endif
と書いた場合、aaa は、どちらのモードでも「(変数)定義」であり、単なる「宣言」ではありません。
これは、(102)が「宣言」であることと、ある種の矛盾を生じているようですが、これが現状の
正しい解釈のようです。しかし、この事が cppreference のどこに書いてあるのかが分かりません。
【関連事項】
[winnt.h の中]
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
[urlmon.h の中]
EXTERN_C const IID CLSID_CdlProtocol; // (100)
[考察]
(100)は、EXTERN_C のマクロ展開後
*pure C では、
extern const IID CLSID_CdlProtocol; // (101)
*C++ では、
extern "C" const IID CLSID_CdlProtocol; // (102)
となります。
(101)は明らかに(「定義」ではなく)「宣言」なので、モード間のバランスから考えて、
(102)も宣言でなくてはなりません。一方、
#ifdef __cplusplus
extern "C" {
#endif
int aaa;
#ifdef __cplusplus
}
#endif
と書いた場合、aaa は、どちらのモードでも「(変数)定義」であり、単なる「宣言」ではありません。
これは、(102)が「宣言」であることと、ある種の矛盾を生じているようですが、これが現状の
正しい解釈のようです。しかし、この事が cppreference のどこに書いてあるのかが分かりません。
10デフォルトの名無しさん
2020/05/14(木) 17:25:47.90ID:xR/PZA9p 1回しか使われていない場合
2回以上使われている場合
「宣言」とは別に定義がリンクされている場合
2回以上使われている場合
「宣言」とは別に定義がリンクされている場合
2020/05/14(木) 17:33:00.93ID:7nN34odP
>>10
そういうことは理解しているつもりです。
extern ではなく、extern "C" の動作が、直後にブロックがあるかないかや、
変数か関数かによって、不思議な変化を見せることに興味があります。
そういうことは理解しているつもりです。
extern ではなく、extern "C" の動作が、直後にブロックがあるかないかや、
変数か関数かによって、不思議な変化を見せることに興味があります。
2020/05/14(木) 17:38:36.51ID:Qhhsb9+b
int aaa; //definition in C++, tentative in C
int aaa; //invalid in C++, valid in C
int aaa; //invalid in C++, valid in C
2020/05/14(木) 17:48:01.20ID:nTyJBG5I
クラスで定義された型を言語構文でバラして対応付けると言う非対称な気持ち悪さと
const, 非constを混在して受けられない不便さとがあるな
構造化バインディング
まーtuple限定ではなく構造体を対応付けられるから非対称ってわけでもないか
const, 非constを混在して受けられない不便さとがあるな
構造化バインディング
まーtuple限定ではなく構造体を対応付けられるから非対称ってわけでもないか
2020/05/14(木) 17:51:54.74ID:nTyJBG5I
2020/05/14(木) 18:15:11.62ID:7nN34odP
>>14
stackoverflow以外に、公式サイトでそれが書かれている場所を教えていただければ幸いです。
stackoverflow以外に、公式サイトでそれが書かれている場所を教えていただければ幸いです。
2020/05/14(木) 18:18:32.65ID:jF4/VTtK
cppreferenceは仕様書じゃないから書いてなくても不思議じゃないと思うけど。
仕様書見たら?ドラフト版はネットに転がってる
仕様書見たら?ドラフト版はネットに転がってる
2020/05/14(木) 18:25:58.94ID:7nN34odP
>>16
その公式アドレスを教えていただければ幸いです。
その公式アドレスを教えていただければ幸いです。
2020/05/14(木) 18:27:40.05ID:nTyJBG5I
>>15
cppreference.comに書かれてるぞ
cppreference.comに書かれてるぞ
2020/05/14(木) 18:28:39.75ID:nTyJBG5I
externの説明のnotesのところにな
2020/05/14(木) 18:32:35.87ID:jF4/VTtK
>>17
ggrks
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf
あとcppreferenceはある意味ファンサイトみたいなものなので、何らかの標準化組織の公式サイトというわけじゃないよ
ggrks
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf
あとcppreferenceはある意味ファンサイトみたいなものなので、何らかの標準化組織の公式サイトというわけじゃないよ
2020/05/14(木) 18:42:47.93ID:nTyJBG5I
つーか、cppreferenceに書いてあるのに見落としてよそのサイト教えろとか馬鹿丸出しで笑える
22デフォルトの名無しさん
2020/05/14(木) 18:45:51.63ID:QxbT6fEj バカにバカというのはバカ差別で違法だからね。
2020/05/14(木) 20:34:45.27ID:Qhhsb9+b
情報量ゼロのゴミレスでドヤ顔する自覚なきクズ大杉
20はggrksと言いながらちゃんとリンク貼ってる
20はggrksと言いながらちゃんとリンク貼ってる
24デフォルトの名無しさん
2020/05/14(木) 20:40:53.93ID:xR/PZA9p25デフォルトの名無しさん
2020/05/14(木) 20:46:17.52ID:QxbT6fEj26デフォルトの名無しさん
2020/05/14(木) 20:48:02.32ID:QxbT6fEj そういえば、チョンにチョンというのはチョン差別で違法だけど、日本人に日本人というのは別に問題ないね。
フランス人にフランス人というのも問題ないし、中国人に中国人というのも問題ない。
何が違うんだろ。
フランス人にフランス人というのも問題ないし、中国人に中国人というのも問題ない。
何が違うんだろ。
27デフォルトの名無しさん
2020/05/14(木) 20:51:04.91ID:QxbT6fEj チョンというのがダメなのかと思ったけど。
朝鮮人に朝鮮人というのも朝鮮人差別だから違法だよね。
ますますわからん。
朝鮮人に朝鮮人というのも朝鮮人差別だから違法だよね。
ますますわからん。
2020/05/15(金) 18:22:21.33ID:hNzctM0s
以下の混乱を、どう解決すべきか分かる人いますか?
・無名の共用体: 問題は特に有りません。
・無名の構造体: 入れ子の構造体(nested class)の「型定義」と区別が付かない気がします。
以下はその説明です :
class CPerson { // (1)
struct _TAaa { // (2)
・・・
}; // (3)
};
と書いた場合、(3) の部分にメンバ名が書かれていません。
しかし、これでは以下のどちらかなのか区別できない気がするのです。
a. CPerson の中に「無名ではあるが実態のあるメンバ」として「メンバ変数」を定義するつもり。
b. 単に、CPerson の class scope の中に _TAaa というタグ名を持つ構造体を「型定義」するつもり。
MSは、a の方針で、この形式 (2)〜(3) を、「anonymous structure」と定義しているらしいです。
しかし、C++ には、b の解釈の「nested class」という言葉も存在しています。
・無名の共用体: 問題は特に有りません。
・無名の構造体: 入れ子の構造体(nested class)の「型定義」と区別が付かない気がします。
以下はその説明です :
class CPerson { // (1)
struct _TAaa { // (2)
・・・
}; // (3)
};
と書いた場合、(3) の部分にメンバ名が書かれていません。
しかし、これでは以下のどちらかなのか区別できない気がするのです。
a. CPerson の中に「無名ではあるが実態のあるメンバ」として「メンバ変数」を定義するつもり。
b. 単に、CPerson の class scope の中に _TAaa というタグ名を持つ構造体を「型定義」するつもり。
MSは、a の方針で、この形式 (2)〜(3) を、「anonymous structure」と定義しているらしいです。
しかし、C++ には、b の解釈の「nested class」という言葉も存在しています。
2020/05/15(金) 18:32:30.47ID:OzObLB6i
>>28
自分でコンパイルしてどうなるか試したんだよな?
自分でコンパイルしてどうなるか試したんだよな?
2020/05/15(金) 18:39:41.33ID:7pqJGfJd
2に名前つけている時点で無名じゃない
2020/05/15(金) 18:44:03.32ID:hNzctM0s
>>30
なるほど。
なるほど。
32デフォルトの名無しさん
2020/05/16(土) 16:37:49.22ID:nLCzlpLv std::bitset を std::unordered_map か std::map のキーとして使用したいのですが、
どうすればよろしいのでしょうか?
どうすればよろしいのでしょうか?
2020/05/16(土) 16:40:58.20ID:hM/FmoW0
>>32 やってみて、何か問題あったの?
2020/05/16(土) 16:46:28.51ID:tFvEvqcA
std::unordered_map<std::bitset<42>, int> um;
um[std::bitset<42>("0011")] = 9999;
std::cout << um[std::bitset<42>("0011")] ;
普通に動いたぞ
何に困ってるんだ?
um[std::bitset<42>("0011")] = 9999;
std::cout << um[std::bitset<42>("0011")] ;
普通に動いたぞ
何に困ってるんだ?
35デフォルトの名無しさん
2020/05/16(土) 16:50:35.98ID:nLCzlpLv2020/05/16(土) 16:59:00.14ID:hM/FmoW0
>>35 エラーメッセージも貼って、エラーメッセージのわからないところも書いてくれるといいな。
37デフォルトの名無しさん
2020/05/16(土) 17:07:47.33ID:nLCzlpLv >>36
error C2676: 二項演算子 '<': 'const _Ty' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)
with
[
_Ty=std::bitset<100>
]
message : クラス テンプレート メンバー関数 'bool std::less<std::bitset<100>>::operator ()(const _Ty &,const _Ty &) const' のコンパイル中
with
[
_Ty=std::bitset<100>
]
message : コンパイル対象の関数 テンプレート インスタンス化 'bool std::less<std::bitset<100>>::operator ()(const _Ty &,const _Ty &) const' のリファレンスを確認してください
with
[
_Ty=std::bitset<100>
]
message : コンパイル対象の クラス テンプレート インスタンス化 'std::less<std::bitset<100>>' のリファレンスを確認してください
message : コンパイルされている変数テンプレート 'const bool is_empty_v<std::less<std::bitset<100> > >' のリファレンスをご参照ください
message : コンパイル対象の クラス テンプレート インスタンス化 'std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>' のリファレンスを確認してください
with
[
_Kty=std::bitset<100>,
_Ty=int,
_Pr=std::less<std::bitset<100>>,
_Alloc=std::allocator<std::pair<const std::bitset<100>,int>>
]
message : コンパイル対象の クラス テンプレート インスタンス化 'std::map<std::bitset<100>,int,std::less<std::bitset<100>>,std::allocator<std::pair<const std::bitset<100>,int>>>' のリファレンスを確認してください
error C2676: 二項演算子 '<': 'const _Ty' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)
with
[
_Ty=std::bitset<100>
]
message : クラス テンプレート メンバー関数 'bool std::less<std::bitset<100>>::operator ()(const _Ty &,const _Ty &) const' のコンパイル中
with
[
_Ty=std::bitset<100>
]
message : コンパイル対象の関数 テンプレート インスタンス化 'bool std::less<std::bitset<100>>::operator ()(const _Ty &,const _Ty &) const' のリファレンスを確認してください
with
[
_Ty=std::bitset<100>
]
message : コンパイル対象の クラス テンプレート インスタンス化 'std::less<std::bitset<100>>' のリファレンスを確認してください
message : コンパイルされている変数テンプレート 'const bool is_empty_v<std::less<std::bitset<100> > >' のリファレンスをご参照ください
message : コンパイル対象の クラス テンプレート インスタンス化 'std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>' のリファレンスを確認してください
with
[
_Kty=std::bitset<100>,
_Ty=int,
_Pr=std::less<std::bitset<100>>,
_Alloc=std::allocator<std::pair<const std::bitset<100>,int>>
]
message : コンパイル対象の クラス テンプレート インスタンス化 'std::map<std::bitset<100>,int,std::less<std::bitset<100>>,std::allocator<std::pair<const std::bitset<100>,int>>>' のリファレンスを確認してください
2020/05/16(土) 17:07:54.21ID:tFvEvqcA
わかった、std::mapだとダメなんだな
bitsetがoperator<持ってないからだ
これ定義すればmapでも通ると思うよ
template<>
struct std::less<std::bitset<100>>
{
bool operator()(const std::bitset<100>& lhs, const std::bitset<100>& rhs) const{ return lhs.to_ulong() < rhs.to_ulong();}
};
bitsetがoperator<持ってないからだ
これ定義すればmapでも通ると思うよ
template<>
struct std::less<std::bitset<100>>
{
bool operator()(const std::bitset<100>& lhs, const std::bitset<100>& rhs) const{ return lhs.to_ulong() < rhs.to_ulong();}
};
39デフォルトの名無しさん
2020/05/16(土) 17:08:13.11ID:nLCzlpLv といったメッセージが出ております。
40デフォルトの名無しさん
2020/05/16(土) 17:09:26.66ID:is04b0b3 >>35
a.insert( std::make_pair< FOO , BAR >( n, 100 ) );
a.insert( std::make_pair< FOO , BAR >( n, 100 ) );
2020/05/16(土) 17:09:55.37ID:tFvEvqcA
まあどうしてもmapにしたい理由がなけりゃおとなしくunordered_mapにした方がいいと思うけど
stdのテンプレートをstdのクラスで特殊化するのは本来は反則だし、unordered_mapの方がだいたい効率いいし
stdのテンプレートをstdのクラスで特殊化するのは本来は反則だし、unordered_mapの方がだいたい効率いいし
42デフォルトの名無しさん
2020/05/16(土) 17:16:42.14ID:uXmamJPc 普通に考えたらこれだろ。
std::make_pair( n, 100 )
std::make_pair( n, 100 )
43デフォルトの名無しさん
2020/05/16(土) 17:36:40.03ID:nLCzlpLv 皆さん。情報ありがとうございます。
>>38
試してみた所ビットを33個立てるとstd::overflow が出てしまうようです。
おそらく関数の仕様的な問題だと思うのですが……
>>40
a.insert( std::make_pair<std::bitset<MAX>, int>( n, 100 ) );
とやってみた所エラーが出てしまいました。
この辺の指定はコンパイラが勝手に行ってくれると思っていたのですが、
指定しなければならないのでしょうか?
>>41
std::unordered_map を利用するとうまくいきました。
ありがとうございます。
>>42
すみません。
>>40と同じ理由なのでしょうか?
>>38
試してみた所ビットを33個立てるとstd::overflow が出てしまうようです。
おそらく関数の仕様的な問題だと思うのですが……
>>40
a.insert( std::make_pair<std::bitset<MAX>, int>( n, 100 ) );
とやってみた所エラーが出てしまいました。
この辺の指定はコンパイラが勝手に行ってくれると思っていたのですが、
指定しなければならないのでしょうか?
>>41
std::unordered_map を利用するとうまくいきました。
ありがとうございます。
>>42
すみません。
>>40と同じ理由なのでしょうか?
2020/05/16(土) 17:50:14.76ID:qkv5Lv3o
bitset の値同士で < での比較ができないから map でエラーってことか。
unordered_map なら == で比較できれば使える、と。
unordered_map なら == で比較できれば使える、と。
2020/05/16(土) 18:00:40.13ID:tFvEvqcA
46デフォルトの名無しさん
2020/05/17(日) 14:06:29.05ID:7W3ntFmq ラムダ式にテンプレートの型指定ってできないんですかね?
auto f = []<class T>(T) {};
auto f2 = []<class T>() {};
f(1);
f2<int>();
fは引数にその型のパラメータがあるので大丈夫なんですけど、
f2だとコンパイルが通らないです...
auto f = []<class T>(T) {};
auto f2 = []<class T>() {};
f(1);
f2<int>();
fは引数にその型のパラメータがあるので大丈夫なんですけど、
f2だとコンパイルが通らないです...
2020/05/17(日) 14:12:23.12ID:ykqeUojC
ダミーの引数渡して
decltypeするとかすればいいんじゃね
decltypeするとかすればいいんじゃね
2020/05/17(日) 14:33:24.46ID:AX8hrxuQ
>>46
呼び出してるのはあくまでオーバーロードされた関数呼び出し演算子なので、こうする
f2.operator()<int>();
https://wandbox.org/permlink/uVSptZMZErNrL5p3
呼び出してるのはあくまでオーバーロードされた関数呼び出し演算子なので、こうする
f2.operator()<int>();
https://wandbox.org/permlink/uVSptZMZErNrL5p3
2020/05/17(日) 14:41:04.25ID:7W3ntFmq
>>48
なるほど!ありがとうございます!!
なるほど!ありがとうございます!!
50デフォルトの名無しさん
2020/05/18(月) 09:15:27.74ID:XEI7YtdQ なるほど
戻り値で判断するのも知りたい
戻り値で判断するのも知りたい
2020/05/18(月) 10:30:31.10ID:VVfIWrZc
>>46
auto仮引数ではあかんの?
auto f = [](auto arg) { cout << typeid(arg).name() << endl; };
f(1); //int
f(1.5); //double
auto仮引数ではあかんの?
auto f = [](auto arg) { cout << typeid(arg).name() << endl; };
f(1); //int
f(1.5); //double
52デフォルトの名無しさん
2020/05/18(月) 19:43:09.64ID:NOr8CY4q 以下のコードを実行すると 'あ' がアルファベットと判定されてしまうのですが、なぜかわかりますか?
Visual C++ 2019でもg++ 7.5.0でも結果は一緒でした(値は違いますが)。
std::locale loc("");
std::locale::global(loc);
std::wcout << std::isalpha(L'あ') << std::endl;
std::wcout << iswalpha(L'あ') << std::endl;
Visual C++ 2019でもg++ 7.5.0でも結果は一緒でした(値は違いますが)。
std::locale loc("");
std::locale::global(loc);
std::wcout << std::isalpha(L'あ') << std::endl;
std::wcout << iswalpha(L'あ') << std::endl;
2020/05/18(月) 20:28:29.14ID:SqFV2JvV
あはアルファベットだからだろう
2020/05/18(月) 20:49:09.32ID:vxC60pVH
というより、その判定結果だからこそあはアルファベットなんだよ
isalphaがtrueを返すものを現在のロケールにおけるアルファベットと呼ぶと言う方が正しいか
isalphaがtrueを返すものを現在のロケールにおけるアルファベットと呼ぶと言う方が正しいか
2020/05/18(月) 20:53:28.77ID:ah40zw28
いや、isalphaがtrueになる文字は各localeで決まっている
isalphaはそれを垂れ流しているだけ
isalphaはそれを垂れ流しているだけ
56デフォルトの名無しさん
2020/05/18(月) 21:32:06.39ID:cgM2dsGJ is_ascii_alpha()のほうが良く使う。
57デフォルトの名無しさん
2020/05/18(月) 22:16:41.22ID:NOr8CY4q ありがとうございます
普段は「日本語のアルファベット」とはあまり使わないけれど、
設定されている言語で表現するための文字のことをアルファベットと呼んでいると理解しておきます。
普段は「日本語のアルファベット」とはあまり使わないけれど、
設定されている言語で表現するための文字のことをアルファベットと呼んでいると理解しておきます。
2020/05/19(火) 03:42:01.59ID:dHzzm0xI
そもそも英語では普通にひらがなとカタカナを指して"Japanese alphabet"と呼ぶ
59デフォルトの名無しさん
2020/05/19(火) 10:55:08.90ID:h69Ba80R アルファベットはアラビア語が語源?
60デフォルトの名無しさん
2020/05/19(火) 10:56:23.71ID:h69Ba80R あと正確に言うなら日本語のアルファベットは
いろは
いろは
2020/05/19(火) 12:21:31.91ID:kOq4o5Tk
アルファベット=表音文字と言いたいの?
2020/05/19(火) 13:16:28.27ID:kUNy0nAn
stlを考えた人は馬鹿だからな。
2020/05/19(火) 13:40:15.28ID:kUNy0nAn
isalpha()が2バイト文字環境でいままで使われてきた経緯も知らずに勝手に仕様を変えてしまう馬鹿な人々。
min,maxも伝統的なマクロの存在を知らずに衝突させてしまう馬鹿。
さらに馬鹿なのはSTL作者達なのにコンパイラ処理系作者のせいにしてしまう愚かな烏合の衆たち。
min,maxも伝統的なマクロの存在を知らずに衝突させてしまう馬鹿。
さらに馬鹿なのはSTL作者達なのにコンパイラ処理系作者のせいにしてしまう愚かな烏合の衆たち。
2020/05/19(火) 13:44:38.41ID:JQlWutmQ
isalphaは昔のcでもlocale依存だろ
65デフォルトの名無しさん
2020/05/19(火) 14:25:44.49ID:O4jzhFRD STLは、なぜあの時代に、ここまで抽象化できたのか?彼らは宇宙から来たのではないか?などと考えてしまうが。
66デフォルトの名無しさん
2020/05/19(火) 14:27:12.72ID:O4jzhFRD Windows.hのmin、maxは困りものだよな。
2020/05/19(火) 14:51:53.51ID:oq2DQSv9
マクロでminmax書いているほうがどう考えてもバカだよな
2020/05/19(火) 14:54:10.83ID:oq2DQSv9
win32の設計とかあーバカコードだなコレってのがちらほら
2020/05/19(火) 16:31:48.66ID:kOq4o5Tk
>>67
御意
御意
2020/05/19(火) 17:47:23.01ID:HCP/tGTo
人類がBOOST_PREVENT_MACRO_SUBSTITUTIONから解放される日は遠い
2020/05/19(火) 18:01:48.72ID:0UAmioLe
STLの方が馬鹿。
今までのものを知らないで独自のものを書くのは簡単。
勉強もせずに独自の日記を書くようなことだから。
今までのものを知らないで独自のものを書くのは簡単。
勉強もせずに独自の日記を書くようなことだから。
72デフォルトの名無しさん
2020/05/19(火) 18:23:54.92ID:8HY/3oGP なぜ会社を100社以上バックレたのか?働きたくない男の末路!
https://www.youtube.com/watch?v=C73If3B6MXc
【遅刻早退ドタキャン癖】の絶望的な解説。社会人失格の烙印。
https://www.youtube.com/watch?v=bGarZKcC08s
【悲報】あがり症は完治しない!緊張対策よりも開き直り!
https://www.youtube.com/watch?v=-jMUFZc9vRA
結婚式への参加は『社会の底辺』には地獄!非モテ手当を寄こせ!
https://www.youtube.com/watch?v=oKFrGkpsP8Y
親戚の『葬式』ドタキャンで激怒された!冠婚葬祭パワハラが酷い!
https://www.youtube.com/watch?v=0L-EAndCodE
リボ払い借金500万円の一日!敗者復活ルーティーン
https://www.youtube.com/watch?v=shJMgp6EuW8
https://www.youtube.com/watch?v=C73If3B6MXc
【遅刻早退ドタキャン癖】の絶望的な解説。社会人失格の烙印。
https://www.youtube.com/watch?v=bGarZKcC08s
【悲報】あがり症は完治しない!緊張対策よりも開き直り!
https://www.youtube.com/watch?v=-jMUFZc9vRA
結婚式への参加は『社会の底辺』には地獄!非モテ手当を寄こせ!
https://www.youtube.com/watch?v=oKFrGkpsP8Y
親戚の『葬式』ドタキャンで激怒された!冠婚葬祭パワハラが酷い!
https://www.youtube.com/watch?v=0L-EAndCodE
リボ払い借金500万円の一日!敗者復活ルーティーン
https://www.youtube.com/watch?v=shJMgp6EuW8
2020/05/19(火) 19:02:02.51ID:VP2fOBMJ
>>72
スレチ グロ
スレチ グロ
2020/05/20(水) 06:07:41.13ID:8m9cjgNh
関数(始点,終点)に馴染めないバカのあぶり出しだったな
関数(始点,個数)に固執してたやつらがSTLで吠え面かかされたw
関数(始点,個数)に固執してたやつらがSTLで吠え面かかされたw
2020/05/20(水) 14:27:55.42ID:9xAqQrOe
2020/05/20(水) 14:30:18.93ID:9xAqQrOe
https://ideone.com/Gq2X2N
無しだとちゃんと出るっぽいです。ということを見せておきます。
無しだとちゃんと出るっぽいです。ということを見せておきます。
2020/05/21(木) 09:22:26.84ID:r7XP4kDE
>>65
ソ連で生魚にあたって、入院中に病院の天井みてたら思いついたらしいぜ
ソ連で生魚にあたって、入院中に病院の天井みてたら思いついたらしいぜ
2020/05/21(木) 11:21:03.35ID:K4ggzWEW
寄生虫より有毒魚かもな
フグみたいな命取りなやつじゃなくバラムツくらいなら腹壊す程度で済む
フグみたいな命取りなやつじゃなくバラムツくらいなら腹壊す程度で済む
2020/05/21(木) 20:23:36.81ID:U7f5mioC
>>75がどれに対するレスなのか分からんが
みんな単にスルーしてんだろうなこれは
みんな単にスルーしてんだろうなこれは
2020/05/22(金) 07:52:07.46ID:QdrkGYuD
バカって素直だな
ちゃんと返事しやがるw
ちゃんと返事しやがるw
82デフォルトの名無しさん
2020/05/22(金) 13:00:00.65ID:c/ouk/Jn dtmみたいな楽器を作る場合、音は何らかのライブラリを使うんでしょうか?1から作れるんですか?
2020/05/22(金) 14:03:10.66ID:lsrfRepl
は?
オリジナルは普通にサンプルしたものだろ
オリジナルは普通にサンプルしたものだろ
2020/05/22(金) 14:03:38.08ID:lsrfRepl
つまり現実の楽器の音
85デフォルトの名無しさん
2020/05/22(金) 14:08:19.81ID:c/ouk/Jn >>83
シンセとかもサンプルしてるんですか?
シンセとかもサンプルしてるんですか?
2020/05/22(金) 14:39:41.09ID:TUWJypw2
87デフォルトの名無しさん
2020/05/22(金) 14:47:32.08ID:Vl9NL0Mz オートチューン使うと自分の声が楽器みたいになります。
2020/05/22(金) 17:31:59.13ID:Sp8oG6pc
あるクラスのvectorに対し、個々のクラスのメンバのvectorを返すのってラムダ式でサクッと書けると思うのですが、どうやればいいですか?
struct A { int i; };
vector<A> v(10);
auto v_i = 〜ラムダ式〜 // サイズ10のvector<int>が返る
こんな感じです
struct A { int i; };
vector<A> v(10);
auto v_i = 〜ラムダ式〜 // サイズ10のvector<int>が返る
こんな感じです
2020/05/22(金) 17:34:51.45ID:O4ltSfT0
なにいってるのかワカランゴ
2020/05/22(金) 17:40:03.05ID:Wrt3y1wd
[&]{
std::vector<int> ret(v.size());
std::transform(v.begin(),v.end(),ret.begin(),[](A d){return d.i;});
return ret;
}
std::vector<int> ret(v.size());
std::transform(v.begin(),v.end(),ret.begin(),[](A d){return d.i;});
return ret;
}
2020/05/22(金) 17:42:50.71ID:Wrt3y1wd
[](A){...}
のところは&A::iでもいいかな
のところは&A::iでもいいかな
92デフォルトの名無しさん
2020/05/22(金) 17:44:13.14ID:Czx4JK5B2020/05/22(金) 17:59:27.93ID:Sp8oG6pc
なるほど、std::transformを使うのですね
Pythonみたいにサクッとできたらよかったのですが、ちょっとイメージと違いました
ラムダ式に変な期待、というか勘違いしてました
素直にrange for文で個々にemplace_backするほうが短いし分かりやすいので、今回はそうします
ありがとうございました
Pythonみたいにサクッとできたらよかったのですが、ちょっとイメージと違いました
ラムダ式に変な期待、というか勘違いしてました
素直にrange for文で個々にemplace_backするほうが短いし分かりやすいので、今回はそうします
ありがとうございました
2020/05/22(金) 18:03:14.33ID:Wrt3y1wd
pythonだと[d.i for d in v]って所か?
lambdaじゃないけど
lambdaじゃないけど
2020/05/22(金) 18:08:11.35ID:UA0IlUzi
内包表記だな
2020/05/22(金) 19:08:51.35ID:TUWJypw2
97はちみつ餃子 ◆8X2XSCHEME
2020/05/23(土) 00:02:55.12ID:jzsRlJtI range を使えば楽だろうと思ったんだけど view からコンテナに変換する関数は C++20 には入らなかったの?
Range-v3 にある to みたいなやつ。
https://ericniebler.github.io/range-v3/group__group-range.html#ga555b843264809e3765210c42a66d3c3b
Range-v3 にある to みたいなやつ。
https://ericniebler.github.io/range-v3/group__group-range.html#ga555b843264809e3765210c42a66d3c3b
2020/05/23(土) 20:12:53.91ID:Ze0+o2k4
>>87
diva danceみたいに?
diva danceみたいに?
2020/05/27(水) 17:21:37.04ID:UmTuuMOr
gdbのプロンプトでsqrtとかabsみたいな数学の関数使えないんだけど使えるようにする方法ある?
100デフォルトの名無しさん
2020/05/27(水) 17:25:22.27ID:CVgHI0+a さぁ
101デフォルトの名無しさん
2020/05/27(水) 17:52:37.65ID:y56ZMEX8 毎回生成したくない大きめな作業用配列とかって結局どこに持っとくのが良いの?
メンバ変数として?
グローバル変数として?
メンバ変数として?
グローバル変数として?
102デフォルトの名無しさん
2020/05/27(水) 18:36:53.07ID:IG528ewY そんなことで悩むレベルなら毎回生成しろ
たぶんそんなことでは全く遅くはならん
たぶんそんなことでは全く遅くはならん
103デフォルトの名無しさん
2020/05/27(水) 19:02:42.55ID:8V/LyVfK なるべく使う奴にしか見えないスコープに閉じ込めるんだよ
bool1個だろうと10GBの配列だろうと一緒
基本を守るだけだ
bool1個だろうと10GBの配列だろうと一緒
基本を守るだけだ
104デフォルトの名無しさん
2020/05/27(水) 19:50:08.92ID:9+VJvnQZ >>99
$ gdb some_program
(gdb) break main
(gdb) run
(gdb) print ((double(*)(double))sqrt)(2.0)
って感じで使えないかな。
たぶん some_program は何らか libm の関数を取り込んでないとダメだけど。
$ gdb some_program
(gdb) break main
(gdb) run
(gdb) print ((double(*)(double))sqrt)(2.0)
って感じで使えないかな。
たぶん some_program は何らか libm の関数を取り込んでないとダメだけど。
105デフォルトの名無しさん
2020/05/27(水) 20:25:14.60ID:UmTuuMOr106デフォルトの名無しさん
2020/05/27(水) 20:35:36.86ID:8D/pm3yR 作業用の領域の扱いってたしかにいつも悩むんだが、
*) ループや関数の内側で毎回コンテナ (vector, set, queue, etc...) を宣言し、初期化し、使う
と
*) ループや関数の外側にコンテナを宣言しておき、ループや関数の内側で初期化し、使う
だと当然後者の方が低コストで、可読性を大きく損なわない限り後者の方が良いのだよな?
初期化の計算量のオーダーは両者とも同じだが、可変長コンテナのメモリアロケーションの回数を少なくするのが重要だと思って良いのだよな?
*) ループや関数の内側で毎回コンテナ (vector, set, queue, etc...) を宣言し、初期化し、使う
と
*) ループや関数の外側にコンテナを宣言しておき、ループや関数の内側で初期化し、使う
だと当然後者の方が低コストで、可読性を大きく損なわない限り後者の方が良いのだよな?
初期化の計算量のオーダーは両者とも同じだが、可変長コンテナのメモリアロケーションの回数を少なくするのが重要だと思って良いのだよな?
107デフォルトの名無しさん
2020/05/27(水) 20:37:48.66ID:8D/pm3yR もう一個質問
STLコンテナの初期化は空とのswapでやったりすると思うが、この場合コンテナが置かれたメモリの場所は変わらんよな?
つまり、余計なメモリアロケーションは起こらんよな?
STLコンテナの初期化は空とのswapでやったりすると思うが、この場合コンテナが置かれたメモリの場所は変わらんよな?
つまり、余計なメモリアロケーションは起こらんよな?
108デフォルトの名無しさん
2020/05/27(水) 20:45:00.53ID:fWbzFAkP なんかイラっときた
109デフォルトの名無しさん
2020/05/27(水) 20:50:33.85ID:CVgHI0+a なぜ同意を求める?
部下に相槌を打つようにいつも説得しているのか?
お願いします
教えてください
も言えんのか
部下に相槌を打つようにいつも説得しているのか?
お願いします
教えてください
も言えんのか
110デフォルトの名無しさん
2020/05/27(水) 21:47:27.96ID:HrRUxTGO 行単位でファイルを読み込んだあと、パースするような処理で巨大なテキストファイルを扱う場合だと、顕著に後者が速くなる
まあ一度プロファイラで確認してみればいいよ
まあ一度プロファイラで確認してみればいいよ
111はちみつ餃子 ◆8X2XSCHEME
2020/05/27(水) 23:11:34.31ID:OEK6SyHu112デフォルトの名無しさん
2020/05/27(水) 23:13:55.80ID:CVgHI0+a 要素のswapってなんだ?
再配置だろ
再配置だろ
113はちみつ餃子 ◆8X2XSCHEME
2020/05/27(水) 23:26:27.55ID:OEK6SyHu114デフォルトの名無しさん
2020/05/27(水) 23:50:44.02ID:HrRUxTGO 単にgetlineした文字列を
vectorに詰める場合、
getlineしたバッファをmove push_backしたり、shrink_to_fitしてmove
push_backするより、何もせずpush_backでコピーを詰め込んでバッファを使い回しってのが一番速くてメモリ効率もよく、コードもスッキリする
vectorに詰める場合、
getlineしたバッファをmove push_backしたり、shrink_to_fitしてmove
push_backするより、何もせずpush_backでコピーを詰め込んでバッファを使い回しってのが一番速くてメモリ効率もよく、コードもスッキリする
115デフォルトの名無しさん
2020/05/28(木) 00:31:33.05ID:deInkrVp そりゃそうだ
116デフォルトの名無しさん
2020/05/28(木) 05:51:39.46ID:CImYg+b8117デフォルトの名無しさん
2020/05/28(木) 17:31:30.53ID:FcJ3hVy7 Promiseってなんでわざわざfutureを作ってあげなきゃいけないのです?
思想的な話なの?
思想的な話なの?
118デフォルトの名無しさん
2020/05/28(木) 20:27:31.11ID:MpYk07ZW Nowなyoungにバカ受け
119デフォルトの名無しさん
2020/05/28(木) 22:23:48.94ID:deInkrVp 約束ってのは将来果たすためのものだからだよ
120デフォルトの名無しさん
2020/05/29(金) 08:16:47.57ID:eRAtimlp このネーミングセンスには禿も苦笑してたな
121デフォルトの名無しさん
2020/05/29(金) 10:12:51.28ID:pukUYLjc ビャーネ御大と江添のどっちだよ!
122デフォルトの名無しさん
2020/05/31(日) 08:42:17.14ID:iKoRaPmL STLのsetで重複したノードの登録を除外する方法がわかりません
整列基準とするint key1,key2,key3の値にかかわらず、POINT positionが重複する値だったら除外したいのですが、意図した動作になりません
例えば(0,0),(0,1),(1,0),(1,1)の4パターンのみで同一パターンは除外されるようにしたいのに20パターン以上重複して登録されてしまいます
setについてご存知の方いらっしゃいましたらご教示願います
#include <set>
#include <time.h>
#include <windows.h>
using namespace std;
bool operator ==(const POINT& inA, const POINT& inB){ return (inA.x==inB.x)&&(inA.y==inB.y); }
整列基準とするint key1,key2,key3の値にかかわらず、POINT positionが重複する値だったら除外したいのですが、意図した動作になりません
例えば(0,0),(0,1),(1,0),(1,1)の4パターンのみで同一パターンは除外されるようにしたいのに20パターン以上重複して登録されてしまいます
setについてご存知の方いらっしゃいましたらご教示願います
#include <set>
#include <time.h>
#include <windows.h>
using namespace std;
bool operator ==(const POINT& inA, const POINT& inB){ return (inA.x==inB.x)&&(inA.y==inB.y); }
123デフォルトの名無しさん
2020/05/31(日) 08:42:47.02ID:iKoRaPmL //setに入れる要素
class CNode
{
public:
POINT position;
int key1;
int key2;
int key3;
CNode()
{
position.x=rand()%2;
position.y=rand()%2;
key1=rand()%3;
key2=rand()%5;
key3=rand()%10;
}
//setに入れるCNodeポインタを整列する基準を定義
inline bool operator()(const CNode* a, const CNode* b) const
{
//positionの値が同じ要素はsetに登録しない
bool same = (a->position == b->position);
if( same ) return false;
//↑このあたりが怪しい? ここでfalseを返すと登録数が期待よりも多過ぎ、何も返さないと期待よりも少なくなる
//キーでの整列用
if(a->key1 != b->key1) return a->key1 > b->key1;
if(a->key2 != b->key2) return a->key2 > b->key2;
if(a->key3 != b->key3) return a->key3 > b->key3;
return false;
}
};
class CNode
{
public:
POINT position;
int key1;
int key2;
int key3;
CNode()
{
position.x=rand()%2;
position.y=rand()%2;
key1=rand()%3;
key2=rand()%5;
key3=rand()%10;
}
//setに入れるCNodeポインタを整列する基準を定義
inline bool operator()(const CNode* a, const CNode* b) const
{
//positionの値が同じ要素はsetに登録しない
bool same = (a->position == b->position);
if( same ) return false;
//↑このあたりが怪しい? ここでfalseを返すと登録数が期待よりも多過ぎ、何も返さないと期待よりも少なくなる
//キーでの整列用
if(a->key1 != b->key1) return a->key1 > b->key1;
if(a->key2 != b->key2) return a->key2 > b->key2;
if(a->key3 != b->key3) return a->key3 > b->key3;
return false;
}
};
124デフォルトの名無しさん
2020/05/31(日) 08:43:16.96ID:iKoRaPmL typedef set<CNode*, CNode> NODE_POINTER_SET;
int main()
{
srand((unsigned)time(NULL));
int NUM=100;
printf("setへの登録候補数:%d\n",NUM);
CNode* dammy[1];
NODE_POINTER_SET NodePointerSet(dammy, dammy+0, CNode());
CNode* node;
for(int i=0; i<NUM; i++)
{
node = new CNode();
printf("%x:(%d,%d)【%3d %3d %3d】をセットへ\n"
,node
,node->position.x, node->position.y
,node->key1, node->key2, node->key3 );
pair<NODE_POINTER_SET::iterator, bool> insert_result = NodePointerSet.insert(node); //setへ登録
if( false == insert_result.second ) delete node; //重複で登録できなかった場合は確保したメモリを破棄
}
printf("\nset内に登録された要素数:%d\n",NodePointerSet.size());
for(NODE_POINTER_SET::const_iterator it=NodePointerSet.begin(); it!=NodePointerSet.end(); )
{
printf("%x:(%d,%d)【%3d %3d %3d】をセットから\n"
,*it
,(*it)->position.x, (*it)->position.y
,(*it)->key1, (*it)->key2, (*it)->key3 );
delete (*it); //メモリの後始末
it=NodePointerSet.erase(it); //setから削除 itは次の要素を指す
}
}
int main()
{
srand((unsigned)time(NULL));
int NUM=100;
printf("setへの登録候補数:%d\n",NUM);
CNode* dammy[1];
NODE_POINTER_SET NodePointerSet(dammy, dammy+0, CNode());
CNode* node;
for(int i=0; i<NUM; i++)
{
node = new CNode();
printf("%x:(%d,%d)【%3d %3d %3d】をセットへ\n"
,node
,node->position.x, node->position.y
,node->key1, node->key2, node->key3 );
pair<NODE_POINTER_SET::iterator, bool> insert_result = NodePointerSet.insert(node); //setへ登録
if( false == insert_result.second ) delete node; //重複で登録できなかった場合は確保したメモリを破棄
}
printf("\nset内に登録された要素数:%d\n",NodePointerSet.size());
for(NODE_POINTER_SET::const_iterator it=NodePointerSet.begin(); it!=NodePointerSet.end(); )
{
printf("%x:(%d,%d)【%3d %3d %3d】をセットから\n"
,*it
,(*it)->position.x, (*it)->position.y
,(*it)->key1, (*it)->key2, (*it)->key3 );
delete (*it); //メモリの後始末
it=NodePointerSet.erase(it); //setから削除 itは次の要素を指す
}
}
125蟻人間 ◆T6xkBnTXz7B0
2020/05/31(日) 08:47:50.96ID:KExNe49d std::setの整列はlessでstd::unordered_setは整列せずでequalだったと思う。
たぶん近藤してる。
たぶん近藤してる。
126蟻人間 ◆T6xkBnTXz7B0
2020/05/31(日) 08:55:43.87ID:KExNe49d スマポ使わずにdelete使うのは古いよ。
127デフォルトの名無しさん
2020/05/31(日) 09:07:29.52ID:iKoRaPmL >>125
すみません、もう少し詳しくお教え頂けないでしょうか
初心者で見よう見まねでやっているので…
整列はできているのですが、除外がうまく動かないかんじです
スマートポインタは、難しそうなので私にはまだ早いと思っています
(でも、そのうち取り組みたい)
すみません、もう少し詳しくお教え頂けないでしょうか
初心者で見よう見まねでやっているので…
整列はできているのですが、除外がうまく動かないかんじです
スマートポインタは、難しそうなので私にはまだ早いと思っています
(でも、そのうち取り組みたい)
128蟻人間 ◆T6xkBnTXz7B0
2020/05/31(日) 09:13:01.00ID:KExNe49d std::setとstd::unordered_setの規格票を参照。テンプレート引数の最初は値。その次の引数は比較になっている。比較だけど、その比較はequalかlessなのかが問題だ。
lessというのは、不等号で書くと<。
equalというのは、==という意味。
lessというのは、不等号で書くと<。
equalというのは、==という意味。
129デフォルトの名無しさん
2020/05/31(日) 09:41:05.74ID:TtXgrlrn >>127
最初は見よう見まねなのは仕方ないけど、関数の仕様を解説してるページを探して仕様を確認する癖をつけるといいぞ。
最初は見よう見まねなのは仕方ないけど、関数の仕様を解説してるページを探して仕様を確認する癖をつけるといいぞ。
130デフォルトの名無しさん
2020/05/31(日) 09:48:26.67ID:zTMn2qwy まずstd::setについて調べると
https://cpprefjp.github.io/reference/set/set.html
Compareは狭義の弱順序において前ならtrueとある
狭義の弱順序のリンクをたどると
https://cpprefjp.github.io/reference/algorithm.html#strict-weak-ordering
!comp(a, b) && !comp(b, a) として equiv(a, b) を定義する場合、
equiv(a, b) && equiv(b, c) は equiv(a, c) を意味する必要があると書いてある。
あなたの作った比較関数は、この条件を満たさない。
{{0,0},0,0,0}=={{0,1},0,0,0}=={0,1},0,0,1}だが、{{0,0},0,0,0}!={0,1},0,0,1}となってしまう。
https://cpprefjp.github.io/reference/set/set.html
Compareは狭義の弱順序において前ならtrueとある
狭義の弱順序のリンクをたどると
https://cpprefjp.github.io/reference/algorithm.html#strict-weak-ordering
!comp(a, b) && !comp(b, a) として equiv(a, b) を定義する場合、
equiv(a, b) && equiv(b, c) は equiv(a, c) を意味する必要があると書いてある。
あなたの作った比較関数は、この条件を満たさない。
{{0,0},0,0,0}=={{0,1},0,0,0}=={0,1},0,0,1}だが、{{0,0},0,0,0}!={0,1},0,0,1}となってしまう。
131デフォルトの名無しさん
2020/05/31(日) 10:48:27.53ID:zTMn2qwy もう少しざっくりとした説明。
setは、ソートした後に、等しい要素が隣同士に並ぶことを前提としている。
これにより、隣り合った要素とだけ重複判定することで効率化している。
しかし、問題の比較関数でソートしても、等しい要素が隣同士に並ぶとは限らない。
{{0,1},0,0,6}, {{0,3},0,0,4}, {{0,1},0,0,2}
のような要素列を、この比較関数でソートしても、順序は変わらない。
先頭と末尾が等しいはずなのに隣り合っていないため、重複判定が行われない。
setは、ソートした後に、等しい要素が隣同士に並ぶことを前提としている。
これにより、隣り合った要素とだけ重複判定することで効率化している。
しかし、問題の比較関数でソートしても、等しい要素が隣同士に並ぶとは限らない。
{{0,1},0,0,6}, {{0,3},0,0,4}, {{0,1},0,0,2}
のような要素列を、この比較関数でソートしても、順序は変わらない。
先頭と末尾が等しいはずなのに隣り合っていないため、重複判定が行われない。
132デフォルトの名無しさん
2020/05/31(日) 11:51:01.53ID:iKoRaPmL 難しいですね…
つまり
//positionの値が同じ要素はsetに登録しない
bool same = (a->position == b->position);
if( same ) return false;
のところをどう書き直したら動くのでしょうか?
どうか教えて下さい
m(_ _)mこのとおり!
つまり
//positionの値が同じ要素はsetに登録しない
bool same = (a->position == b->position);
if( same ) return false;
のところをどう書き直したら動くのでしょうか?
どうか教えて下さい
m(_ _)mこのとおり!
133デフォルトの名無しさん
2020/05/31(日) 11:53:09.13ID:27DcnLkI 弱順序とか区分化とかあの説明だけで理解できたら天才だろ
だから群論・集合論の教科書を数冊読むとC++がスラスラと理解できるようになる
だから群論・集合論の教科書を数冊読むとC++がスラスラと理解できるようになる
134デフォルトの名無しさん
2020/05/31(日) 11:53:23.87ID:J1D5Z9UC 自分でやる気がない人に教える気にはならないなぁ。
135デフォルトの名無しさん
2020/05/31(日) 12:02:25.63ID:6nfzU/vT bool CNode::operator<(const CNode& rhs) const {
if (key1 != rhs.key1) { return (key1 < rhs.key1); }
else if (key2 != rhs.key2) { return (key2 < rhs.key2); }
else if (key3 != rhs.key3) { return (key3 < rhs.key3); }
else { return false; }
}
を実装したら最低限逝ける、
等値演算子「==」は、それがCNodeのメソッドまたはCNode&を引数にとる
関数定義がなされていなければ(!(a < b) && !(b < a))で遂行される
ただしそれでは効率が悪いので(「==」1回につきoperator<()が2回呼ばれるので)、
「==」も手動で実装したらモアベターではある
if (key1 != rhs.key1) { return (key1 < rhs.key1); }
else if (key2 != rhs.key2) { return (key2 < rhs.key2); }
else if (key3 != rhs.key3) { return (key3 < rhs.key3); }
else { return false; }
}
を実装したら最低限逝ける、
等値演算子「==」は、それがCNodeのメソッドまたはCNode&を引数にとる
関数定義がなされていなければ(!(a < b) && !(b < a))で遂行される
ただしそれでは効率が悪いので(「==」1回につきoperator<()が2回呼ばれるので)、
「==」も手動で実装したらモアベターではある
136デフォルトの名無しさん
2020/05/31(日) 12:12:06.34ID:zTMn2qwy137デフォルトの名無しさん
2020/05/31(日) 12:25:20.78ID:HQ8vNkm/ そもそもCNodeにoperator<実装してないのになんでコンパイル通ってんのか謎
隠してるコードがあるなら全部出せ
隠してるコードがあるなら全部出せ
138デフォルトの名無しさん
2020/05/31(日) 12:45:05.74ID:J1D5Z9UC >>137
> typedef set<CNode*, CNode> NODE_POINTER_SET;
> typedef set<CNode*, CNode> NODE_POINTER_SET;
139蟻人間 ◆T6xkBnTXz7B0
2020/05/31(日) 12:51:20.01ID:KExNe49d inline bool operator()(const CNode* a, const CNode* b) const
{
if(a->key1 < b->key1) return true;
if(a->key1 > b->key1) return false;
if(a->key2 < b->key2) return true;
if(a->key2 > b->key2) return false;
if(a->key3 < b->key3) return true;
if(a->key3 > b->key3) return false;
//ここまでヒント。
}
{
if(a->key1 < b->key1) return true;
if(a->key1 > b->key1) return false;
if(a->key2 < b->key2) return true;
if(a->key2 > b->key2) return false;
if(a->key3 < b->key3) return true;
if(a->key3 > b->key3) return false;
//ここまでヒント。
}
140デフォルトの名無しさん
2020/05/31(日) 12:58:31.73ID:6nfzU/vT >//positionの値が同じ要素はsetに登録しない
>bool same = (a->position == b->position);
>if( same ) return false;
仕様誤解してたサーセンgrz、、
>bool same = (a->position == b->position);
>if( same ) return false;
仕様誤解してたサーセンgrz、、
141デフォルトの名無しさん
2020/05/31(日) 13:17:45.26ID:iKoRaPmL 皆様ありがとうございます
>>135
なるほど、<が2回呼ばれるのですか(いろいろ試していて2回ずつカウントされているのを不思議に思ってました)
ご紹介頂いたコードを追加しましたが、rhsがポインタでないせいか効果がありませんでした
ポインタを、そのメンバ変数基準で整列させたいのですが、
bool operator<(const CNode* lhs, const CNode* rhs)const
で定義しようとするとコンパイルエラーC2804
binary 'operator <' に引数が多すぎます。
になってしまいます
==演算子も同様に駄目でした
<や==演算子オーバーロードでポインタを整列させる事は無理なのでしょうか?
>>140
の内容からすると、無理なのかな?
(自分で試してみて無理そうだと思ったので、仕方なく()オーバーロードで定義を書いていました)
>>139
ヒント見ても理解できないこの無能な鈍物めにお答えを賜りたく
どうかお願いします!
>>135
なるほど、<が2回呼ばれるのですか(いろいろ試していて2回ずつカウントされているのを不思議に思ってました)
ご紹介頂いたコードを追加しましたが、rhsがポインタでないせいか効果がありませんでした
ポインタを、そのメンバ変数基準で整列させたいのですが、
bool operator<(const CNode* lhs, const CNode* rhs)const
で定義しようとするとコンパイルエラーC2804
binary 'operator <' に引数が多すぎます。
になってしまいます
==演算子も同様に駄目でした
<や==演算子オーバーロードでポインタを整列させる事は無理なのでしょうか?
>>140
の内容からすると、無理なのかな?
(自分で試してみて無理そうだと思ったので、仕方なく()オーバーロードで定義を書いていました)
>>139
ヒント見ても理解できないこの無能な鈍物めにお答えを賜りたく
どうかお願いします!
142デフォルトの名無しさん
2020/05/31(日) 13:48:52.93ID:J1D5Z9UC >>122
> 整列基準とするint key1,key2,key3の値にかかわらず、POINT positionが重複する値だったら除外したい
これ要求に間違いが無いなら、独立した比較基準(整列用と重複判定用)が2つあることになるので、
単一の比較関数(およびset)で解決しようとしてるのが間違いかな。
> 整列基準とするint key1,key2,key3の値にかかわらず、POINT positionが重複する値だったら除外したい
これ要求に間違いが無いなら、独立した比較基準(整列用と重複判定用)が2つあることになるので、
単一の比較関数(およびset)で解決しようとしてるのが間違いかな。
143デフォルトの名無しさん
2020/05/31(日) 13:58:58.98ID:27DcnLkI △ ヒント
○ これ以上は分かりませんでしたがMOTTAINAIので貼ります
○ これ以上は分かりませんでしたがMOTTAINAIので貼ります
144デフォルトの名無しさん
2020/05/31(日) 14:31:43.92ID:iKoRaPmL 簡単に出来そうだと思っていた事が、結構な難問だったようですね…
自分の力では無理そうだという事がわかっただけでも収穫でした
皆様ありがとうございました
自分の力では無理そうだという事がわかっただけでも収穫でした
皆様ありがとうございました
145デフォルトの名無しさん
2020/05/31(日) 14:33:26.01ID:6nfzU/vT 回答を示す、
1. 「<」と「==」演算子をグローバルな関数として定義する版:
https://ideone.com/Qdi402
2. 「<」と「==」演算子をクラスのメソッドとして定義する版:
https://ideone.com/3JTyiJ
3. (参考)スマポ版
https://ideone.com/bYOWcR
元のコードはいきなりinsertしようとしているがinsertの動作はinsertしてから重複だったかどうか返すというものなので、
生ポインタ版である1と2では事前にfindしている
3は事前findが不要で本来のコードとなったが、動作は後優先(先にinsertしたaと、後からinsertしたbがsameの場合、aが削除され、bが残る。)
1. 「<」と「==」演算子をグローバルな関数として定義する版:
https://ideone.com/Qdi402
2. 「<」と「==」演算子をクラスのメソッドとして定義する版:
https://ideone.com/3JTyiJ
3. (参考)スマポ版
https://ideone.com/bYOWcR
元のコードはいきなりinsertしようとしているがinsertの動作はinsertしてから重複だったかどうか返すというものなので、
生ポインタ版である1と2では事前にfindしている
3は事前findが不要で本来のコードとなったが、動作は後優先(先にinsertしたaと、後からinsertしたbがsameの場合、aが削除され、bが残る。)
146デフォルトの名無しさん
2020/05/31(日) 14:40:09.33ID:J1D5Z9UC147デフォルトの名無しさん
2020/05/31(日) 15:24:55.05ID:6nfzU/vT >>146
> > insertの動作はinsertしてから重複だったかどうか返すというもの
> 要出展
仕様誤解してたサーセンgrz、、
と言うわけで>>145のソースコードは以下の通り訂正汁、
1のソースコード ==> https://ideone.com/uRTmmo
2のソースコード ==> https://ideone.com/EdndM1
3のソースコード ==> https://ideone.com/UYMN5D
(3は間違ったコメントを削除、およびアドレスの表示の誤りを訂正)
> > 等値演算子「==」は、それがCNodeのメソッドまたはCNode&を引数にとる
> > 関数定義がなされていなければ(!(a < b) && !(b < a))で遂行される
> 要出典
しらそん;;
テンプレートの定義とC++の言語仕様とかstd::rel_opsの存在意義とか想像したらワカル
> > insertの動作はinsertしてから重複だったかどうか返すというもの
> 要出展
仕様誤解してたサーセンgrz、、
と言うわけで>>145のソースコードは以下の通り訂正汁、
1のソースコード ==> https://ideone.com/uRTmmo
2のソースコード ==> https://ideone.com/EdndM1
3のソースコード ==> https://ideone.com/UYMN5D
(3は間違ったコメントを削除、およびアドレスの表示の誤りを訂正)
> > 等値演算子「==」は、それがCNodeのメソッドまたはCNode&を引数にとる
> > 関数定義がなされていなければ(!(a < b) && !(b < a))で遂行される
> 要出典
しらそん;;
テンプレートの定義とC++の言語仕様とかstd::rel_opsの存在意義とか想像したらワカル
148デフォルトの名無しさん
2020/05/31(日) 15:28:53.38ID:xFqcIaF1 C++は美しい
bool operator <(const POINT& inA, const POINT& inB){
int rA2 = ( inA.x * inA.x + inA.y * inA.y );
int rB2 = ( inB.x * inB.x + inB.y * inB.y );
return ( ( rA2 < rB2 ) || ( ( rA2 == rB2 ) && ( inA.y < inB.y ) ) );
}
inline bool operator()(const CNode* a, const CNode* b) const{
if(a->key1 != b->key1) return a->key1 > b->key1;
if(a->key2 != b->key2) return a->key2 > b->key2;
if(a->key3 != b->key3) return a->key3 > b->key3;
return false;
}
NODE_POINTER_SET NodePointerSet2(dammy, dammy+0, CNode());
for(int i=0; i<NUM; i++){
node = new CNode();
pair<NODE_POINTER_SET::iterator, bool> insert_result = NodePointerSet2.insert(node); //setへ登録
if( false == insert_result.second ) delete node; //重複で登録できなかった場合は確保したメモリを破棄
}
std::map<POINT, CNode*> mp;
for(NODE_POINTER_SET::const_iterator it=NodePointerSet2.begin(); it!=NodePointerSet2.end(); it++ ){
if( !mp[(*it)->position] ){
mp[(*it)->position] = (*it);
pair<NODE_POINTER_SET::iterator, bool> insert_result = NodePointerSet.insert((*it)); //setへ登録
}
}
bool operator <(const POINT& inA, const POINT& inB){
int rA2 = ( inA.x * inA.x + inA.y * inA.y );
int rB2 = ( inB.x * inB.x + inB.y * inB.y );
return ( ( rA2 < rB2 ) || ( ( rA2 == rB2 ) && ( inA.y < inB.y ) ) );
}
inline bool operator()(const CNode* a, const CNode* b) const{
if(a->key1 != b->key1) return a->key1 > b->key1;
if(a->key2 != b->key2) return a->key2 > b->key2;
if(a->key3 != b->key3) return a->key3 > b->key3;
return false;
}
NODE_POINTER_SET NodePointerSet2(dammy, dammy+0, CNode());
for(int i=0; i<NUM; i++){
node = new CNode();
pair<NODE_POINTER_SET::iterator, bool> insert_result = NodePointerSet2.insert(node); //setへ登録
if( false == insert_result.second ) delete node; //重複で登録できなかった場合は確保したメモリを破棄
}
std::map<POINT, CNode*> mp;
for(NODE_POINTER_SET::const_iterator it=NodePointerSet2.begin(); it!=NodePointerSet2.end(); it++ ){
if( !mp[(*it)->position] ){
mp[(*it)->position] = (*it);
pair<NODE_POINTER_SET::iterator, bool> insert_result = NodePointerSet.insert((*it)); //setへ登録
}
}
149デフォルトの名無しさん
2020/05/31(日) 15:41:55.39ID:J1D5Z9UC150デフォルトの名無しさん
2020/05/31(日) 16:08:01.03ID:HQ8vNkm/ setの重複排除条件をコントロールしたいだけなら
std::(unordered_)setのPredテンプレート引数で制御すればいいだけの話じゃないの?
からかって遊んでるだけ?
std::(unordered_)setのPredテンプレート引数で制御すればいいだけの話じゃないの?
からかって遊んでるだけ?
151デフォルトの名無しさん
2020/05/31(日) 16:37:00.29ID:zTMn2qwy positionによる重複削除だけでなく、key1〜3によるソートと重複削除も必要だから
単純に順番にやるだけだと、余計な要素まで消えてしまう。
{{0,0},0,0,0},{{0,0},0,0,1},{{0,1},0,0,0}
みたいなデータがあった場合、単純にpositionによる重複削除を先に実施してしまうと
{{0,0},0,0,0},{{0,1},0,0,0}
みたいになって、そこからkey1〜3によるソートと重複削除を行うと
{{0,0},0,0,0}
だけになってしまう。逆順でも同様の問題がある。
単純に順番にやるだけだと、余計な要素まで消えてしまう。
{{0,0},0,0,0},{{0,0},0,0,1},{{0,1},0,0,0}
みたいなデータがあった場合、単純にpositionによる重複削除を先に実施してしまうと
{{0,0},0,0,0},{{0,1},0,0,0}
みたいになって、そこからkey1〜3によるソートと重複削除を行うと
{{0,0},0,0,0}
だけになってしまう。逆順でも同様の問題がある。
152デフォルトの名無しさん
2020/05/31(日) 16:47:23.53ID:HQ8vNkm/ その隠し要件どこに書いてるの?もしそれが必要なら横着せずに全部持っておくしかないね
153デフォルトの名無しさん
2020/05/31(日) 17:24:57.13ID:zTMn2qwy 書いてるところはない。すまん。
154122
2020/06/01(月) 08:41:58.41ID:VTbJvOd1 すみません仕様間違えていました
>positionによる重複削除だけでなく、key1〜3によるソートと重複削除も必要
ではなく
positionによる重複削除だけでなく、key1〜3によるソートも必要
で、key1〜3が全部同じでもpositionが異なれば重複削除はしないという仕様が正しかったです
なので
>>148さんが書いて下さったコードを追加して、
if(a->key1 != b->key1) return a->key1 > b->key1;
if(a->key2 != b->key2) return a->key2 > b->key2;
if(a->key3 != b->key3) return a->key3 > b->key3;
return true;//ここをfalseではなくtrueに変更
にしたら、期待どおりの動作をしました
148さん本当にありがとうございます!とても助かりました
147さんもありがとうございます
>positionによる重複削除だけでなく、key1〜3によるソートと重複削除も必要
ではなく
positionによる重複削除だけでなく、key1〜3によるソートも必要
で、key1〜3が全部同じでもpositionが異なれば重複削除はしないという仕様が正しかったです
なので
>>148さんが書いて下さったコードを追加して、
if(a->key1 != b->key1) return a->key1 > b->key1;
if(a->key2 != b->key2) return a->key2 > b->key2;
if(a->key3 != b->key3) return a->key3 > b->key3;
return true;//ここをfalseではなくtrueに変更
にしたら、期待どおりの動作をしました
148さん本当にありがとうございます!とても助かりました
147さんもありがとうございます
155デフォルトの名無しさん
2020/06/01(月) 08:53:47.81ID:idPskxLG >>154
> return true;//ここをfalseではなくtrueに変更
明らかに違反してるじゃねーの?
https://cpprefjp.github.io/reference/algorithm.html#strict-weak-ordering
> 「狭義 (strict) 」 は非反射関係 (irreflexive relation) (全ての x について !comp(x,x) である)の要求
> return true;//ここをfalseではなくtrueに変更
明らかに違反してるじゃねーの?
https://cpprefjp.github.io/reference/algorithm.html#strict-weak-ordering
> 「狭義 (strict) 」 は非反射関係 (irreflexive relation) (全ての x について !comp(x,x) である)の要求
156デフォルトの名無しさん
2020/06/01(月) 09:14:14.95ID:VTbJvOd1 難しい事はわかりませんが、
動作検証が足りてないかんじでしょうか
もし駄目だったら、諦めて別の方法を考えようと思います
動作検証が足りてないかんじでしょうか
もし駄目だったら、諦めて別の方法を考えようと思います
157デフォルトの名無しさん
2020/06/01(月) 14:34:32.60ID:o7IiynR8 double *array1;
array1 = new double[count]();
と書いた場合の、[count] の後ろの () の意味は何でしょうか?
array1 = new double[count];
と書いた場合との違いは何でしょうか?
()の中に何か書くことは出来ますか?
array1 = new double[count]();
と書いた場合の、[count] の後ろの () の意味は何でしょうか?
array1 = new double[count];
と書いた場合との違いは何でしょうか?
()の中に何か書くことは出来ますか?
158はちみつ餃子 ◆8X2XSCHEME
2020/06/01(月) 15:11:25.75ID:0yVOdbpz >>157
内容を初期化するかどうか。
普通のクラスでは括弧がなくてもデフォルトコンストラクタで初期化されるので
空の括弧があってもなくても意味はかわらないけど、
プリミティブな型などでは括弧無しのときは初期化しない。 (つまり内容は不定)
括弧があればゼロで初期化されることが保証される。
C++14 あたりからはこんな感じで初期化することもできるよ。
double *array1 = new double[]{1,2,3};
内容を初期化するかどうか。
普通のクラスでは括弧がなくてもデフォルトコンストラクタで初期化されるので
空の括弧があってもなくても意味はかわらないけど、
プリミティブな型などでは括弧無しのときは初期化しない。 (つまり内容は不定)
括弧があればゼロで初期化されることが保証される。
C++14 あたりからはこんな感じで初期化することもできるよ。
double *array1 = new double[]{1,2,3};
159デフォルトの名無しさん
2020/06/01(月) 15:34:55.48ID:o7IiynR8 >>158
をー。有難う。
をー。有難う。
160デフォルトの名無しさん
2020/06/01(月) 18:12:14.25ID:8BAaT/q7 昔はよく{0}って書いてたというか書けなかったな
161デフォルトの名無しさん
2020/06/01(月) 18:13:08.51ID:8BAaT/q7 ×書けなかったな
○しか書けなかった
○しか書けなかった
162デフォルトの名無しさん
2020/06/02(火) 10:09:36.47ID:d/ekt+66 ヘッダでvector要素の型を先行宣言で済ますことができるのc++20からだっけ?
163デフォルトの名無しさん
2020/06/02(火) 11:21:52.93ID:7ZgjbGq0 Working Draft, Standard for Programming Language C++
Document Number: N4713, Date: 2017-11-27
というPDFを読んでいるんだけど、explicitキーワードの事について調べようとしても、
索引(index)には載ってないようだけど、どこに書いてる?
Document Number: N4713, Date: 2017-11-27
というPDFを読んでいるんだけど、explicitキーワードの事について調べようとしても、
索引(index)には載ってないようだけど、どこに書いてる?
164デフォルトの名無しさん
2020/06/02(火) 12:04:07.50ID:eZHppilZ >>163
N4713だよね? P.1373の2行目は見た?
N4713だよね? P.1373の2行目は見た?
165デフォルトの名無しさん
2020/06/02(火) 12:30:40.82ID:7ZgjbGq0 >>164
Indexのspecifier項目のサブ項目として書いてあったんですね。
でもこれだとexplicitが何なのかを知りたい人にとっては索引としての役割を果たさないです。
いわば国語辞典で知らない単語を調べるのに勝手にカテゴリー分けしてあるようなものです。
それでは辞典の意味をなしません。
Indexのspecifier項目のサブ項目として書いてあったんですね。
でもこれだとexplicitが何なのかを知りたい人にとっては索引としての役割を果たさないです。
いわば国語辞典で知らない単語を調べるのに勝手にカテゴリー分けしてあるようなものです。
それでは辞典の意味をなしません。
166はちみつ餃子 ◆8X2XSCHEME
2020/06/02(火) 12:34:14.97ID:N0F889O8167デフォルトの名無しさん
2020/06/02(火) 12:47:31.50ID:67GQ09ou 試しに検索かけたら1102件もヒットしたやんけ!餃子のバカバカ
168デフォルトの名無しさん
2020/06/02(火) 13:55:05.15ID:7ZgjbGq0 AdobeRederは使いにくいので、SumatraPDF Reader を使って、まず、
左側のペーンに出てくる目次で index をクリックし、右側のペーンに
巻末の索引を出した後、右側のペーンの中で CTRL+Fを押して、
explicitを検索すると良いよう。
左側のペーンに出てくる目次で index をクリックし、右側のペーンに
巻末の索引を出した後、右側のペーンの中で CTRL+Fを押して、
explicitを検索すると良いよう。
169デフォルトの名無しさん
2020/06/02(火) 14:01:01.31ID:Ja+74ng6 素直にありがとうも言えないのか
これだからC++erは
これだからC++erは
170デフォルトの名無しさん
2020/06/02(火) 14:11:59.21ID:7ZgjbGq0 >>169
ありがとう。
ありがとう。
171デフォルトの名無しさん
2020/06/02(火) 14:58:48.73ID:7ZgjbGq0 nested-name-specifier:
::
type-name ::
namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier template opt simple-template-id ::
と有るのですが、このBNFだけで解釈するなら、ns1, ns2,ns3 という namespace が有った場合の
ns1::ns2::ns3::変数名
のような場合、
namespace-nameと認識されるのは ns1だけで、ns2,ns3は、identifierと
識別されるのでしょうか。
::
type-name ::
namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier template opt simple-template-id ::
と有るのですが、このBNFだけで解釈するなら、ns1, ns2,ns3 という namespace が有った場合の
ns1::ns2::ns3::変数名
のような場合、
namespace-nameと認識されるのは ns1だけで、ns2,ns3は、identifierと
識別されるのでしょうか。
172デフォルトの名無しさん
2020/06/02(火) 15:00:52.54ID:7ZgjbGq0 ちなみに、
namespace-name:
identifier
namespace-alias
namespace-alias:
identifier
となっており、namespace-nameには、a::bb::cc のようなものは含まれないと思われます。
namespace-name:
identifier
namespace-alias
namespace-alias:
identifier
となっており、namespace-nameには、a::bb::cc のようなものは含まれないと思われます。
174デフォルトの名無しさん
2020/06/02(火) 16:38:50.35ID:7ZgjbGq0 >>171
の定義だと、
decltype(x)::decltype(y)::decltype(z)
のようなものは使えないということになるようです。
ひょっとすると、C++の仕様書的には、
ns1::ns2::ns3::変数名
も使えないのもかも知れませんがよく分かりません。
の定義だと、
decltype(x)::decltype(y)::decltype(z)
のようなものは使えないということになるようです。
ひょっとすると、C++の仕様書的には、
ns1::ns2::ns3::変数名
も使えないのもかも知れませんがよく分かりません。
175デフォルトの名無しさん
2020/06/02(火) 17:48:50.88ID:eZHppilZ176デフォルトの名無しさん
2020/06/02(火) 19:53:34.27ID:Ja+74ng6 よくわかんないけど
ツイッターで誹謗中傷してそう
ツイッターで誹謗中傷してそう
177デフォルトの名無しさん
2020/06/03(水) 10:50:24.30ID:TdRUmxlv https://en.cppreference.com/w/cpp/utility/hash
MyHash{}(obj)
std::hash<S>{}(obj)
の{}は、直接リスト初期化のもので、いったんMyHash型やstd::hash<S>型のテンポラリ・オブジェクトを作成してからoperator()関数をobjを実引数にして呼び出しているという理解でよろしいですか?
MyHash{}(obj)
std::hash<S>{}(obj)
の{}は、直接リスト初期化のもので、いったんMyHash型やstd::hash<S>型のテンポラリ・オブジェクトを作成してからoperator()関数をobjを実引数にして呼び出しているという理解でよろしいですか?
178デフォルトの名無しさん
2020/06/03(水) 11:38:29.12ID:Nfbl5e81 newしたあとにdeleteしなくてもアプリケーションを終了すればメモリは解放されますか?
179デフォルトの名無しさん
2020/06/03(水) 11:58:33.77ID:VI2pYiE8 OSによる
180デフォルトの名無しさん
2020/06/03(水) 12:21:28.49ID:TdRUmxlv181デフォルトの名無しさん
2020/06/03(水) 12:24:39.32ID:DAHZjgl3182デフォルトの名無しさん
2020/06/03(水) 12:28:15.38ID:Nfbl5e81183はちみつ餃子 ◆8X2XSCHEME
2020/06/03(水) 13:34:40.56ID:3vvIkHpN >>178
プロセスに割り当てられているメモリは現代の普通のデスクトップOS上でならプロセスの終了と共に解放されるのだけど、
オブジェクトは外部のリソースのハンドルを掴んでいることがあるから
それを正常に (デストラクタで) 後始末しないとリソースリークが起こる可能性はある。
POD 型のオブジェクトに限ってならば管理されてるリソースはメモリだけだから
delete しなくてもプロセス終了時におおよそ安全に解放されることは期待していいと思う。
言語仕様での保証はないので C++ スレ的に言えば「やめとけ」ってことになるけど。
プロセスに割り当てられているメモリは現代の普通のデスクトップOS上でならプロセスの終了と共に解放されるのだけど、
オブジェクトは外部のリソースのハンドルを掴んでいることがあるから
それを正常に (デストラクタで) 後始末しないとリソースリークが起こる可能性はある。
POD 型のオブジェクトに限ってならば管理されてるリソースはメモリだけだから
delete しなくてもプロセス終了時におおよそ安全に解放されることは期待していいと思う。
言語仕様での保証はないので C++ スレ的に言えば「やめとけ」ってことになるけど。
184デフォルトの名無しさん
2020/06/03(水) 13:47:15.12ID:gQ0mUfsI メモリと断っている人に余計なこといわなくていいと思うけど
アプリの異常終了であっても解放されてほしいのだろうから
c++の終了処理に依存してもしゃない
アプリの異常終了であっても解放されてほしいのだろうから
c++の終了処理に依存してもしゃない
185デフォルトの名無しさん
2020/06/03(水) 14:24:00.16ID:UHE1JPNz >>181
何がたまたまの結果だよ
C++規格票とドラフトは巻末に索引があって
検索でヒットしすぎるときは末尾を見に行けば
そこは索引の中である可能性が大きいというのを
思いつくことができんのかおまえさんの頭では
だから見つけられなくて聞いてきたというなら合点だ
何がたまたまの結果だよ
C++規格票とドラフトは巻末に索引があって
検索でヒットしすぎるときは末尾を見に行けば
そこは索引の中である可能性が大きいというのを
思いつくことができんのかおまえさんの頭では
だから見つけられなくて聞いてきたというなら合点だ
186デフォルトの名無しさん
2020/06/03(水) 14:27:27.09ID:UHE1JPNz >>178
世の中すべての::operator newの内容を確認してからでないと答えられない質問だ
もっと言うなら将来にわたってタイムマシンで確認してくる必要があるから
調査の工数が発散しちまう
どういう意味かわかるな?
世の中すべての::operator newの内容を確認してからでないと答えられない質問だ
もっと言うなら将来にわたってタイムマシンで確認してくる必要があるから
調査の工数が発散しちまう
どういう意味かわかるな?
187デフォルトの名無しさん
2020/06/03(水) 15:04:54.04ID:TdRUmxlv https://qiita.com/SaitoAtsushi/items/8da8ae7f6b84b1d806e4
int main(){
double a = 1.5;
std::string b = "Hello World";
struct foo{};
xyz(a, b, foo());
}
↑のfoo()は一時オブジェクトの作成ですね?
int main(){
double a = 1.5;
std::string b = "Hello World";
struct foo{};
xyz(a, b, foo());
}
↑のfoo()は一時オブジェクトの作成ですね?
188デフォルトの名無しさん
2020/06/03(水) 15:11:30.37ID:DAHZjgl3 >>185
他人の茶々入れに何言ってんだよw
他人の茶々入れに何言ってんだよw
189デフォルトの名無しさん
2020/06/03(水) 15:12:28.27ID:DAHZjgl3 >>186
やはりこんな奴かwww
やはりこんな奴かwww
190デフォルトの名無しさん
2020/06/03(水) 15:35:53.72ID:TdRUmxlv めちゃくちゃ難しいです。#100の部分は恐らく「部分特殊化」というものだと思うのですが、
自分がネットで調べた簡単な部分特殊化とはちょっと違っているようです。
https://ja.wikipedia.org/wiki/SFINAE
// どのようなテンプレート引数であってもvoidになる
template <typename... Ts> using void_t = void;
template <typename T, typename = void>
struct has_typedef_foobar : std::false_type {};
// #100
template <typename T>
struct has_typedef_foobar<T, void_t<typename T::foobar>> : std::true_type {}; // T::foobarが存在すれば、こちらが有効になる
struct foo {
using foobar = float;
};
int main() {
std::cout << std::boolalpha;
std::cout << has_typedef_foobar<int>::value << std::endl;
std::cout << has_typedef_foobar<foo>::value << std::endl;
}
自分がネットで調べた簡単な部分特殊化とはちょっと違っているようです。
https://ja.wikipedia.org/wiki/SFINAE
// どのようなテンプレート引数であってもvoidになる
template <typename... Ts> using void_t = void;
template <typename T, typename = void>
struct has_typedef_foobar : std::false_type {};
// #100
template <typename T>
struct has_typedef_foobar<T, void_t<typename T::foobar>> : std::true_type {}; // T::foobarが存在すれば、こちらが有効になる
struct foo {
using foobar = float;
};
int main() {
std::cout << std::boolalpha;
std::cout << has_typedef_foobar<int>::value << std::endl;
std::cout << has_typedef_foobar<foo>::value << std::endl;
}
192デフォルトの名無しさん
2020/06/03(水) 15:42:50.44ID:UHE1JPNz >>188
他人かどうかは関係ねえぜ
俺が生活の知恵と言ったことを
たまたまの結果と言ったのはおまえさんに他ならない
必然的に思いつくまでの思考過程を示されて
自分の浅はかさを誤魔化すのに他人がどうのと
再び浅はかな言い訳で恥の上塗りするのは
やめたほうがいいんじゃないかな
他人かどうかは関係ねえぜ
俺が生活の知恵と言ったことを
たまたまの結果と言ったのはおまえさんに他ならない
必然的に思いつくまでの思考過程を示されて
自分の浅はかさを誤魔化すのに他人がどうのと
再び浅はかな言い訳で恥の上塗りするのは
やめたほうがいいんじゃないかな
193デフォルトの名無しさん
2020/06/03(水) 15:44:00.45ID:TdRUmxlv >>190
部分特殊化とは、
template <typename T1, typename T2>
class A {・・・}; //#1
として、「primary class template」を定義後、もし、
template <typename T>
class A<T, void>{・・・}; //#2
と書いた場合、
A<int,int> なら、#1が、A<int>なら#2が適用されるということでしょうか?
ならば、A<int,void>はどうなるんでしょう??
部分特殊化とは、
template <typename T1, typename T2>
class A {・・・}; //#1
として、「primary class template」を定義後、もし、
template <typename T>
class A<T, void>{・・・}; //#2
と書いた場合、
A<int,int> なら、#1が、A<int>なら#2が適用されるということでしょうか?
ならば、A<int,void>はどうなるんでしょう??
194デフォルトの名無しさん
2020/06/03(水) 15:46:30.08ID:DAHZjgl3 >>192
やはりこういうやつかwww
やはりこういうやつかwww
195デフォルトの名無しさん
2020/06/03(水) 15:47:08.09ID:UHE1JPNz #2
つーか、そんくらいやってみろよ
つーか、そんくらいやってみろよ
196デフォルトの名無しさん
2020/06/03(水) 15:47:50.07ID:UHE1JPNz >>194
やーい、同じことしか言わなくなってやんのw
やーい、同じことしか言わなくなってやんのw
197デフォルトの名無しさん
2020/06/03(水) 15:49:26.08ID:DAHZjgl3 必ずしも索引があるとは限らないのにあることを一般論化してドヤ顔するのと
ヒープ解放するかどうかはすべてを尽くして調べられないからわからたないとドヤ顔してる奴が
同じ人物だってのが困るわぁwwww
ヒープ解放するかどうかはすべてを尽くして調べられないからわからたないとドヤ顔してる奴が
同じ人物だってのが困るわぁwwww
198デフォルトの名無しさん
2020/06/03(水) 15:49:47.87ID:DAHZjgl3199デフォルトの名無しさん
2020/06/03(水) 15:52:20.19ID:TdRUmxlv >>193 >>195
2017年のDraftのPDFには、以下のようにあり、部分特殊化をinstance化する際には、A<int>ではなく、A<int,int*>
と書く例があります:
Partial specialization declarations themselves are not found by name lookup. Rather, when the primary
template name is used, any previously-declared partial specializations of the primary template are also
considered. One consequence is that a using-declaration which refers to a class template does not restrict the
set of partial specializations which may be found through the using-declaration. [Example:
namespace N {
template<class T1, class T2> class A { }; // primary template
}
using N::A; // refers to the primary template
namespace N {
template<class T> class A<T, T*> { }; // partial specialization
}
A<int,int*> a; // uses the partial specialization, which is found through the using-declaration
// which refers to the primary template
—end example ]
2017年のDraftのPDFには、以下のようにあり、部分特殊化をinstance化する際には、A<int>ではなく、A<int,int*>
と書く例があります:
Partial specialization declarations themselves are not found by name lookup. Rather, when the primary
template name is used, any previously-declared partial specializations of the primary template are also
considered. One consequence is that a using-declaration which refers to a class template does not restrict the
set of partial specializations which may be found through the using-declaration. [Example:
namespace N {
template<class T1, class T2> class A { }; // primary template
}
using N::A; // refers to the primary template
namespace N {
template<class T> class A<T, T*> { }; // partial specialization
}
A<int,int*> a; // uses the partial specialization, which is found through the using-declaration
// which refers to the primary template
—end example ]
200デフォルトの名無しさん
2020/06/03(水) 16:02:27.31ID:UHE1JPNz201はちみつ餃子 ◆8X2XSCHEME
2020/06/03(水) 16:06:58.23ID:3vvIkHpN >>193
ほんとに >>195 の言う通りだわ。
やってみてから思った通りにならないのはなんでだろうっていうならまだしも
「どうなるんでしょうか」なんてやってみりゃわかることだろ。
まあ C++ には未定義とか処理系定義とかもあるから
実際の挙動を以て言語仕様を理解しようとするのは危険でもあるんだが……。
特殊化ってのはまさに「特殊な場合」を定義するもんだよ。
その場合には A<T1, T2> のテンプレートの特殊な場合として A<T, void> の場合を定義してることになる。
特殊な場合である A<T, void> は特殊でない場合の A<T1, T2> と同じ形式である必要がある。
>>199
基本的な理念が理解できていないのに仕様を読んでも理解できねーよ。
(まあたまには仕様からとっかかる超人もいないことはないが。)
お前は Rust スレでも見当はずれの根拠をコピペしては意味不明なことを言ってるが、
普通に入門書を読んでくれ。
ほんとに >>195 の言う通りだわ。
やってみてから思った通りにならないのはなんでだろうっていうならまだしも
「どうなるんでしょうか」なんてやってみりゃわかることだろ。
まあ C++ には未定義とか処理系定義とかもあるから
実際の挙動を以て言語仕様を理解しようとするのは危険でもあるんだが……。
特殊化ってのはまさに「特殊な場合」を定義するもんだよ。
その場合には A<T1, T2> のテンプレートの特殊な場合として A<T, void> の場合を定義してることになる。
特殊な場合である A<T, void> は特殊でない場合の A<T1, T2> と同じ形式である必要がある。
>>199
基本的な理念が理解できていないのに仕様を読んでも理解できねーよ。
(まあたまには仕様からとっかかる超人もいないことはないが。)
お前は Rust スレでも見当はずれの根拠をコピペしては意味不明なことを言ってるが、
普通に入門書を読んでくれ。
202デフォルトの名無しさん
2020/06/03(水) 16:19:58.53ID:H6kZ1pQy イキイキしてんなwww
203デフォルトの名無しさん
2020/06/03(水) 16:24:47.80ID:DAHZjgl3 >>200
予想通りで乙w
予想通りで乙w
204デフォルトの名無しさん
2020/06/03(水) 16:25:39.34ID:TdRUmxlv >>201
結局、答えられないんですね。
結局、答えられないんですね。
205デフォルトの名無しさん
2020/06/03(水) 16:29:44.75ID:gQ0mUfsI そこで煽ってどうするw
206デフォルトの名無しさん
2020/06/03(水) 16:50:20.37ID:UHE1JPNz 質問しといて無礼な口の利き方をするやつにはお仕置きだ
一切何も教えない
一切何も教えない
207デフォルトの名無しさん
2020/06/03(水) 16:50:59.31ID:UHE1JPNz208デフォルトの名無しさん
2020/06/03(水) 17:02:24.74ID:TdRUmxlv >>206
答えられないだけ。
答えられないだけ。
209デフォルトの名無しさん
2020/06/03(水) 17:03:53.52ID:DAHZjgl3 >>207
都合よくげんていつけたりなくしたりwwww
都合よくげんていつけたりなくしたりwwww
210デフォルトの名無しさん
2020/06/03(水) 17:04:33.42ID:DAHZjgl3211晒しage
2020/06/03(水) 17:11:10.63ID:UHE1JPNz 181 返信:デフォルトの名無しさん[sage] 投稿日:2020/06/03(水) 12:24:39.32 ID:DAHZjgl3 [1/9]
>>175
たまたまの結果を生活の知恵とかw
キーワードと通常言語が被らない日本語万歳だな
>>175
たまたまの結果を生活の知恵とかw
キーワードと通常言語が被らない日本語万歳だな
212sage
2020/06/03(水) 17:55:41.24ID:B/1kftuN getCFile()ってよくわからないので教えてください。
コードに次のような部分がありました。 getFile()では置き換えられない?
/// \brief Get C-file.
/// \return Extracted stdio's @c FILE structure.
std::FILE * getCFile();
file_.getCFile()
コードに次のような部分がありました。 getFile()では置き換えられない?
/// \brief Get C-file.
/// \return Extracted stdio's @c FILE structure.
std::FILE * getCFile();
file_.getCFile()
213デフォルトの名無しさん
2020/06/03(水) 18:46:53.95ID:TdRUmxlv >>193
推定だけど、
A<T, void>
の場合、2番目の仮引数がvoid型になっているので、そこには実引数を
指定しないということになっているらしい。
その結果、A<1> みたいに1つだけの引数でtemplateをinstance化できる
様になっている気がする。
まだ仕様書で確認したわけではない。
推定だけど、
A<T, void>
の場合、2番目の仮引数がvoid型になっているので、そこには実引数を
指定しないということになっているらしい。
その結果、A<1> みたいに1つだけの引数でtemplateをinstance化できる
様になっている気がする。
まだ仕様書で確認したわけではない。
214デフォルトの名無しさん
2020/06/03(水) 18:53:53.18ID:HVfXpWIv いや、省略した場合のデフォルトを指定しない限り、そんなことにはならない
template <typename T1,typename T2=void>
class A;
みたいにする
まあ、primaryの定義と同時にも書けるし、そっちが普通
template <typename T1,typename T2=void>
class A;
みたいにする
まあ、primaryの定義と同時にも書けるし、そっちが普通
216デフォルトの名無しさん
2020/06/03(水) 19:07:42.01ID:TdRUmxlv [驚くべきパターンマッチング]
MS製のSTLのforward()のソースを呼んでいて驚いた。
forward()の引数のremove_reference_t<_Ty>&& _Argの部分は、とても複雑なパターンマッチングをしているらしい。
_Tyがまだ決まって無い段階で、remove_reference<_Ty> というテンプレートclass を展開してtype メンバを調べ、それと実引数から右辺値参照部分を除いた部分を一致させるような複雑な処理をした結果、_Ty を逆算して決定しているらしい。
template <class _Ty>
struct remove_reference { // YA, #1, primary class template。"
using type = _Ty; // const も保存されているハズ。
using _Const_thru_ref_type = const _Ty;
};
・・・ remove_reference<> に対する部分特殊化があるが、省略 ・・・
template <class _Ty>
using remove_reference_t = typename remove_reference<_Ty>::type;
template <class _Ty>
_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept { // forward an rvalue as an rvalue
static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
return static_cast<_Ty&&>(_Arg);
}
MS製のSTLのforward()のソースを呼んでいて驚いた。
forward()の引数のremove_reference_t<_Ty>&& _Argの部分は、とても複雑なパターンマッチングをしているらしい。
_Tyがまだ決まって無い段階で、remove_reference<_Ty> というテンプレートclass を展開してtype メンバを調べ、それと実引数から右辺値参照部分を除いた部分を一致させるような複雑な処理をした結果、_Ty を逆算して決定しているらしい。
template <class _Ty>
struct remove_reference { // YA, #1, primary class template。"
using type = _Ty; // const も保存されているハズ。
using _Const_thru_ref_type = const _Ty;
};
・・・ remove_reference<> に対する部分特殊化があるが、省略 ・・・
template <class _Ty>
using remove_reference_t = typename remove_reference<_Ty>::type;
template <class _Ty>
_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept { // forward an rvalue as an rvalue
static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
return static_cast<_Ty&&>(_Arg);
}
217デフォルトの名無しさん
2020/06/03(水) 19:08:51.14ID:TdRUmxlv >>215
仮に心の中にあってもあなたは全く言語化して無いないので駄目。
仮に心の中にあってもあなたは全く言語化して無いないので駄目。
218デフォルトの名無しさん
2020/06/03(水) 19:10:26.76ID:TdRUmxlv219デフォルトの名無しさん
2020/06/03(水) 19:14:50.42ID:TdRUmxlv >>218
そういえば仕様書に、templateをinstance化する際は、既に deducedされたパラメータは A<B>のBの中には書かないで良い例が書いてあった。
たとえば、
template <typename T1, typename T2>T1 f(T2 a);
のような場合、
f<T1>(100);
みたいにすれば、T2はint型だと分かるので、f<T1,int>(100)と書かなくて良いというもの。
それかな?
そういえば仕様書に、templateをinstance化する際は、既に deducedされたパラメータは A<B>のBの中には書かないで良い例が書いてあった。
たとえば、
template <typename T1, typename T2>T1 f(T2 a);
のような場合、
f<T1>(100);
みたいにすれば、T2はint型だと分かるので、f<T1,int>(100)と書かなくて良いというもの。
それかな?
220デフォルトの名無しさん
2020/06/03(水) 19:17:57.22ID:TdRUmxlv そうではなく、>>190 の場合は、primary template として、
template <typename T, typename = void>
struct has_typedef_foobar : std::false_type {};
と、第二パラメータにデフォルト引数が書いてあるからか。
template <typename T, typename = void>
struct has_typedef_foobar : std::false_type {};
と、第二パラメータにデフォルト引数が書いてあるからか。
221デフォルトの名無しさん
2020/06/03(水) 19:20:51.92ID:HVfXpWIv >>218
190ってまさにtypename=voidしている例じゃね
190ってまさにtypename=voidしている例じゃね
222デフォルトの名無しさん
2020/06/03(水) 19:27:23.10ID:TdRUmxlv223デフォルトの名無しさん
2020/06/03(水) 19:48:21.19ID:XMrfvYH7 TdRUmxlvは自分の日記帳に書いてくんないかな
224デフォルトの名無しさん
2020/06/03(水) 20:15:01.97ID:TdRUmxlv 失礼しました。
でも断っておくと、俺ははちみつに対してそんなに悪口は言ってない。
スレの流れで混乱していたようだが、言っていたのは別人だから悪しからず。
でも断っておくと、俺ははちみつに対してそんなに悪口は言ってない。
スレの流れで混乱していたようだが、言っていたのは別人だから悪しからず。
225デフォルトの名無しさん
2020/06/03(水) 22:21:05.04ID:OT4MJN13 いちいちイラッとする書きっぷりはID:TdRUmxlvのコミュ力が絶望的に低くいだけなので許してあげてください
226デフォルトの名無しさん
2020/06/03(水) 23:25:41.73ID:SSmphgFp 憂さ晴らしに靖国に落書きしそう
227デフォルトの名無しさん
2020/06/04(木) 08:16:53.40ID:85VTz4/e とっくにNG
228デフォルトの名無しさん
2020/06/04(木) 13:15:35.94ID:pT22FhoL int& r_i=7; // compile error
int&& rr_i=7; // OK
2行目は、どういう仕組みになってるんでしょう?
7という値がメモリー上にはどこにも存在して無い場合もあるはずで、
その場合でも右辺値参照を持てるものなのでしょうか?
たとえばコンパイラの中に7という値は持っていても、アセンブラレベルでは、
どのsectionの中にも7というデータが入れられて無い場合もあると思うのです。
それだと7の入っている場所のアドレスは存在しえません。
例え「"右辺値"参照」であってもはアドレスが必要のはずですが。
int&& rr_i=7; // OK
2行目は、どういう仕組みになってるんでしょう?
7という値がメモリー上にはどこにも存在して無い場合もあるはずで、
その場合でも右辺値参照を持てるものなのでしょうか?
たとえばコンパイラの中に7という値は持っていても、アセンブラレベルでは、
どのsectionの中にも7というデータが入れられて無い場合もあると思うのです。
それだと7の入っている場所のアドレスは存在しえません。
例え「"右辺値"参照」であってもはアドレスが必要のはずですが。
229デフォルトの名無しさん
2020/06/04(木) 13:17:22.86ID:+U2drwkO 構ってはいけない
230デフォルトの名無しさん
2020/06/04(木) 14:43:12.11ID:2rF1/e7a >>228
言語規格的にはrr_iという名前を通じて7という値が取れれば何でもいい
コンパイラが具体的にどうするかはコンパイラの勝手
アドレスがどこかで必要なら一時オブジェクトを作るようにするし必要なければ作らなくてもいい
言語規格的にはrr_iという名前を通じて7という値が取れれば何でもいい
コンパイラが具体的にどうするかはコンパイラの勝手
アドレスがどこかで必要なら一時オブジェクトを作るようにするし必要なければ作らなくてもいい
231デフォルトの名無しさん
2020/06/04(木) 18:50:33.11ID:pT22FhoL232デフォルトの名無しさん
2020/06/07(日) 01:50:09.38ID:P1Z5Y5je233デフォルトの名無しさん
2020/06/07(日) 01:57:43.49ID:loMZGJMS &&嫌いだわ
234デフォルトの名無しさん
2020/06/07(日) 03:20:06.67ID:NFGxwtnl 右辺値参照自身は左辺値定期
235はちみつ餃子 ◆8X2XSCHEME
2020/06/07(日) 09:08:16.75ID:fhJ4vSsJ だから std::forward が要るんだよ。
236デフォルトの名無しさん
2020/06/07(日) 11:40:26.26ID:uPPavgXr 昔のソースコードからの派生で開発する際、リソースの開放だけをデストラクタで行うように変えたいと考えています
RAIIだけを行う標準的な実装って何かあったりしますか?
あるいは、自分で調べた限りでは例えば、
HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
unique_ptr<void, decltype(&CloseHandle)> dummy(hFile, CloseHandle);
// 以降dummyは使わずに生のhFileに対して操作
のようにunique_ptrを使えばできそうに見えますが、C++11以降の作法として正しいでしょうか?
RAIIだけを行う標準的な実装って何かあったりしますか?
あるいは、自分で調べた限りでは例えば、
HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
unique_ptr<void, decltype(&CloseHandle)> dummy(hFile, CloseHandle);
// 以降dummyは使わずに生のhFileに対して操作
のようにunique_ptrを使えばできそうに見えますが、C++11以降の作法として正しいでしょうか?
237デフォルトの名無しさん
2020/06/07(日) 13:44:00.54ID:ocvuft6U 作法とか正しいとかより自分で考えた方がいいと思うけど
その場合あえて言えば、hFile渡すとこは
直接CreateFileの戻り値使って(hFileを宣言しない)、dummyの持つハンドル経由で使った方が
一貫性が取れていいかも
理想を言えば全部ラップした方がいいんだろうけど
その場合あえて言えば、hFile渡すとこは
直接CreateFileの戻り値使って(hFileを宣言しない)、dummyの持つハンドル経由で使った方が
一貫性が取れていいかも
理想を言えば全部ラップした方がいいんだろうけど
238デフォルトの名無しさん
2020/06/07(日) 13:55:18.98ID:HzkE9Nko239デフォルトの名無しさん
2020/06/07(日) 14:54:05.65ID:HzkE9Nko >>238
RAIIというのは物凄く簡単に実装できて、細かいことを抜きにすれば以下の様にすれば完成する :
class CMyX {
protected:
HANDLE m_hFile;
public:
CMyX(HANDLE hFile) {m_hFile=hFile;}
~CMyX() {CloseHandle(m_hFile);}
}
HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
CMyX myx(hFile); // これが初期化。後は勝手に hFileが解放される。
RAIIというのは物凄く簡単に実装できて、細かいことを抜きにすれば以下の様にすれば完成する :
class CMyX {
protected:
HANDLE m_hFile;
public:
CMyX(HANDLE hFile) {m_hFile=hFile;}
~CMyX() {CloseHandle(m_hFile);}
}
HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
CMyX myx(hFile); // これが初期化。後は勝手に hFileが解放される。
240デフォルトの名無しさん
2020/06/07(日) 15:37:10.54ID:NFGxwtnl ポインタ以外のリソースでRAIIやらせるためのstd::unique_resourceが提案されてるけど難航してる
リソースの種類や使い方でそれぞれ事情が違うから無理矢理一般化しても上手く行かないらしい
リソースの種類や使い方でそれぞれ事情が違うから無理矢理一般化しても上手く行かないらしい
241デフォルトの名無しさん
2020/06/07(日) 15:48:34.18ID:HzkE9Nko >>239
補足すると、このコードだとCreateFile()した後、返されたハンドル値を No CheckでCMyXのコンストラクタに渡しているが、本当はその前にINVALID_HANDLE_VALUEかどうかをチェックしておく必要がある。
補足すると、このコードだとCreateFile()した後、返されたハンドル値を No CheckでCMyXのコンストラクタに渡しているが、本当はその前にINVALID_HANDLE_VALUEかどうかをチェックしておく必要がある。
242デフォルトの名無しさん
2020/06/07(日) 21:39:58.03ID:P1Z5Y5je243デフォルトの名無しさん
2020/06/07(日) 21:49:43.50ID:NFGxwtnl それがエラーじゃなかったら右辺値参照は何のためにあるんだよ
244デフォルトの名無しさん
2020/06/07(日) 21:56:24.65ID:P1Z5Y5je245デフォルトの名無しさん
2020/06/07(日) 22:22:50.71ID:uPPavgXr246デフォルトの名無しさん
2020/06/07(日) 23:16:58.32ID:+YSUT0gy More Effective C++ の、
項目9 : リソースリークを防ぐためにデストラクタを使う
項目11 : デストラクタから発生した例外を抑える
デストラクタ中で、例外がキャッチされない場合、
terminate を呼ばれて、受け身も取れず、強制終了させられる
項目9 : リソースリークを防ぐためにデストラクタを使う
項目11 : デストラクタから発生した例外を抑える
デストラクタ中で、例外がキャッチされない場合、
terminate を呼ばれて、受け身も取れず、強制終了させられる
247デフォルトの名無しさん
2020/06/08(月) 11:21:10.82ID:KlUsfYw8 >>245
CreateFile以外にも似たようなのが沢山あって、それを楽にRAIIにしたいって話?
ならすでにunique_resourceはあるらしいけど(experimentalだかどこかに
あるいはそれに近い実装も公開されてるので落としてくればいいかと
逆にCreateFileだけなら素直に自分でクラス書いた方が後々楽になると思う
CreateFile以外にも似たようなのが沢山あって、それを楽にRAIIにしたいって話?
ならすでにunique_resourceはあるらしいけど(experimentalだかどこかに
あるいはそれに近い実装も公開されてるので落としてくればいいかと
逆にCreateFileだけなら素直に自分でクラス書いた方が後々楽になると思う
248はちみつ餃子 ◆8X2XSCHEME
2020/06/08(月) 12:33:58.17ID:KAmnJXdU リソースの解放以外は生のハンドルが使いたいという前提だと、
「unique_resource で包まれたオブジェクトからハンドル使うたびに (get で) 取り出す」という操作が必要になる。
たぶん >>236 の書きようだとそういうことはしたくないんだろうし、
包む前のハンドル (が入った変数) をそのまま使うとなると折角の所有権管理が台無しだ。
unique_resource はリソースの所有権管理の仕組みであって、
デストラクタでリソース解放もするのは所有権管理に付随するものに過ぎない。
どちらかというと scope_exit の方がやりたいことに近そうな気がする。
けど、いずれにしても中途半端なんだよな。
現時点でリソースの解放 (CloseHandle) がちゃんとできているなら
それを unique_resource (なり scope_exit なり) に置き換える意味はあまりないんじゃなかろうか。
「CloseHandle の書き漏らし」ってのと「scope_exit の書き忘れ」
ってのは同程度に有り得ることで、そんなに良くならないと思うよ。
型としての HANDLE の実態は void* なので、
HANDLE を HANDLE として扱おうとする限り C++ の型システムの恩恵はあまり受けられない。
古いコードをなるべくいじらずに使いたいという理由はとてもよくわかるのだけれど、
半端な書き換えをするくらいなら抽象レイヤをきちんと構築した方が結局は楽だと思う。
「unique_resource で包まれたオブジェクトからハンドル使うたびに (get で) 取り出す」という操作が必要になる。
たぶん >>236 の書きようだとそういうことはしたくないんだろうし、
包む前のハンドル (が入った変数) をそのまま使うとなると折角の所有権管理が台無しだ。
unique_resource はリソースの所有権管理の仕組みであって、
デストラクタでリソース解放もするのは所有権管理に付随するものに過ぎない。
どちらかというと scope_exit の方がやりたいことに近そうな気がする。
けど、いずれにしても中途半端なんだよな。
現時点でリソースの解放 (CloseHandle) がちゃんとできているなら
それを unique_resource (なり scope_exit なり) に置き換える意味はあまりないんじゃなかろうか。
「CloseHandle の書き漏らし」ってのと「scope_exit の書き忘れ」
ってのは同程度に有り得ることで、そんなに良くならないと思うよ。
型としての HANDLE の実態は void* なので、
HANDLE を HANDLE として扱おうとする限り C++ の型システムの恩恵はあまり受けられない。
古いコードをなるべくいじらずに使いたいという理由はとてもよくわかるのだけれど、
半端な書き換えをするくらいなら抽象レイヤをきちんと構築した方が結局は楽だと思う。
249デフォルトの名無しさん
2020/06/08(月) 15:51:51.35ID:blut5LG8 void * と型として区別出来ない?
型はともかくそもそも HANDLE は値の範囲が決まってたか
型はともかくそもそも HANDLE は値の範囲が決まってたか
250はちみつ餃子 ◆8X2XSCHEME
2020/06/08(月) 16:16:36.67ID:KAmnJXdU かなり前から DECLARE_HANDLE マクロで HANDLE は固有の型として定義してた。
そこは私の認識間違いだ。 すまぬ。
>>249
void* という型として認識出来たところで何が出来るものでもないよねという意図だった。
そこは私の認識間違いだ。 すまぬ。
>>249
void* という型として認識出来たところで何が出来るものでもないよねという意図だった。
251デフォルトの名無しさん
2020/06/08(月) 23:54:23.01ID:3GgB/ZcK252デフォルトの名無しさん
2020/06/08(月) 23:56:48.34ID:3GgB/ZcK というわけでget()メソッドが無いのも大概だが
それより悪いのはCloseHandle()が失敗したときのことを何も考えていないことだ
ファイルのClose失敗はエラーハンドリング省略で済まされる問題ではない
デストラクタでCloseHandle()を一概に否定するものではないが、
デストラクタから例外を飛ばすわけにもいかないので、エラーの通知先オブジェクトへのポインタをCMyXは持つ必要がある
それより悪いのはCloseHandle()が失敗したときのことを何も考えていないことだ
ファイルのClose失敗はエラーハンドリング省略で済まされる問題ではない
デストラクタでCloseHandle()を一概に否定するものではないが、
デストラクタから例外を飛ばすわけにもいかないので、エラーの通知先オブジェクトへのポインタをCMyXは持つ必要がある
253デフォルトの名無しさん
2020/06/09(火) 00:00:40.22ID:Ah9aU5+0 いきってツッコむほどのことかそれ
254デフォルトの名無しさん
2020/06/09(火) 03:22:41.56ID:SETbyCsO >>252
File Handle のような OS Object については、RAIIで処理するのは実は難しいんだよ。
だから、WindowのDestroyWindow()もデストラクタで処理する前に明示的に
CWnd::DestoryWindow()を自分で呼び出すほうが良かったりするんだから。
デストラクタだけを頼りにすると、main()やWinMain()関数の後の
クリーンアップ処理の中で CloseHandle()が呼び出されたりすることになるが、
それは結構微妙な話になる。
なぜかといえば、まず、OS自体がそもそも、プロセスが終了する時には
勝手にすべてのハンドルを閉じてくれる。ならば、CloseHandle()なんて明示的に
書く必要が無い、というそもそも論が出てくる。
それプラス、あなたが言ったように、CloseHandle()で失敗した場合にどうなるか
という話もあることはある。
そもそも、個人的には、ファイルを開いたら、なるべく速く Closeする方が良いと思っている
ので、RAIIでファイルハンドルを処理するのは余りぴんと来ない。
File Handle のような OS Object については、RAIIで処理するのは実は難しいんだよ。
だから、WindowのDestroyWindow()もデストラクタで処理する前に明示的に
CWnd::DestoryWindow()を自分で呼び出すほうが良かったりするんだから。
デストラクタだけを頼りにすると、main()やWinMain()関数の後の
クリーンアップ処理の中で CloseHandle()が呼び出されたりすることになるが、
それは結構微妙な話になる。
なぜかといえば、まず、OS自体がそもそも、プロセスが終了する時には
勝手にすべてのハンドルを閉じてくれる。ならば、CloseHandle()なんて明示的に
書く必要が無い、というそもそも論が出てくる。
それプラス、あなたが言ったように、CloseHandle()で失敗した場合にどうなるか
という話もあることはある。
そもそも、個人的には、ファイルを開いたら、なるべく速く Closeする方が良いと思っている
ので、RAIIでファイルハンドルを処理するのは余りぴんと来ない。
255デフォルトの名無しさん
2020/06/09(火) 06:33:30.92ID:iLzxHGzP アプリ全体の終了が前提になっているおかしな主張だな
256デフォルトの名無しさん
2020/06/09(火) 06:54:05.72ID:unijwXHc CloseHandleやfileのcloseで失敗する様な状況って、普通のアプリじゃ実質対処不能な致命的な状態だろ
素直に落ちるなりおかしな挙動になるなりすればいいのよ
素直に落ちるなりおかしな挙動になるなりすればいいのよ
257デフォルトの名無しさん
2020/06/09(火) 07:55:59.54ID:n28tZ6EV OSやハードが正常稼働時ならそこら辺の例外発生はないからね。
リソース解放忘れてデスクリプタやらのリソース使い果たしたり、ファイルの占有したままで他のアプリに迷惑かけたりするのを防止するのにRAII使うのは有用
リソース解放忘れてデスクリプタやらのリソース使い果たしたり、ファイルの占有したままで他のアプリに迷惑かけたりするのを防止するのにRAII使うのは有用
258デフォルトの名無しさん
2020/06/09(火) 08:00:35.85ID:JJE9ezaH HANDLEってOS側からはそれが有効か無効か判断できるから、無効なハンドルを
間違って使ったりCloseHandleしてしまってもエラーを返すだけで致命的な状態には
なりにくい
間違って使ったりCloseHandleしてしまってもエラーを返すだけで致命的な状態には
なりにくい
259865
2020/06/09(火) 09:27:54.99ID:cTF8gHLn 前提にしているのがどんなOSであろうと
C++的には環境依存な話だね
C++的には環境依存な話だね
260デフォルトの名無しさん
2020/06/09(火) 15:37:05.70ID:FUnSNOef 要素はintと任意オブジェ
int値を渡すと
論理和がゼロ以外の要素を
返すコンテナってないですか?
int値を渡すと
論理和がゼロ以外の要素を
返すコンテナってないですか?
261デフォルトの名無しさん
2020/06/09(火) 16:12:25.38ID:SETbyCsO >>256
もし、CTRL+Sを処理するイベントハンドラの中で、単純に CloseHandle()を自分で呼び出して
失敗した場合であれば、保存に失敗した事をAfxMessageBox()で知らせた後、なんとか今までの
メモリ中のデータだけは壊さずに処理できればベスト。
しかし、他の何らかの例外が発生した時に、RAIIによって自動的に呼び出されたデストラクタの中で
CloseHandle()に失敗した場合には、対処が難しそう。
テストも難しいし、余りそういう状況は起きないので優先順位は低いが。
もし、CTRL+Sを処理するイベントハンドラの中で、単純に CloseHandle()を自分で呼び出して
失敗した場合であれば、保存に失敗した事をAfxMessageBox()で知らせた後、なんとか今までの
メモリ中のデータだけは壊さずに処理できればベスト。
しかし、他の何らかの例外が発生した時に、RAIIによって自動的に呼び出されたデストラクタの中で
CloseHandle()に失敗した場合には、対処が難しそう。
テストも難しいし、余りそういう状況は起きないので優先順位は低いが。
262デフォルトの名無しさん
2020/06/09(火) 17:15:04.89ID:nNNGB7r+ >>260
std::pair<int, SomeObj> を格納するコンテナと
「int部分とある値とのビットORを結果とする述語」を
std::copy_if() に渡すような話かな。
「任意オブジェ」部分が要素ごとに異なる、だと難問な気がするけど。
std::pair<int, SomeObj> を格納するコンテナと
「int部分とある値とのビットORを結果とする述語」を
std::copy_if() に渡すような話かな。
「任意オブジェ」部分が要素ごとに異なる、だと難問な気がするけど。
263デフォルトの名無しさん
2020/06/09(火) 17:30:16.71ID:n28tZ6EV 論理積ではなく?
264デフォルトの名無しさん
2020/06/09(火) 17:42:20.88ID:nNNGB7r+ 確かに論理和だと「つまらない」結果になりそうね。
普通の使い方なら論理積で抽出か。
排他的論理和は「もっと面白い」かも知れんけど。
普通の使い方なら論理積で抽出か。
排他的論理和は「もっと面白い」かも知れんけど。
265デフォルトの名無しさん
2020/06/09(火) 22:35:23.41ID:FUnSNOef266デフォルトの名無しさん
2020/06/10(水) 05:39:12.94ID:67cF/bBY >>256
「ログファイルなので書込みに失敗しても大勢に影響が無い」とか
「作業用ファイルfは書いた後必ず誰かがリードオープンするから書込みに失敗していたらそこでワカルから書込みのエラーチェックを省略する」
みたいな判断はアプリの設計としてはアリかもしれないが、CMyHandleみたいな汎用部品的に使われ得る低水準クラスではナシ
これをアリだと思う香具師はお気楽すぐる、
「ログファイルなので書込みに失敗しても大勢に影響が無い」とか
「作業用ファイルfは書いた後必ず誰かがリードオープンするから書込みに失敗していたらそこでワカルから書込みのエラーチェックを省略する」
みたいな判断はアプリの設計としてはアリかもしれないが、CMyHandleみたいな汎用部品的に使われ得る低水準クラスではナシ
これをアリだと思う香具師はお気楽すぐる、
268デフォルトの名無しさん
2020/06/10(水) 07:23:10.62ID:itI4VuCe てか、自動解放するクラス作っても手動解放する手段残しておけば、使う側で特別な処理は出来るんだよね
269デフォルトの名無しさん
2020/06/10(水) 08:13:57.83ID:V+CQutVh C++ではexitをD組にして欲しい
270デフォルトの名無しさん
2020/06/10(水) 12:31:11.80ID:BPKUZfdj >>267 通知は欲しいかな。
黙って動作が続くくよりは terminate() のほうがマシだとも思うし。汎用部品ならなおさら。
破棄失敗する可能性のあるリソースの RAII wrapper にはエラー通知できる
close() なりの破棄操作を別に用意しておけという話で済むと思う。
黙って動作が続くくよりは terminate() のほうがマシだとも思うし。汎用部品ならなおさら。
破棄失敗する可能性のあるリソースの RAII wrapper にはエラー通知できる
close() なりの破棄操作を別に用意しておけという話で済むと思う。
>>270
通知って簡単にいいますけれども、その例えば fclose() 失敗の通知をどこに送り、そして送った先では何をするのですか?
通知をもらって何か手を打てるのですか?
汎用部品/ライブラリの作法ですか
理解はできますが、しかし、何もできないのなら、あるいは何もできないことがわかっているのなら、特段の失着にはみえませんね…
通知って簡単にいいますけれども、その例えば fclose() 失敗の通知をどこに送り、そして送った先では何をするのですか?
通知をもらって何か手を打てるのですか?
汎用部品/ライブラリの作法ですか
理解はできますが、しかし、何もできないのなら、あるいは何もできないことがわかっているのなら、特段の失着にはみえませんね…
272デフォルトの名無しさん
2020/06/10(水) 21:56:31.91ID:yfneRFZn 大事なデータを保存したファイルのfclose()が失敗したらどうするかって?
場所変えて保存を試みるに決まってるだろ
それくらいしないプログラムは売り物にならないぞ
場所変えて保存を試みるに決まってるだろ
それくらいしないプログラムは売り物にならないぞ
273デフォルトの名無しさん
2020/06/10(水) 22:20:00.38ID:yQDU6thd そもそも仕様で指定があるならそのように書くだけなんじゃ
274デフォルトの名無しさん
2020/06/11(木) 00:27:51.81ID:flOLYJrB >>271
たとえばコンソールアプリなら標準エラーに情報を出したうえで終了コードに反映して、
コマンドが失敗したのを見たユーザーが何をするか考えるっていうのはごく当たり前のことでしょ。
たとえばストレージ容量が足りないとして失敗したなら容量を確保して再実行すればいい。
fclose() の戻り値を捨ててるプログラムは現実としてたぶん多いんだけど、
そんなソフトがたとえばサーバー内でストレージ容量不足を数か月にわたって闇に葬り続け、
何かおかしいと気付いたサーバー管理者が自動スクリプトを緻密にトレースした結果、
保存されているはずの情報がもはやどこにも存在しないと気付いた時の怒り憎しみ悲しみを想像されたい。
少なくとも成功したと誤解しないのが重要。
たとえばコンソールアプリなら標準エラーに情報を出したうえで終了コードに反映して、
コマンドが失敗したのを見たユーザーが何をするか考えるっていうのはごく当たり前のことでしょ。
たとえばストレージ容量が足りないとして失敗したなら容量を確保して再実行すればいい。
fclose() の戻り値を捨ててるプログラムは現実としてたぶん多いんだけど、
そんなソフトがたとえばサーバー内でストレージ容量不足を数か月にわたって闇に葬り続け、
何かおかしいと気付いたサーバー管理者が自動スクリプトを緻密にトレースした結果、
保存されているはずの情報がもはやどこにも存在しないと気付いた時の怒り憎しみ悲しみを想像されたい。
少なくとも成功したと誤解しないのが重要。
275デフォルトの名無しさん
2020/06/11(木) 06:18:34.85ID:m7gaY4Qp そんな状況じゃopenも失敗してるだろうな
276デフォルトの名無しさん
2020/06/11(木) 09:58:48.19ID:Th6rh/3U >>274
実はそれがRAIIの限界なんだよ。
ちゃんと明示的に fclose() してその戻り値をチェックするのが一番安全。
例外安全性のためにRAIIを使うべきという人が居るけど、それで勝手に
デストラクタ内でfclose()して容量不足やディスクエラーで書き込み失敗した時には、
多くの場合、対処に困る。
でも、例外安全のためにはそうせざるを得ないかも知れない。
ということは、そもそも論になり、例外の throw、catch機構自体が安全に扱うのが
難しいという結論に至り、議論百出する。
実はそれがRAIIの限界なんだよ。
ちゃんと明示的に fclose() してその戻り値をチェックするのが一番安全。
例外安全性のためにRAIIを使うべきという人が居るけど、それで勝手に
デストラクタ内でfclose()して容量不足やディスクエラーで書き込み失敗した時には、
多くの場合、対処に困る。
でも、例外安全のためにはそうせざるを得ないかも知れない。
ということは、そもそも論になり、例外の throw、catch機構自体が安全に扱うのが
難しいという結論に至り、議論百出する。
277デフォルトの名無しさん
2020/06/11(木) 10:29:20.16ID:flOLYJrB278デフォルトの名無しさん
2020/06/11(木) 10:38:30.62ID:3eiGl155 上から目線なくせに脇が甘いな
279はちみつ餃子 ◆8X2XSCHEME
2020/06/11(木) 11:08:58.38ID:7wv0rqaB デストラクタ内でエラーが発生する可能性があってそれに対処が必要なら
例外の送出とか言ってないでデストラクタ内で対処してしまえよ。
汎用的な部品にし難いのはしゃーないやろ。
実際に汎用的ではないんだから。
例外の送出とか言ってないでデストラクタ内で対処してしまえよ。
汎用的な部品にし難いのはしゃーないやろ。
実際に汎用的ではないんだから。
280デフォルトの名無しさん
2020/06/11(木) 11:47:39.02ID:DcPEy/qZ おまいら (f)printf() の戻り値もちゃんと毎回観てるか?
281デフォルトの名無しさん
2020/06/11(木) 11:54:46.87ID:Th6rh/3U282デフォルトの名無しさん
2020/06/11(木) 11:56:16.72ID:Th6rh/3U283デフォルトの名無しさん
2020/06/11(木) 12:17:49.27ID:3eiGl155 そんなに難しいか?
深刻な事態が疑われるならシステムモーダルダイアログなり何なりすることあるだろ
あくまでOSではなくアプリとして事後条件が保証できない場合はterminateを呼び出して
OSに事故としての扱いをさせるのが「難しい」のは思いつかないだけじゃねえだろな
プログラミング以外の仕事でも事故はまず報連相
1人で握りつぶそうとするのは学生気分が抜けてないやつのすることだ
深刻な事態が疑われるならシステムモーダルダイアログなり何なりすることあるだろ
あくまでOSではなくアプリとして事後条件が保証できない場合はterminateを呼び出して
OSに事故としての扱いをさせるのが「難しい」のは思いつかないだけじゃねえだろな
プログラミング以外の仕事でも事故はまず報連相
1人で握りつぶそうとするのは学生気分が抜けてないやつのすることだ
284デフォルトの名無しさん
2020/06/11(木) 12:19:04.03ID:flOLYJrB285デフォルトの名無しさん
2020/06/11(木) 12:21:07.06ID:flOLYJrB >>283 そっか GUI ならダイアログ使えるから、通知するだけなら簡単だね。
286デフォルトの名無しさん
2020/06/11(木) 12:22:43.78ID:Th6rh/3U287デフォルトの名無しさん
2020/06/11(木) 12:29:07.29ID:Th6rh/3U >>283
Exceptionをthrowした時の自動フォローアップとしてRAIIのデストラクタが呼び出される。
それが呼び出されるのは原則的にどこかでかは余り仮定できない。
ということは、非常に変なタイミングで fclose()に失敗することがある。
メッセージボックスを出すと、そこでイベントに対するメッセージループが形成されるので、
タイマーイベントのハンドラのOnTimer()などが起動してしまうこともある。
OnTimer()を、Exceptionがthrowされた状態で実行してよいかどうかは注意を要する事だ。
また、アプリの初期化処理の InitInstance()や終了処理のExitInstance()の中で、RAIIの
デストラクタが呼び出されてしまう場合もあるかも知れず、その中でメッセージボックスを
出すと思わぬ問題が生じるかもしれない。
生じないかも知れないが。
ただ、Exceptionがthrowされたということは何か異常が生じているということで、
それがたまたまファイルに関するものであったとしたら、二重三重に、ファイル関連で
エラーが生じてしまい、何か危険な状態に陥ってしまう可能性も有るかも知れない。
そういう微妙な配慮が必要となる。
Exceptionをthrowした時の自動フォローアップとしてRAIIのデストラクタが呼び出される。
それが呼び出されるのは原則的にどこかでかは余り仮定できない。
ということは、非常に変なタイミングで fclose()に失敗することがある。
メッセージボックスを出すと、そこでイベントに対するメッセージループが形成されるので、
タイマーイベントのハンドラのOnTimer()などが起動してしまうこともある。
OnTimer()を、Exceptionがthrowされた状態で実行してよいかどうかは注意を要する事だ。
また、アプリの初期化処理の InitInstance()や終了処理のExitInstance()の中で、RAIIの
デストラクタが呼び出されてしまう場合もあるかも知れず、その中でメッセージボックスを
出すと思わぬ問題が生じるかもしれない。
生じないかも知れないが。
ただ、Exceptionがthrowされたということは何か異常が生じているということで、
それがたまたまファイルに関するものであったとしたら、二重三重に、ファイル関連で
エラーが生じてしまい、何か危険な状態に陥ってしまう可能性も有るかも知れない。
そういう微妙な配慮が必要となる。
288デフォルトの名無しさん
2020/06/11(木) 12:33:42.17ID:Th6rh/3U >>287
もっといえば、Exceptionのthrowはどこで起きるかは仮定しにくいものなので、
何らかのダイアログを出すための初期化処理の中で生じることも有るかも知れない。
そういう場合にたまたま、関数の呼びだし元へ どんどん Exception の Unwinding
が生じて、RAIIのデストラクタで fclose()が呼び出される可能性も有るかも知れない。
そうなって、さらに、その fclose()がエラー終了する場合がある。
ダイアログの生成に失敗したタイミングで、エラーメッセージの表示のために、
メッセージボックスのダイアログを出すことになれば、もしかしたらかなり危険な
バグを含むことになってしまうかも知れない。
もっといえば、Exceptionのthrowはどこで起きるかは仮定しにくいものなので、
何らかのダイアログを出すための初期化処理の中で生じることも有るかも知れない。
そういう場合にたまたま、関数の呼びだし元へ どんどん Exception の Unwinding
が生じて、RAIIのデストラクタで fclose()が呼び出される可能性も有るかも知れない。
そうなって、さらに、その fclose()がエラー終了する場合がある。
ダイアログの生成に失敗したタイミングで、エラーメッセージの表示のために、
メッセージボックスのダイアログを出すことになれば、もしかしたらかなり危険な
バグを含むことになってしまうかも知れない。
289デフォルトの名無しさん
2020/06/11(木) 12:49:26.16ID:flOLYJrB >>286-288
ごめん、別の例外でスタック巻き戻し中の fclose() 失敗は無視でもいい想定だった。
元の例外が通知されればそれでいいだろうと。
破棄操作を提供すれば済むっていうのは、たとえば fstream について
正常フローから close() 呼び出せば fclose() の失敗は普通に処理できるっていう意味。
エラー発生後の後処理でのエラーについてはもはや例外処理機構とか RAII とか関係なく
エラー処理一般で難しさは変わらないのでは?
ごめん、別の例外でスタック巻き戻し中の fclose() 失敗は無視でもいい想定だった。
元の例外が通知されればそれでいいだろうと。
破棄操作を提供すれば済むっていうのは、たとえば fstream について
正常フローから close() 呼び出せば fclose() の失敗は普通に処理できるっていう意味。
エラー発生後の後処理でのエラーについてはもはや例外処理機構とか RAII とか関係なく
エラー処理一般で難しさは変わらないのでは?
290デフォルトの名無しさん
2020/06/11(木) 13:14:41.21ID:4Jo+eUkD291デフォルトの名無しさん
2020/06/11(木) 17:56:16.10ID:+WuQ8P1K そんなに大事なデータならverifyするだろ
292デフォルトの名無しさん
2020/06/13(土) 16:05:30.52ID:ifM7/RIh >>271
>知って簡単にいいますけれども、その例えば fclose() 失敗の通知をどこに送り、そして送った先では何をするのですか?
最終的にはユーザーに通知する
>通知をもらって何か手を打てるのですか?
ユーザーが通知に従い手を打てる
>>279
デストラクタ内での例外を送出したら即アプリが死ぬハズ
コアを吐いてくれたら通知にあたる情報が取り出せるかもしれないが美しくない
>>287
異常の内容をユーザーに通知することを目的とするなら
>エラーの通知先オブジェクトへのポインタをCMyXは持つ(>>252)
で事足りる
メッセージループは、通知先オブジェクトが1個だけもちさえすればユーザーへの通知の役目を果たせる
CMyXのようなケースは通知先オブジェクトを保持するオブジェクトからFactoryMethodパターンでインスタンス化
するのがいかにもOOP的で個人的には好み(CMyXのインスタンス化のときに通知先を確実に渡せる
>知って簡単にいいますけれども、その例えば fclose() 失敗の通知をどこに送り、そして送った先では何をするのですか?
最終的にはユーザーに通知する
>通知をもらって何か手を打てるのですか?
ユーザーが通知に従い手を打てる
>>279
デストラクタ内での例外を送出したら即アプリが死ぬハズ
コアを吐いてくれたら通知にあたる情報が取り出せるかもしれないが美しくない
>>287
異常の内容をユーザーに通知することを目的とするなら
>エラーの通知先オブジェクトへのポインタをCMyXは持つ(>>252)
で事足りる
メッセージループは、通知先オブジェクトが1個だけもちさえすればユーザーへの通知の役目を果たせる
CMyXのようなケースは通知先オブジェクトを保持するオブジェクトからFactoryMethodパターンでインスタンス化
するのがいかにもOOP的で個人的には好み(CMyXのインスタンス化のときに通知先を確実に渡せる
293はちみつ餃子 ◆8X2XSCHEME
2020/06/13(土) 16:59:34.64ID:1nypd8FJ >>292
私が書いた >>279 ではデストラクタ内で対処を完結させろ (例外を投げずに済ますために) と書いてあるつもりなんだが、お前にはそれが読み取れなかったか?
ちなみに、現在の C++ ではデストラクタ (と delete) はデフォルトで noexcept で修飾されているものと見なされる。
これは例外を外へ送出しないことを保障するんだが、内部で例外が発生しないとは保証されない。
もし発生した例外を内部でキャッチせずに外へ出ていこうとしたら std::terminate() が呼び出される。
(スタックの巻き戻しは起こらずに即死するかもしれない。)
陽に noexcept(false) を指定したらデストラクタから例外を送出することは可能。
ただし、スタックの巻き戻し中に起動される別のデストラクタから例外が送出されると死ぬ。
普通は色々なライブラリを組み合わせるから問題が出ないようにするには
一貫してデストラクタからは例外を投げないのが妥当な設計だと考えられているってだけ。
私が書いた >>279 ではデストラクタ内で対処を完結させろ (例外を投げずに済ますために) と書いてあるつもりなんだが、お前にはそれが読み取れなかったか?
ちなみに、現在の C++ ではデストラクタ (と delete) はデフォルトで noexcept で修飾されているものと見なされる。
これは例外を外へ送出しないことを保障するんだが、内部で例外が発生しないとは保証されない。
もし発生した例外を内部でキャッチせずに外へ出ていこうとしたら std::terminate() が呼び出される。
(スタックの巻き戻しは起こらずに即死するかもしれない。)
陽に noexcept(false) を指定したらデストラクタから例外を送出することは可能。
ただし、スタックの巻き戻し中に起動される別のデストラクタから例外が送出されると死ぬ。
普通は色々なライブラリを組み合わせるから問題が出ないようにするには
一貫してデストラクタからは例外を投げないのが妥当な設計だと考えられているってだけ。
294デフォルトの名無しさん
2020/06/13(土) 17:06:07.88ID:ifM7/RIh295デフォルトの名無しさん
2020/06/13(土) 20:11:16.15ID:K/U+GWpl 個人でc++使うことは少ないですか?
C#やelectronと比べて何倍手間がかかりますか?
2dのタイルマップエディタのようなものを作りたいのです、、、
https://www.mapeditor.org/
C#やelectronと比べて何倍手間がかかりますか?
2dのタイルマップエディタのようなものを作りたいのです、、、
https://www.mapeditor.org/
296デフォルトの名無しさん
2020/06/13(土) 20:19:12.06ID:lPN2rvMv 挫折するリスクも加味すると100倍くらいじゃないかな
297デフォルトの名無しさん
2020/06/13(土) 20:42:52.21ID:AVSH26bs >>295
個人の場合、実はC++は適している。
むしろ、大人数の場合、いろいろなレベルの人がいるので速度を落としてでも、
誰でも使えるような言語を使おうとする企業が多い。
ちゃんとしたものを作りたかったら、C++は最良の選択。
個人の場合、実はC++は適している。
むしろ、大人数の場合、いろいろなレベルの人がいるので速度を落としてでも、
誰でも使えるような言語を使おうとする企業が多い。
ちゃんとしたものを作りたかったら、C++は最良の選択。
298デフォルトの名無しさん
2020/06/13(土) 20:55:51.74ID:AVSH26bs ところで、全く関係ないけど、昔は、
標準変換(Standard Conversions)の1つに、
「Reference Conversions(参照変換)」
という項目があったのに、C++17では、Overload Resolution関連で
「Reference Binding(参照束縛)」
という項目だけになってしまった、という認識であってますかね?
もしかしたら古すぎて、もう分からないかな。
標準変換(Standard Conversions)の1つに、
「Reference Conversions(参照変換)」
という項目があったのに、C++17では、Overload Resolution関連で
「Reference Binding(参照束縛)」
という項目だけになってしまった、という認識であってますかね?
もしかしたら古すぎて、もう分からないかな。
299デフォルトの名無しさん
2020/06/13(土) 21:10:55.91ID:XHF92Eb6 c++がどうこういうこと自体無意味な気分。
OSとコンパイラのバージョン指定でもせん限り、特定の議論にもなりゃしない。
OSとコンパイラのバージョン指定でもせん限り、特定の議論にもなりゃしない。
300デフォルトの名無しさん
2020/06/13(土) 22:13:05.14ID:rMzKFBuy これから始めようと思うのですが
C++とC♯の大きな違いは何ですか
どっちから先の方が良いですか?
C++とC♯の大きな違いは何ですか
どっちから先の方が良いですか?
301デフォルトの名無しさん
2020/06/13(土) 23:19:47.34ID:B/JuT+NG 何作りたいかによるとしか言いようがない
302デフォルトの名無しさん
2020/06/13(土) 23:29:25.22ID:dAI/jSW6 あーじゃあ、C++には何が出来なかったせいで
後からC♯が作られたの?
後からC♯が作られたの?
303デフォルトの名無しさん
2020/06/14(日) 00:35:35.69ID:0sKu6MyV 違うよ
304デフォルトの名無しさん
2020/06/14(日) 00:45:05.04ID:lm4ZS132 んーでは、C++が劣っていてC♯が作られた理由は?
305デフォルトの名無しさん
2020/06/14(日) 00:55:29.50ID:7AEk3bXh インタープリ夛ー
306デフォルトの名無しさん
2020/06/14(日) 00:58:40.28ID:g+gmh/oa Javaの代わりが欲しかっただけであって優劣の問題はあまり関係がない
が結局Javaの領域には食い込めず、スクリプト言語の代わりになった
自由度を奪う代わりに楽に書けるみたいな
結局自由度が必要なのでC++から離れられないので余計書くのがつらい仕様になった
Win32APIのインクルードくらいSDKにまとめとけやPinヴォケって感じ
が結局Javaの領域には食い込めず、スクリプト言語の代わりになった
自由度を奪う代わりに楽に書けるみたいな
結局自由度が必要なのでC++から離れられないので余計書くのがつらい仕様になった
Win32APIのインクルードくらいSDKにまとめとけやPinヴォケって感じ
307デフォルトの名無しさん
2020/06/14(日) 01:08:08.89ID:7AEk3bXh インタープリティアひとつつくっておけば色々な環境に使い回せるし版権問題にうるさいJavaをぶっつぶすため
308デフォルトの名無しさん
2020/06/14(日) 01:08:40.52ID:lm4ZS132309デフォルトの名無しさん
2020/06/14(日) 01:17:15.70ID:7AEk3bXh 常識だろjk
310デフォルトの名無しさん
2020/06/14(日) 01:21:41.82ID:iYtMGgBJ C++はアルゴリズムの部品化が一般的になっているので、自由に組み合わせられるところが、良いと思います。
311はちみつ餃子 ◆8X2XSCHEME
2020/06/14(日) 01:33:23.99ID:MJZpLG29 >>308
やりたければメモリのどこにでもアクセスできるってのが特に重要な違いかな。
デタラメなアクセスをしても実行時エラーとして検出されるとは限らない。
プログラマがメカニズムを理解して正しくプログラムを書けるなら (監視して実行時エラーを検出するための) 保護機構は無駄で、
余計なものがある分だけ実行速度が落ちるから無い方がいい。
それが C++ の基本思想であるゼロオーバヘッドの原則。
でも現実はそうではない。 (プログラマは間違う。)
やりたければメモリのどこにでもアクセスできるってのが特に重要な違いかな。
デタラメなアクセスをしても実行時エラーとして検出されるとは限らない。
プログラマがメカニズムを理解して正しくプログラムを書けるなら (監視して実行時エラーを検出するための) 保護機構は無駄で、
余計なものがある分だけ実行速度が落ちるから無い方がいい。
それが C++ の基本思想であるゼロオーバヘッドの原則。
でも現実はそうではない。 (プログラマは間違う。)
312デフォルトの名無しさん
2020/06/14(日) 01:35:24.50ID:lm4ZS132 C++で出来るんならいったい、C++の何が悪くてC♯が産まれたのやら
さっぱりですね、
Wikipedia見にいったらc#はBoolean型とスイッチケースでストリング型が使えるそうなので
c#にしようと思います
お邪魔しましたわ、ありがとうございました。
さっぱりですね、
Wikipedia見にいったらc#はBoolean型とスイッチケースでストリング型が使えるそうなので
c#にしようと思います
お邪魔しましたわ、ありがとうございました。
313デフォルトの名無しさん
2020/06/14(日) 01:41:28.38ID:9pT3ELpf c#を選択するのは悪くないと思うが、そこじゃないだろ
314デフォルトの名無しさん
2020/06/14(日) 01:45:14.17ID:lm4ZS132 あーうーん、自然言語処理とかネットのデータベースで
文字列比較を多用しそうな予定は未定なので・・
文字列比較を多用しそうな予定は未定なので・・
315デフォルトの名無しさん
2020/06/14(日) 02:22:12.57ID:6myF93T5316デフォルトの名無しさん
2020/06/14(日) 03:45:35.31ID:PNQfdADa 文字列処理がメインで速度求めないならpythonとかの方がいいと思うぞ
317デフォルトの名無しさん
2020/06/14(日) 03:48:19.28ID:kJWeEmyo >>312
>C++で出来るんならいったい、C++の何が悪くてC♯が産まれたのやら
>さっぱりですね、
基本的に、Cの時代からポインタが理解できない人が多かった。
ポインタが理解できて無い人でも、コピペしたりすればC++も使えたかも知れないが、
ちゃんと理解できて無いので、理解できている人に比べてメモリーの解放を間違ってしまう頻度が高い。
そのため、ポインタが出てこないVBを使う人が多かった。
VBしか使えなかった人でもが使えるようにした上で、見かけ上の文法と言語の名称をC++に似せることによって
今までC++を使えずに肩身の狭い思いをしてきた人に希望の光を与えることに成功したのがC#。
>C++で出来るんならいったい、C++の何が悪くてC♯が産まれたのやら
>さっぱりですね、
基本的に、Cの時代からポインタが理解できない人が多かった。
ポインタが理解できて無い人でも、コピペしたりすればC++も使えたかも知れないが、
ちゃんと理解できて無いので、理解できている人に比べてメモリーの解放を間違ってしまう頻度が高い。
そのため、ポインタが出てこないVBを使う人が多かった。
VBしか使えなかった人でもが使えるようにした上で、見かけ上の文法と言語の名称をC++に似せることによって
今までC++を使えずに肩身の狭い思いをしてきた人に希望の光を与えることに成功したのがC#。
318デフォルトの名無しさん
2020/06/14(日) 03:50:45.95ID:kJWeEmyo VB、VBと馬鹿にされてきた恨みつらみの反動で、C++は古いということにして、
新しいC#に適用できない老人が使う言語、という印象操作をする運動が
繰り広げられている。
新しいC#に適用できない老人が使う言語、という印象操作をする運動が
繰り広げられている。
319デフォルトの名無しさん
2020/06/14(日) 04:05:18.35ID:kJWeEmyo 彼らの脳内では、なんとかしてC#の人気を出すことによって、
C++使いを減らしていけば、もう二度とVB、VBと馬鹿にされた暗黒時代に
戻ることがなくなると予定されている。
C++使いを減らしていけば、もう二度とVB、VBと馬鹿にされた暗黒時代に
戻ることがなくなると予定されている。
320デフォルトの名無しさん
2020/06/14(日) 04:15:32.10ID:Lj4n2emQ321デフォルトの名無しさん
2020/06/14(日) 04:43:58.99ID:kJWeEmyo C#はC++は、現実にかなり遅い。
それはそれぞれを使って作成されたアプリを比較してみれば分かる。
よく分かる例としてはVSだ。C++製のVSは高速だったが、C#製のVSは劇遅。
もう一つは、FrontPageとExpressionWeb 4。
開発に使われている言語以外はほぼ同じアプリだが、C++製の前者に比べて
C#製の後者は劇遅。
それはそれぞれを使って作成されたアプリを比較してみれば分かる。
よく分かる例としてはVSだ。C++製のVSは高速だったが、C#製のVSは劇遅。
もう一つは、FrontPageとExpressionWeb 4。
開発に使われている言語以外はほぼ同じアプリだが、C++製の前者に比べて
C#製の後者は劇遅。
322デフォルトの名無しさん
2020/06/14(日) 04:59:16.97ID:VVffaeyk >>297
手間がかかりすぎると聞きますがどうなのでしょうか
手間がかかりすぎると聞きますがどうなのでしょうか
323デフォルトの名無しさん
2020/06/14(日) 05:00:21.83ID:Lj4n2emQ それは.netフレームワークとかSilverlightの違いですか?WPF?でしたか?
Win XPとVistaの違いなようなDirectX使うか使わないかというかGUI処理ありきで画面とロジックを分けたゆえのXMLパーサーの重さなのか
グラボやドライバーがネックなような・・・
Win XPとVistaの違いなようなDirectX使うか使わないかというかGUI処理ありきで画面とロジックを分けたゆえのXMLパーサーの重さなのか
グラボやドライバーがネックなような・・・
324デフォルトの名無しさん
2020/06/14(日) 05:03:18.92ID:fGEYrFA/ 俺も297と同意見
325デフォルトの名無しさん
2020/06/14(日) 05:09:24.45ID:kJWeEmyo >>322
MFCがGUI関連が弱いという問題はあるが、C++自体は、手間はそんなにかからない。
そんなに難しいわけでもない。
ちゃんとC言語のポインタ周りを勉強して理解することが大切で、
それさえ分かってしまえば、C++はCよりも開発効率がかなり高いし、安全。
メモリの解放の純粋なC言語では手間がかかったが、C++だとデストラクタが
発明されたことにより楽になり、そんなに危険度は高くない。
MFCがGUI関連が弱いという問題はあるが、C++自体は、手間はそんなにかからない。
そんなに難しいわけでもない。
ちゃんとC言語のポインタ周りを勉強して理解することが大切で、
それさえ分かってしまえば、C++はCよりも開発効率がかなり高いし、安全。
メモリの解放の純粋なC言語では手間がかかったが、C++だとデストラクタが
発明されたことにより楽になり、そんなに危険度は高くない。
326デフォルトの名無しさん
2020/06/14(日) 05:18:18.18ID:fGEYrFA/ Cでexitを安易に使う癖がついているやつには陰険な罠がデストラクタにはあるわけだが
327デフォルトの名無しさん
2020/06/14(日) 05:29:57.20ID:qmm3PCBI328デフォルトの名無しさん
2020/06/14(日) 05:35:47.32ID:qmm3PCBI >>295
Electron も良いけど、Ruby on Rails も良い
ただし、Rails でも、GUI は、HTML, CSS/SASS, JavaScript, jQuery, Bootstrap。
または、React
Electron も良いけど、Ruby on Rails も良い
ただし、Rails でも、GUI は、HTML, CSS/SASS, JavaScript, jQuery, Bootstrap。
または、React
329デフォルトの名無しさん
2020/06/14(日) 05:38:37.79ID:VVffaeyk330デフォルトの名無しさん
2020/06/14(日) 06:18:58.47ID:kJWeEmyo >>329
まず、Electronは配布ファイルのサイズが数百MBあるので、それだけでも
プログラムの品質が下がる。
Rubyは、GUIに弱い。
C#は悪く無いとする人が多いが現実の本格的なアプリの例では遅いことが多い。
まず、Electronは配布ファイルのサイズが数百MBあるので、それだけでも
プログラムの品質が下がる。
Rubyは、GUIに弱い。
C#は悪く無いとする人が多いが現実の本格的なアプリの例では遅いことが多い。
331デフォルトの名無しさん
2020/06/14(日) 06:21:59.90ID:iYtMGgBJ C#、Electron、RubyはC++よりはるかに優れているので、そっち使ったほうが良いと思います。
それらは実行時最適化のおかげでC++の10倍速いという実験結果もあります。
それらは実行時最適化のおかげでC++の10倍速いという実験結果もあります。
332デフォルトの名無しさん
2020/06/14(日) 06:23:08.37ID:kJWeEmyo >>330
C#は、GUI部品はCで書かれているWin32を使っているので、簡単な
HelloWorld程度ではC++並の速度が出ているように見える。
ところが、使うメモリの量が上がってくると急激に遅くなる特徴がある。
メモリだけでなく、GUIパーツが多くなるだけでも遅いと聞いている。
凄腕プログラマの中には、実感としてC++の10倍遅い、という人がいる位。
現にVSやExpressionWeb 4の起動速度は以上に遅いし、起動後もとても遅い。
C#は、GUI部品はCで書かれているWin32を使っているので、簡単な
HelloWorld程度ではC++並の速度が出ているように見える。
ところが、使うメモリの量が上がってくると急激に遅くなる特徴がある。
メモリだけでなく、GUIパーツが多くなるだけでも遅いと聞いている。
凄腕プログラマの中には、実感としてC++の10倍遅い、という人がいる位。
現にVSやExpressionWeb 4の起動速度は以上に遅いし、起動後もとても遅い。
333デフォルトの名無しさん
2020/06/14(日) 06:23:55.47ID:kJWeEmyo334デフォルトの名無しさん
2020/06/14(日) 06:25:03.87ID:iYtMGgBJ >>333
対立求めてる人はとっとと追い出したほうが良い。
対立求めてる人はとっとと追い出したほうが良い。
335デフォルトの名無しさん
2020/06/14(日) 06:42:43.23ID:iYtMGgBJ336デフォルトの名無しさん
2020/06/14(日) 07:29:43.89ID:kJWeEmyo >>355
>何言ってんだふふんと、真のC++使いなら思えるはず。
いや、C++は沢山の問題点を持っていることは事実である。
しかし、効率面でC#は、C++には大差で負けることも、現実のアプリの例では
垣間見えることもまた事実。
>何言ってんだふふんと、真のC++使いなら思えるはず。
いや、C++は沢山の問題点を持っていることは事実である。
しかし、効率面でC#は、C++には大差で負けることも、現実のアプリの例では
垣間見えることもまた事実。
337デフォルトの名無しさん
2020/06/14(日) 07:32:52.41ID:iYtMGgBJ じゃあいちいち他言語を下げるのはおやめなさい。
王者には王者の気品が求められるのです。
王者には王者の気品が求められるのです。
339デフォルトの名無しさん
2020/06/14(日) 07:35:16.26ID:VVffaeyk c++使うといつまでも完成しないなんて話を聞いたもんですから
340デフォルトの名無しさん
2020/06/14(日) 08:29:10.72ID:7AEk3bXh いつまでも完成しないって
バカだからだろ
バカだからだろ
341デフォルトの名無しさん
2020/06/14(日) 08:36:28.26ID:qmm3PCBI 可読性・難易度・バグりにくさ
動的言語
Ruby : 1
JavaScript : 3
静的言語
C# : 5
ポインターのある言語
C : 15
C++ : 75
動的言語
Ruby : 1
JavaScript : 3
静的言語
C# : 5
ポインターのある言語
C : 15
C++ : 75
342デフォルトの名無しさん
2020/06/14(日) 08:39:06.10ID:g+gmh/oa わかりやすい例でいうと、Windows10がどんどん重くなっているが
それは今までC++で書かれてた部分をC#で書き換え続けられているからといっても過言ではない
それは今までC++で書かれてた部分をC#で書き換え続けられているからといっても過言ではない
343デフォルトの名無しさん
2020/06/14(日) 09:06:28.85ID:MuaS91+w >C++で書かれてた部分をC#で書き換え続けられている
それは別になっとらんぞ
Windowsチームって.NET嫌ってるし
それは別になっとらんぞ
Windowsチームって.NET嫌ってるし
344デフォルトの名無しさん
2020/06/14(日) 09:14:55.23ID:VVffaeyk >>340
手間がどのくらい違うのですか?
手間がどのくらい違うのですか?
345デフォルトの名無しさん
2020/06/14(日) 09:18:34.27ID:7AEk3bXh346デフォルトの名無しさん
2020/06/14(日) 09:20:16.16ID:g+gmh/oa >>343
例えばタスクマネージャーや電卓はUWPだと思うが、これって.NETの焼き直しか再利用だと思ってるけどどうなんだろう
例えばタスクマネージャーや電卓はUWPだと思うが、これって.NETの焼き直しか再利用だと思ってるけどどうなんだろう
347デフォルトの名無しさん
2020/06/14(日) 09:32:29.33ID:MuaS91+w >>346
シェルとかも含めたXAML UIの部分のこと言ってるんだろうけど
あれはC#からも呼び出せるだけのネイティブで実装されたAPI(WinRT)だよ
今の電卓なんかはまさしくわかりやすい例で、特例でコード公開されてて全部C++(/CX)だよ
新規に打ち出そうとしてるWinUIもC++(/WinRT)での実装
UWPアプリ単体で見ればC++だったりC#だったりまちまちだろうけど
今はXAML=WPF=C#のイメージは切り離した方が良い
シェルとかも含めたXAML UIの部分のこと言ってるんだろうけど
あれはC#からも呼び出せるだけのネイティブで実装されたAPI(WinRT)だよ
今の電卓なんかはまさしくわかりやすい例で、特例でコード公開されてて全部C++(/CX)だよ
新規に打ち出そうとしてるWinUIもC++(/WinRT)での実装
UWPアプリ単体で見ればC++だったりC#だったりまちまちだろうけど
今はXAML=WPF=C#のイメージは切り離した方が良い
348デフォルトの名無しさん
2020/06/14(日) 10:00:52.61ID:g+gmh/oa349デフォルトの名無しさん
2020/06/14(日) 10:31:38.76ID:v+4IVp6H >>335
王者の風格とか気品とか、真のC++使いだとか、そのキッズが喜びそうなワードばかり並べ立てて何がしたいの?
王者の風格とか気品とか、真のC++使いだとか、そのキッズが喜びそうなワードばかり並べ立てて何がしたいの?
350デフォルトの名無しさん
2020/06/14(日) 10:36:59.36ID:UiekgbQo (精神的)キッズが喜びたがってるのだろう
351デフォルトの名無しさん
2020/06/14(日) 10:59:07.21ID:fGEYrFA/ 確かに「王者の風格」がでてきたときは0.5秒くらい「えっ?」てなった
352デフォルトの名無しさん
2020/06/14(日) 10:59:49.90ID:v+4IVp6H >>338
プログラムの実装時の労力は言語だけでなく作る対象によっても変わるからケースバイケースだけど、言語の習得の労力で言えば、C++でまともな実用的なプログラムを作れるレベルに達するのは他の言語に比べて大変だよ。
もし今現在まったくプログラミングの経験がないなら、C++よりC#から始めた方がいい。
C#で速度がでないことを心配するなら、C#で作ってどう改善しても速度が足りないとなってからC++を学習してC++に移植する方がトータルでは早くできそう。
そもそもC#では速度的に厳しいような難易度の高いプログラムを、未経験者がいきなりC++で作り始めることはかなりこんなんだと思うぞ。
プログラムの実装時の労力は言語だけでなく作る対象によっても変わるからケースバイケースだけど、言語の習得の労力で言えば、C++でまともな実用的なプログラムを作れるレベルに達するのは他の言語に比べて大変だよ。
もし今現在まったくプログラミングの経験がないなら、C++よりC#から始めた方がいい。
C#で速度がでないことを心配するなら、C#で作ってどう改善しても速度が足りないとなってからC++を学習してC++に移植する方がトータルでは早くできそう。
そもそもC#では速度的に厳しいような難易度の高いプログラムを、未経験者がいきなりC++で作り始めることはかなりこんなんだと思うぞ。
353デフォルトの名無しさん
2020/06/14(日) 11:01:19.61ID:u20vDDhC コードの王子さま「まだまだだね」
354デフォルトの名無しさん
2020/06/14(日) 12:21:48.10ID:7AEk3bXh 孤高だからな
355デフォルトの名無しさん
2020/06/14(日) 13:07:15.05ID:8/gzWF83356デフォルトの名無しさん
2020/06/14(日) 15:06:28.05ID:CHdP3JGu >>347
>今の電卓なんかはまさしくわかりやすい例で、特例でコード公開されてて全部C++(/CX)だよ
>新規に打ち出そうとしてるWinUIもC++(/WinRT)での実装
C++/CX はC++ではない。
それが遅い原因だ。
C++/CXを勝手にC++と思ってしまう人が出て本物のC++は迷惑。
>今の電卓なんかはまさしくわかりやすい例で、特例でコード公開されてて全部C++(/CX)だよ
>新規に打ち出そうとしてるWinUIもC++(/WinRT)での実装
C++/CX はC++ではない。
それが遅い原因だ。
C++/CXを勝手にC++と思ってしまう人が出て本物のC++は迷惑。
357デフォルトの名無しさん
2020/06/14(日) 15:42:22.25ID:CHdP3JGu >>341
>C : 15
>C++ : 75
もともと、C++は、C with class 程度の意味で現れて、それで人気が出た。
その時は今ほど複雑でなく、Cではメモリー解放 free() を全部完全にプログラマが
書かなければならなかったところと、C++のデストラクタを使えば、ほぼ自動化することが出来た。
これにより、C++はCよりはメモリー安全になった。
型をC以上に厳密にすることで、コンストラクタとデストラクタの呼び出される回数が、ほぼ必ず同じに
なるように設計されていた。
キャスト構文を使わず、それぞれのデストラクタの中で、子供のオブジェクトに対する delete 文を
書き忘れない限り、ほぼ、コンストラクタとデストラクタは一対一に対応するので、
結果的にメモリーの解放間違いはほぼ無くせる設計になっていた。
これが、(恐らく)後になって RAII という言葉で語られるようになっていった。
また、クラスメンバに対しprotected属性が使えることも安全性を高めた。
さらに、Cでは実行段階で関数を超高速に切り替えるためには関数ポインタを使うことが必須であったが、
C++では仮想関数でそれを行うことが出来るようになり、間違いを減らすことが可能になった。
クラスの継承の概念は、既に作ったプログラムを少しずつ変化させることに役立つため、
プログラムを美しく設計できるようになった。
C++は今のバージョンは難しく見えるが、もともとはCを安全にすることにとても役立つものであった。
>C : 15
>C++ : 75
もともと、C++は、C with class 程度の意味で現れて、それで人気が出た。
その時は今ほど複雑でなく、Cではメモリー解放 free() を全部完全にプログラマが
書かなければならなかったところと、C++のデストラクタを使えば、ほぼ自動化することが出来た。
これにより、C++はCよりはメモリー安全になった。
型をC以上に厳密にすることで、コンストラクタとデストラクタの呼び出される回数が、ほぼ必ず同じに
なるように設計されていた。
キャスト構文を使わず、それぞれのデストラクタの中で、子供のオブジェクトに対する delete 文を
書き忘れない限り、ほぼ、コンストラクタとデストラクタは一対一に対応するので、
結果的にメモリーの解放間違いはほぼ無くせる設計になっていた。
これが、(恐らく)後になって RAII という言葉で語られるようになっていった。
また、クラスメンバに対しprotected属性が使えることも安全性を高めた。
さらに、Cでは実行段階で関数を超高速に切り替えるためには関数ポインタを使うことが必須であったが、
C++では仮想関数でそれを行うことが出来るようになり、間違いを減らすことが可能になった。
クラスの継承の概念は、既に作ったプログラムを少しずつ変化させることに役立つため、
プログラムを美しく設計できるようになった。
C++は今のバージョンは難しく見えるが、もともとはCを安全にすることにとても役立つものであった。
358デフォルトの名無しさん
2020/06/14(日) 16:14:13.31ID:PqSUj3Py 「本物のC++」であるかどうかと速度は直接関係はないと思うが
360デフォルトの名無しさん
2020/06/14(日) 17:11:05.05ID:CHdP3JGu >>358
C++/CXは、メモリ関連で本物のC++とは異なったやり方をしている。
C++が速いのはまさにメモリ関連であるのだから、ソースの書き方が似ていると
しても、そこを変えた言語で書いたプログラムの速度がC++と同じであるとは
とても言えない。
C++/CXは、メモリ関連で本物のC++とは異なったやり方をしている。
C++が速いのはまさにメモリ関連であるのだから、ソースの書き方が似ていると
しても、そこを変えた言語で書いたプログラムの速度がC++と同じであるとは
とても言えない。
361デフォルトの名無しさん
2020/06/14(日) 17:28:22.41ID:u+r3XtR9 この狂人C++/CXをC++/CLIと勘違いしてないか?
362デフォルトの名無しさん
2020/06/14(日) 18:05:23.75ID:UiekgbQo デストラクタをまともに設計できる奴があんまおらんからな。
てか資源解放てインスタンスの種類よりも生成したシチュエーションによることのが多いし
シチュエーション事に開放メソッド選ぶ方がわかりやすい。
だからgoではdefer文による解放なんだろ。
てか資源解放てインスタンスの種類よりも生成したシチュエーションによることのが多いし
シチュエーション事に開放メソッド選ぶ方がわかりやすい。
だからgoではdefer文による解放なんだろ。
363デフォルトの名無しさん
2020/06/14(日) 18:12:49.93ID:iYtMGgBJ >>349
そらキッズを説得するためだからよ。
そらキッズを説得するためだからよ。
364デフォルトの名無しさん
2020/06/14(日) 18:16:02.14ID:CHdP3JGu >>362
ファイルハンドルの様な「資源」は、デストラクタによる解放は実は向いてない。
メモリーが向いている。
もともと、C++のデストラクタは、メモリー安全のためが主目的であったと
言っても過言ではなく、RAIIの R = Resource というのは、変な話。
ファイルハンドルの様な「資源」は、デストラクタによる解放は実は向いてない。
メモリーが向いている。
もともと、C++のデストラクタは、メモリー安全のためが主目的であったと
言っても過言ではなく、RAIIの R = Resource というのは、変な話。
365デフォルトの名無しさん
2020/06/14(日) 18:29:52.90ID:PqSUj3Py366デフォルトの名無しさん
2020/06/14(日) 18:36:46.54ID:RsfUA2Vq int と long long の和って long long ですよね?
int と double の和も double ですよね?
こういうのって大きいデータ型にキャストされると思って良いですか
int と double の和も double ですよね?
こういうのって大きいデータ型にキャストされると思って良いですか
367デフォルトの名無しさん
2020/06/14(日) 19:18:11.35ID:VVffaeyk タイルマップエディタを作る場合はC++とC#どちらがいいですか?
368デフォルトの名無しさん
2020/06/14(日) 19:26:48.64ID:v+4IVp6H369デフォルトの名無しさん
2020/06/14(日) 19:36:58.18ID:q7JXwjKs >>367
どっちでもいい
どうせほとんどは途中で挫折するんだし、苦労して作ったところで現実には誰にも使われずに消えていく
しかしその努力は決して無駄になるわけではなく、君の中には多少なりとも技術と経験が残るだろう
目先ではなく、将来何がしたいのか、そのためには何を習得すべきなのかを考えなさい
どっちでもいい
どうせほとんどは途中で挫折するんだし、苦労して作ったところで現実には誰にも使われずに消えていく
しかしその努力は決して無駄になるわけではなく、君の中には多少なりとも技術と経験が残るだろう
目先ではなく、将来何がしたいのか、そのためには何を習得すべきなのかを考えなさい
370デフォルトの名無しさん
2020/06/14(日) 19:48:57.07ID:VVffaeyk 将来何をしたいか、わからないです
2dにopenglは必要ですか?
必要ならC++なんでしょう
2dにopenglは必要ですか?
必要ならC++なんでしょう
371デフォルトの名無しさん
2020/06/14(日) 19:53:15.45ID:irom8koH 2dにOGLは正直オプションだな。
OGLはグローバル規格だから、WindowsとかOSに縛られるということが少ない。
しかし、近年のGPUは3Dを基準に作っているからOGLを使った方が速度は出るかもしれない。
なお、OGLは特に言語は規定していない。
OGLはグローバル規格だから、WindowsとかOSに縛られるということが少ない。
しかし、近年のGPUは3Dを基準に作っているからOGLを使った方が速度は出るかもしれない。
なお、OGLは特に言語は規定していない。
372デフォルトの名無しさん
2020/06/14(日) 19:56:51.60ID:SBQSrEYR ゲーム作りたいのか?
今時のゲーム開発ではそもそもOpenGLを直で叩く必要はまずなくて、Unityなどの開発スイートを使うのが普通だ
まあC#でいい
今時のゲーム開発ではそもそもOpenGLを直で叩く必要はまずなくて、Unityなどの開発スイートを使うのが普通だ
まあC#でいい
373デフォルトの名無しさん
2020/06/14(日) 20:05:56.73ID:VVffaeyk じゃあエレクトロンで作るよ
374デフォルトの名無しさん
2020/06/14(日) 20:21:24.84ID:irom8koH その場合は、もしかしたらWEBGLかもしれんな。
375デフォルトの名無しさん
2020/06/14(日) 20:33:14.43ID:VVffaeyk 大事ナノは結局ロジックだと思うので(´・ω・`)速度とか考えずにやります
376デフォルトの名無しさん
2020/06/14(日) 21:07:35.45ID:ZstiKk82 UE4はC++なので、ゲームを仕事にしたいなら、C++は使えた方がいい。
unityもスマホゲーや小規模開発でシェア大きいので、Unityで使うC#もやっておこう。
つまり、C#とC++両方を当然に使えるようになるべき。
趣味で作りたいだけなら、資料の多いunityでも、最近VE5の発表で熱いUE4でも、好きな方やればよい。
グラフィックエンジニアやりたいなら、DirectX12やVulcanにてをだしてもよいかもしれない。茨の道だがね
unityもスマホゲーや小規模開発でシェア大きいので、Unityで使うC#もやっておこう。
つまり、C#とC++両方を当然に使えるようになるべき。
趣味で作りたいだけなら、資料の多いunityでも、最近VE5の発表で熱いUE4でも、好きな方やればよい。
グラフィックエンジニアやりたいなら、DirectX12やVulcanにてをだしてもよいかもしれない。茨の道だがね
377デフォルトの名無しさん
2020/06/14(日) 22:02:31.10ID:kf4Cc+ef378デフォルトの名無しさん
2020/06/14(日) 22:11:34.75ID:ye8ce71J >>365
だから、あなたみたいなGC言語に慣れた人が多くなって、C++の本質が理解出来て
無くて RAIIなどといい始めたんだ。
ちがうんだよ、本来のデストラクタの主目的は。
デストラクタの中には、pure C の free() のように、本質的にはどんな場合に
呼び出しても失敗することが無いような関数だけを書くことが基本。
それを昇華すれば、deleteを書いても、絶対に失敗しないことになる。
これは数学的帰納法を理解できない人に入っている意味が分からないと思うが。
とにかく、デストラクタの役割も作られた目的も、メモリの安全な解放だったの
であって、リソースの開放のためでは無いので、リソースの解放をデストラクタ
の中に書くというのはさまざまな問題を生む。
だから、あなたみたいなGC言語に慣れた人が多くなって、C++の本質が理解出来て
無くて RAIIなどといい始めたんだ。
ちがうんだよ、本来のデストラクタの主目的は。
デストラクタの中には、pure C の free() のように、本質的にはどんな場合に
呼び出しても失敗することが無いような関数だけを書くことが基本。
それを昇華すれば、deleteを書いても、絶対に失敗しないことになる。
これは数学的帰納法を理解できない人に入っている意味が分からないと思うが。
とにかく、デストラクタの役割も作られた目的も、メモリの安全な解放だったの
であって、リソースの開放のためでは無いので、リソースの解放をデストラクタ
の中に書くというのはさまざまな問題を生む。
379デフォルトの名無しさん
2020/06/14(日) 22:29:21.16ID:ye8ce71J >>365
>資源のように解放するタイミングが比較的重要なものこそデストラクタが向いているだろう。
少なくとも初期のころのC++は、そのようなことがデストラクタの主目的ではなかった。
今、GCでやっていることが効率が悪いことを見越して、かつ、メモリー安全性を確保するために
発明されたのがデストラクタだ。
数日前にも、ファイルハンドルなどのリソースをRAIIを使ってデストラクタで閉じようとすると、
失敗した時に対処できなくなるという非常に難しい問題が生じることが議論されていた。
メッセージボックスさえ出すことができないかも知れないのだ。
メッセージボックスを出そうとすることがむしろ仇となって、その瞬間に大切なデータが保存できて無い
アプリもろともダウンしてしまう可能性がある。
なぜそういうことがおきるかというと、もともと、デストラクタは、失敗する関数をそこに
含めることを想定していなかったからだ。
>資源のように解放するタイミングが比較的重要なものこそデストラクタが向いているだろう。
少なくとも初期のころのC++は、そのようなことがデストラクタの主目的ではなかった。
今、GCでやっていることが効率が悪いことを見越して、かつ、メモリー安全性を確保するために
発明されたのがデストラクタだ。
数日前にも、ファイルハンドルなどのリソースをRAIIを使ってデストラクタで閉じようとすると、
失敗した時に対処できなくなるという非常に難しい問題が生じることが議論されていた。
メッセージボックスさえ出すことができないかも知れないのだ。
メッセージボックスを出そうとすることがむしろ仇となって、その瞬間に大切なデータが保存できて無い
アプリもろともダウンしてしまう可能性がある。
なぜそういうことがおきるかというと、もともと、デストラクタは、失敗する関数をそこに
含めることを想定していなかったからだ。
380デフォルトの名無しさん
2020/06/14(日) 22:37:05.85ID:OGb6Unub >C++の本質が理解出来て無くて RAIIなどといい始めたんだ。
RAIIって20世紀の頃の禿のお言葉なんだがw
RAIIって20世紀の頃の禿のお言葉なんだがw
381デフォルトの名無しさん
2020/06/14(日) 22:52:30.07ID:ye8ce71J Bjarne Stroustrup 氏の事を禿と言ってしまう人の人間性を疑う。
名前が覚えられないのか。
名前が覚えられないのか。
382デフォルトの名無しさん
2020/06/14(日) 22:54:20.28ID:aLpfCXag あら議論から逃げよったわw
383デフォルトの名無しさん
2020/06/14(日) 22:58:03.93ID:MuaS91+w 妙だな? 誰も禿をびよーねとは言っていないのに・・・
384デフォルトの名無しさん
2020/06/14(日) 23:03:05.44ID:PqSUj3Py385デフォルトの名無しさん
2020/06/14(日) 23:04:20.52ID:ye8ce71J まあ、RAIIが、20世紀に考え出されていたのであれば、それはそれで良しとしよう。
でも、彼の頭の中でどうであったとせよ、当時の本を見れば、デストラクタの
説明としてほぼ必ずと言って、メモリ解放のために用いる例が書かれていたのだから、
C++を実用的な観点で見た時にデストラクタの一番の使い道はメモリ解放であった
ことは疑いの無い事実だろう。
でも、彼の頭の中でどうであったとせよ、当時の本を見れば、デストラクタの
説明としてほぼ必ずと言って、メモリ解放のために用いる例が書かれていたのだから、
C++を実用的な観点で見た時にデストラクタの一番の使い道はメモリ解放であった
ことは疑いの無い事実だろう。
386デフォルトの名無しさん
2020/06/14(日) 23:09:16.33ID:hr1wykPX387デフォルトの名無しさん
2020/06/14(日) 23:13:56.65ID:OGb6Unub388246
2020/06/14(日) 23:28:20.22ID:qmm3PCBI389デフォルトの名無しさん
2020/06/14(日) 23:32:05.30ID:iYtMGgBJ >>387
英語じゃねーか、日本語で書けよ。
英語じゃねーか、日本語で書けよ。
390デフォルトの名無しさん
2020/06/14(日) 23:57:28.27ID:ye8ce71J アメリカ人は馬鹿だから参考にならない。
彼らのために世界中の生産性が下がっている。
彼らのために世界中の生産性が下がっている。
391デフォルトの名無しさん
2020/06/15(月) 00:10:53.34ID:Bn8xL7m+ 禿先生はデンマーク人だぞ
392デフォルトの名無しさん
2020/06/15(月) 00:13:02.53ID:1aJEphkT >>389
王者の気品とか言っちゃう奴の日本語よりはまともな人の書いた英語の方が遥かに読みやすいし、内容の価値は比べるまでもないw
王者の気品とか言っちゃう奴の日本語よりはまともな人の書いた英語の方が遥かに読みやすいし、内容の価値は比べるまでもないw
393デフォルトの名無しさん
2020/06/15(月) 00:23:21.40ID:94IDrwxi 以上、本日のASDLおじいちゃん演説会でした
394デフォルトの名無しさん
2020/06/15(月) 00:56:17.21ID:Hw5ljvB7 で、本物のC++はどうやったら食べられるのですか
395デフォルトの名無しさん
2020/06/15(月) 02:02:25.91ID:oHOmQwtH ドラえもんの暗記パンで
396デフォルトの名無しさん
2020/06/15(月) 04:52:38.04ID:1aJEphkT397デフォルトの名無しさん
2020/06/15(月) 09:43:39.22ID:Q9IHrxmr std::listやvector,map,unordered_mapなどのコンテナのイテレータについての質問です
コンテナのある要素を指すイテレータを保存してるときに、
そのコンテナに対して変更が加えられたとき、保存したイテレータは有効なのでしょうか??
例えば、元の要素が削除されたら、無効になるのは想像つきます
例えば、前後に別の要素が追加されたら、保存したイテレータは元の同じ要素を指してる保証はあるのでしょうか??
std::listはリンクリストなので、前後に要素を追加されても影響受けなさそうですが?
std::vectorはインデックスで管理してるとダメそう?
std::mapは?
コンテナのある要素を指すイテレータを保存してるときに、
そのコンテナに対して変更が加えられたとき、保存したイテレータは有効なのでしょうか??
例えば、元の要素が削除されたら、無効になるのは想像つきます
例えば、前後に別の要素が追加されたら、保存したイテレータは元の同じ要素を指してる保証はあるのでしょうか??
std::listはリンクリストなので、前後に要素を追加されても影響受けなさそうですが?
std::vectorはインデックスで管理してるとダメそう?
std::mapは?
398デフォルトの名無しさん
2020/06/15(月) 10:08:43.12ID:w4yns3wG イテレータが無効になる場合はコンテナの種類と操作によって決まっているのでまともな解説にはちゃんと書いてある。
例えばvectorのinsert()はストレージの再確保が行われなければinsertした場所より前の要素を指すイテレータは無効にならないといった具合。
例えばvectorのinsert()はストレージの再確保が行われなければinsertした場所より前の要素を指すイテレータは無効にならないといった具合。
399デフォルトの名無しさん
2020/06/15(月) 10:13:02.37ID:Q9IHrxmr400デフォルトの名無しさん
2020/06/15(月) 12:16:11.97ID:LBP04AxD401デフォルトの名無しさん
2020/06/15(月) 14:06:35.72ID:iqqqiJ5Y デストラクタで例外を出す可能性があるクラス Hoge について
---- A.cpp
Hoge hoge;
int main(int argc, char **argv)
{
// hoge を使う
return 0;
}
---- A.cpp ここまで
---- B.cpp
int main(int argc, char **argv)
{
Hoge hoge;
// hoge を使う
return 0;
}
---- B.cpp ここまで
B だと例外補足されるというか表示されるけど
A だと握り潰されてプロセス終了する(例外出てても気付けない)?
---- A.cpp
Hoge hoge;
int main(int argc, char **argv)
{
// hoge を使う
return 0;
}
---- A.cpp ここまで
---- B.cpp
int main(int argc, char **argv)
{
Hoge hoge;
// hoge を使う
return 0;
}
---- B.cpp ここまで
B だと例外補足されるというか表示されるけど
A だと握り潰されてプロセス終了する(例外出てても気付けない)?
402デフォルトの名無しさん
2020/06/15(月) 14:12:45.65ID:+GKLccgq はちみつ餃子 さまを筆頭とする方々にお答えしていただけることを期待しております。
std::forward()がどうやって実装されているかを調べるため、
MSのオープンソースのSTLのソースの「STL-master」の中の type_traits
というのを見ていたのですが、仕組みが完全には分かりません。
以下の1つ目のforwrd()は、左辺値参照で受け取るまでは分かりそうなのですが、
その後、return static_cast<_Ty&&>(_Arg) としているのに、結果は、左辺値に
なっていなければ、forward()の使用に合わないはずですが、なぜ、
右辺値参照にcastしているのに、左辺値参照のままなのでしょうか?
/* 左辺値を受け取る forward() のテンプレートらしいですが、
_Arg が左辺値参照ならば(?)、static_cast<_Ty&&>(_Arg)
と cast しても、右辺値参照になるとるは限らない??? */
template <class _Ty>
_NODISCARD constexpr _Ty&& forward(
remove_reference_t<_Ty>& _Arg) noexcept { // forward an lvalue as either an lvalue or an rvalue
return static_cast<_Ty&&>(_Arg);
}
// 右辺値を受け取る forward() のテンプレートらしいです :
template <class _Ty>
_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept { // forward an rvalue as an rvalue
static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
return static_cast<_Ty&&>(_Arg);
}
template <class _Ty>
_NODISCARD constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movable
return static_cast<remove_reference_t<_Ty>&&>(_Arg);
}
std::forward()がどうやって実装されているかを調べるため、
MSのオープンソースのSTLのソースの「STL-master」の中の type_traits
というのを見ていたのですが、仕組みが完全には分かりません。
以下の1つ目のforwrd()は、左辺値参照で受け取るまでは分かりそうなのですが、
その後、return static_cast<_Ty&&>(_Arg) としているのに、結果は、左辺値に
なっていなければ、forward()の使用に合わないはずですが、なぜ、
右辺値参照にcastしているのに、左辺値参照のままなのでしょうか?
/* 左辺値を受け取る forward() のテンプレートらしいですが、
_Arg が左辺値参照ならば(?)、static_cast<_Ty&&>(_Arg)
と cast しても、右辺値参照になるとるは限らない??? */
template <class _Ty>
_NODISCARD constexpr _Ty&& forward(
remove_reference_t<_Ty>& _Arg) noexcept { // forward an lvalue as either an lvalue or an rvalue
return static_cast<_Ty&&>(_Arg);
}
// 右辺値を受け取る forward() のテンプレートらしいです :
template <class _Ty>
_NODISCARD constexpr _Ty&& forward(remove_reference_t<_Ty>&& _Arg) noexcept { // forward an rvalue as an rvalue
static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
return static_cast<_Ty&&>(_Arg);
}
template <class _Ty>
_NODISCARD constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movable
return static_cast<remove_reference_t<_Ty>&&>(_Arg);
}
403はちみつ餃子 ◆8X2XSCHEME
2020/06/15(月) 14:46:55.44ID:WVo0Ka65 >>402
正確なルールを説明するとなると長くなる (というか私もそんなに入り組んだところまで把握してない) んだが、
「参照の参照」を作った時に調整されるルール reference collapsing によるものだと思う。
左辺値参照から右辺値参照を作ろうとしたときには左辺値参照に調整される。
正確なルールを説明するとなると長くなる (というか私もそんなに入り組んだところまで把握してない) んだが、
「参照の参照」を作った時に調整されるルール reference collapsing によるものだと思う。
左辺値参照から右辺値参照を作ろうとしたときには左辺値参照に調整される。
404デフォルトの名無しさん
2020/06/15(月) 15:04:09.59ID:+GKLccgq >>403
回答有難うございます。
一生懸命調べたところ、こんな記述を見つけました。Tがオブジェクト型の場合、(T &&)x のように cast すると、
結果は、右辺値にならずに xvalueになるようです。
でもそこから先は理解できてません。
https://stackoverflow.com/questions/40801765/is-it-an-rvalue-or-lvalue-after-a-cast
From expr.cast (this is applicable from C++11 and later)
C++ 11 以後の場合 :
The result of the expression (T) cast-expression is of type T.
式「(T)cast-expression」の結果は、T 型である。
The result is an lvalue if T is an lvalue reference type or an rvalue reference to function type and an xvalue if T is an rvalue reference to object type;
Tが関数型への左辺値参照/右辺値参照の場合は、結果は 左辺値で、
Tがオブジェクト型への右辺値参照の場合は、結果は xvalue である。
otherwise the result is a prvalue.
そのどちらでも無い場合、結果は、prvalue である。
回答有難うございます。
一生懸命調べたところ、こんな記述を見つけました。Tがオブジェクト型の場合、(T &&)x のように cast すると、
結果は、右辺値にならずに xvalueになるようです。
でもそこから先は理解できてません。
https://stackoverflow.com/questions/40801765/is-it-an-rvalue-or-lvalue-after-a-cast
From expr.cast (this is applicable from C++11 and later)
C++ 11 以後の場合 :
The result of the expression (T) cast-expression is of type T.
式「(T)cast-expression」の結果は、T 型である。
The result is an lvalue if T is an lvalue reference type or an rvalue reference to function type and an xvalue if T is an rvalue reference to object type;
Tが関数型への左辺値参照/右辺値参照の場合は、結果は 左辺値で、
Tがオブジェクト型への右辺値参照の場合は、結果は xvalue である。
otherwise the result is a prvalue.
そのどちらでも無い場合、結果は、prvalue である。
405デフォルトの名無しさん
2020/06/15(月) 15:11:00.42ID:UmY/I/0X406デフォルトの名無しさん
2020/06/15(月) 15:15:51.75ID:kn0xQdMp より詳しい説明が出るのは役に立つんだから別にいいだろ
それよりもはちみつごときに様つけたりここの住人の筆頭にするな
それよりもはちみつごときに様つけたりここの住人の筆頭にするな
408デフォルトの名無しさん
2020/06/15(月) 16:19:05.98ID:+GKLccgq >>407
lvalue, xvalue, prvalue は排反集合なのですが、
glvalueとrvalueは、正確に
#define IS_GLVALUE(X) (IS_LVALUE(X) || IS_XVALUE(X)) // glvalue は、lvalue と xvalue の和集合
#define IS_RVALUE(X) (IS_PRVALUE(X) || IS_XVALUE(X)) // rvalue は、 prvalue と xvalue の和集合
なので、rvalueであっても、xvalueで無い場合がありえます。
それは、prvalueです。
lvalue, xvalue, prvalue は排反集合なのですが、
glvalueとrvalueは、正確に
#define IS_GLVALUE(X) (IS_LVALUE(X) || IS_XVALUE(X)) // glvalue は、lvalue と xvalue の和集合
#define IS_RVALUE(X) (IS_PRVALUE(X) || IS_XVALUE(X)) // rvalue は、 prvalue と xvalue の和集合
なので、rvalueであっても、xvalueで無い場合がありえます。
それは、prvalueです。
409デフォルトの名無しさん
2020/06/15(月) 16:32:37.00ID:+GKLccgq410デフォルトの名無しさん
2020/06/15(月) 17:00:27.16ID:+GKLccgq >>408
>なので、rvalueであっても、xvalueで無い場合がありえます。
このことは、正しいのですが、
#define IS_RVALUE(X) (IS_PRVALUE(X) || IS_XVALUE(X)) // rvalue は、 prvalue と xvalue の和集合
によれば、
xvalueであれば 必ず rvalue ではあるので、
「xvalue は rvalue の一種」
という命題は必ず真で、はちみつ餃子さんのおっしゃっていることは正しいと思います。
rvalueが動物、xvalueが犬、であるような関係になります。
動物(rvalue)であっても犬(xvalue)で無い場合がありえますが、
犬(xvalue)であれば必ず動物(rvalue)であり、犬(xvalue)は動物(rvalue)の一種です。
>なので、rvalueであっても、xvalueで無い場合がありえます。
このことは、正しいのですが、
#define IS_RVALUE(X) (IS_PRVALUE(X) || IS_XVALUE(X)) // rvalue は、 prvalue と xvalue の和集合
によれば、
xvalueであれば 必ず rvalue ではあるので、
「xvalue は rvalue の一種」
という命題は必ず真で、はちみつ餃子さんのおっしゃっていることは正しいと思います。
rvalueが動物、xvalueが犬、であるような関係になります。
動物(rvalue)であっても犬(xvalue)で無い場合がありえますが、
犬(xvalue)であれば必ず動物(rvalue)であり、犬(xvalue)は動物(rvalue)の一種です。
411デフォルトの名無しさん
2020/06/15(月) 17:03:05.14ID:+GKLccgq 「xvalue は rvalue の一種」でもあり、
「xvalue は glvalue の一種」でもあるのですね。
「xvalue は glvalue の一種」でもあるのですね。
412はちみつ餃子 ◆8X2XSCHEME
2020/06/15(月) 17:11:13.40ID:WVo0Ka65 >>405
疑問が深まったら掘り下げるのは別にいいんじゃね。 根拠も提示されてるし。
>>409
ワイは趣味プログラマやで。
実務家が言語仕様の詳細に興味がないのもよくあることなので、
プロのプログラマが仕様に詳しいとは限らんけど、
平均的には日常的に C++ でプログラミングしているやつの方が詳しいよ。 当然に。
>>408
あれっ、そうか。 カテゴリに関しては俺の間違い。
で結局は >>403 で述べた通り reference collapsing が適用されるってだけだと思う。
https://timsong-cpp.github.io/cppwp/n3337/dcl.ref#6
疑問が深まったら掘り下げるのは別にいいんじゃね。 根拠も提示されてるし。
>>409
ワイは趣味プログラマやで。
実務家が言語仕様の詳細に興味がないのもよくあることなので、
プロのプログラマが仕様に詳しいとは限らんけど、
平均的には日常的に C++ でプログラミングしているやつの方が詳しいよ。 当然に。
>>408
あれっ、そうか。 カテゴリに関しては俺の間違い。
で結局は >>403 で述べた通り reference collapsing が適用されるってだけだと思う。
https://timsong-cpp.github.io/cppwp/n3337/dcl.ref#6
413はちみつ餃子 ◆8X2XSCHEME
2020/06/15(月) 17:18:57.93ID:WVo0Ka65 いや、なんか違う気もしてきた。
わかんね。
わかんね。
414デフォルトの名無しさん
2020/06/15(月) 18:34:21.52ID:+GKLccgq >>412
>平均的には日常的に C++ でプログラミングしているやつの方が詳しいよ。 当然に。
C++は、何十年も前に既に完成している言語なので、実態はわかりませんが、仕事をC++を使っている人でも、はちみつ餃子さんのようには新しい仕様を知らない人の方が多いのではないかと思うのです。
>平均的には日常的に C++ でプログラミングしているやつの方が詳しいよ。 当然に。
C++は、何十年も前に既に完成している言語なので、実態はわかりませんが、仕事をC++を使っている人でも、はちみつ餃子さんのようには新しい仕様を知らない人の方が多いのではないかと思うのです。
415デフォルトの名無しさん
2020/06/15(月) 20:04:29.90ID:fMEeoq9p はちみつ餃子 さまを筆頭とするはちみつ餃子さまにお答えしていただけることを期待しております。
普段どんな仕事をしてるの?
普段どんな仕事をしてるの?
416デフォルトの名無しさん
2020/06/15(月) 20:05:26.73ID:+GKLccgq >>404 の
「The result is an lvalue if T is an lvalue reference type or an rvalue reference to function type and an xvalue if T is an rvalue reference to object type;」
の部分の訳が一部間違っていて、正しくは、
「Tが左辺値参照型か、または、関数型への右辺値参照の場合は、結果は 左辺値で、
Tがオブジェクト型への右辺値参照の場合は、結果は xvalue である。」
ということのようです。
結果として、>>402 の return 文のオペランドの
static_cast<_Ty&&>(_Arg)
の部分は、
1. _Argの型が左辺値参照型の場合、左辺値(i & !m)
2. _Argの型が右辺値参照型の場合、xvalue(右辺値の一種, i & m)
となるようです。
「The result is an lvalue if T is an lvalue reference type or an rvalue reference to function type and an xvalue if T is an rvalue reference to object type;」
の部分の訳が一部間違っていて、正しくは、
「Tが左辺値参照型か、または、関数型への右辺値参照の場合は、結果は 左辺値で、
Tがオブジェクト型への右辺値参照の場合は、結果は xvalue である。」
ということのようです。
結果として、>>402 の return 文のオペランドの
static_cast<_Ty&&>(_Arg)
の部分は、
1. _Argの型が左辺値参照型の場合、左辺値(i & !m)
2. _Argの型が右辺値参照型の場合、xvalue(右辺値の一種, i & m)
となるようです。
417デフォルトの名無しさん
2020/06/15(月) 20:13:24.30ID:ZNXm/M6v 自分のレスにレス返すスタイルなんなの
自分の日記帳でやれよ
自分の日記帳でやれよ
418デフォルトの名無しさん
2020/06/15(月) 20:48:28.91ID:hnmQwUn9 これ前の人だよね
419デフォルトの名無しさん
2020/06/15(月) 21:31:20.35ID:bSwpQKjB 結局答えられないんですねの人?
420デフォルトの名無しさん
2020/06/15(月) 21:44:07.48ID:Q9IHrxmr また、質問します。
アプリでunordered_mapやunordered_setのコンテナ10個くらい使うのですが問題はキーの型が可変長でstd::stringで結構長いことです
具体的にはキーはファイルパスとかになるのですが
で、頻繁にコンテナを使用します
ファイラーみたいなアプリを想定して
このとき、キーをstringにするとコピーなどのオーバーヘッドが発生?すると思いますがさすがにこのレベルは気にした方がよい?
アプリでunordered_mapやunordered_setのコンテナ10個くらい使うのですが問題はキーの型が可変長でstd::stringで結構長いことです
具体的にはキーはファイルパスとかになるのですが
で、頻繁にコンテナを使用します
ファイラーみたいなアプリを想定して
このとき、キーをstringにするとコピーなどのオーバーヘッドが発生?すると思いますがさすがにこのレベルは気にした方がよい?
421デフォルトの名無しさん
2020/06/15(月) 21:48:49.59ID:Q9IHrxmr ユーザーがカレントフォルダ移動したり、ファイル一覧のリストビューをスクロールするだけで走ります
で、きにする場合はキーをstd::shated_ptrでくるめばいいんですかね?他に方法ありますでしょうか?
で、きにする場合はキーをstd::shated_ptrでくるめばいいんですかね?他に方法ありますでしょうか?
422デフォルトの名無しさん
2020/06/15(月) 22:01:06.47ID:LBP04AxD >>420 効率は実測が基本。
423デフォルトの名無しさん
2020/06/15(月) 22:17:50.72ID:Bn8xL7m+ 100万文字のstringをキーにしたって、unorderedの内部で扱うのはハッシュなんだから挿入や検索の速さは変わらん(ハッシュ計算のコストを除く)
そのファイラーが糞重いんだったら原因はそこじゃないと思うぞ
そのファイラーが糞重いんだったら原因はそこじゃないと思うぞ
424デフォルトの名無しさん
2020/06/15(月) 22:52:38.98ID:Q9IHrxmr ありがとうございます
>>422の言う通り最終的は実測でしょうが、キーをstringにしたときのキーのメモリコピーのオーバーヘッドを気にしてました
が、よく考えてみますと実際にキーのコピーが発生するのは実際に要素を挿入するとき1回だけっぽいですね
findメソッドやcountでキーを渡しますがキーを参照で渡しますし、hash関数も参照でキーの値を受けとりますし
>>422の言う通り最終的は実測でしょうが、キーをstringにしたときのキーのメモリコピーのオーバーヘッドを気にしてました
が、よく考えてみますと実際にキーのコピーが発生するのは実際に要素を挿入するとき1回だけっぽいですね
findメソッドやcountでキーを渡しますがキーを参照で渡しますし、hash関数も参照でキーの値を受けとりますし
425デフォルトの名無しさん
2020/06/15(月) 23:00:46.83ID:Q9IHrxmr キーのコピーの頻度そこら辺を想像したことなかったので、びびってましたがびびる必要なかったぽいですね
ということ、普通にstringをキーに実装してみます
ということ、普通にstringをキーに実装してみます
426はちみつ餃子 ◆8X2XSCHEME
2020/06/15(月) 23:00:50.65ID:WVo0Ka65 >>424
string はムーブ対応してるんで所有権を渡してしまうなら文字列全体のコピーはしないよ。
string はムーブ対応してるんで所有権を渡してしまうなら文字列全体のコピーはしないよ。
427デフォルトの名無しさん
2020/06/15(月) 23:12:46.11ID:Q9IHrxmr >>426
なるほど、findやcountの場合はキーの値を実際にコピーする必要ないから、&&の引数のオーバーロードはないが、insertの場合は&&の引数で、所有権移せるバージョンもあるんですね
なるほど、findやcountの場合はキーの値を実際にコピーする必要ないから、&&の引数のオーバーロードはないが、insertの場合は&&の引数で、所有権移せるバージョンもあるんですね
428デフォルトの名無しさん
2020/06/15(月) 23:14:22.14ID:hnmQwUn9 この人がどうかは知らないけど
スクリプト言語あがりはstring + mapばっか使うんだよね
万能さはわかるけどさ
それで効率が〜とか
どうなのそれw
スクリプト言語あがりはstring + mapばっか使うんだよね
万能さはわかるけどさ
それで効率が〜とか
どうなのそれw
429はちみつ餃子 ◆8X2XSCHEME
2020/06/16(火) 00:10:13.43ID:1HqJhS8P ワイはもうおっちゃんやから小さい単位で型を作って名前を付けておかんと何をしよったかわからんようになるんやが、
文字列三昧で上手いことやれてまうやつはどういう脳みそをしとんや……。
と疑問に思ったこともあったんやけど、大抵の場合はうまいことやれとらんかった。
文字列三昧で上手いことやれてまうやつはどういう脳みそをしとんや……。
と疑問に思ったこともあったんやけど、大抵の場合はうまいことやれとらんかった。
430デフォルトの名無しさん
2020/06/16(火) 00:48:04.50ID:i3Et6pFy プログラマ2年目だけど全然クラス作れんワイ低みの見物
責務責務いうけどどっからどこまでが責務やねん
責務責務いうけどどっからどこまでが責務やねん
431デフォルトの名無しさん
2020/06/16(火) 01:42:35.85ID:YM27wSPO いや、おそらくその設計間違ってるな。
432デフォルトの名無しさん
2020/06/16(火) 05:42:11.77ID:5RaFaaPW std::string は参照カウントになってる場合もあるでしょ。
オブジェクトをコピーしても長さに応じたデータコピーが発生するとは限らない。
代わりに短い文字列ばっかりでも同じだけ重い可能性もあるんだが。
オブジェクトをコピーしても長さに応じたデータコピーが発生するとは限らない。
代わりに短い文字列ばっかりでも同じだけ重い可能性もあるんだが。
433はちみつ餃子 ◆8X2XSCHEME
2020/06/16(火) 08:52:22.88ID:1HqJhS8P >>432
ちゃんとした実装なら短い文字列ではヒープアロケーションが発生しないような最適化 (いわゆる SSO) が入ってるよ。
ちゃんとした実装なら短い文字列ではヒープアロケーションが発生しないような最適化 (いわゆる SSO) が入ってるよ。
434デフォルトの名無しさん
2020/06/16(火) 08:59:33.85ID:7rFOsosY gccは参照カウントなstringは課題があるからやめたって10年以上前に聞いた気がするけど今はどうなんだろ
435デフォルトの名無しさん
2020/06/16(火) 13:38:01.19ID:Ea3gt1wL >>123
>100万文字のstringをキーにしたって、unorderedの内部で扱うのはハッシュなんだから挿入や検索の速さは変わらん(ハッシュ計算のコストを除く)
厳密に言えば変わります。
データの個数がM、キーの文字数がNの場合、検索に掛かる時間は、
ハッシュを遣わなくて単純に比較した場合は、
O(MN)
となりますが、ハッシュ法の場合でも、
O(M + N)
となるので、掛け算と足し算の違いは有りますが、キーの文字数をいくら長くしても検索時間が増えない、というようなことはありません。
>100万文字のstringをキーにしたって、unorderedの内部で扱うのはハッシュなんだから挿入や検索の速さは変わらん(ハッシュ計算のコストを除く)
厳密に言えば変わります。
データの個数がM、キーの文字数がNの場合、検索に掛かる時間は、
ハッシュを遣わなくて単純に比較した場合は、
O(MN)
となりますが、ハッシュ法の場合でも、
O(M + N)
となるので、掛け算と足し算の違いは有りますが、キーの文字数をいくら長くしても検索時間が増えない、というようなことはありません。
436デフォルトの名無しさん
2020/06/16(火) 15:27:53.17ID:VeSUiyGP >>430
クエリとコマンド、リードとライトでとりあえず分けるとこからやったらええ
クエリとコマンド、リードとライトでとりあえず分けるとこからやったらええ
437はちみつ餃子 ◆8X2XSCHEME
2020/06/16(火) 15:55:59.04ID:1HqJhS8P >>430
責務なぁ……。
俺はとにかく名前で考えるようにしてるよ。
名前を付けたい単位に分けて、それを書いている内に名前を付けたい部分が出来たら括り出して……
という風に繰り返してたら (少なくとも自分にとっては) だいたい使いやすいデザインが出来てる。
名前を付けたらそれの役割ってのはほとんど自明だったりするし。
ぼんやりした構造って頭に残り難くて何をやってたかわけわからんようになるので、
名前を付けるってのはかなり大事なことだと思う。
責務なぁ……。
俺はとにかく名前で考えるようにしてるよ。
名前を付けたい単位に分けて、それを書いている内に名前を付けたい部分が出来たら括り出して……
という風に繰り返してたら (少なくとも自分にとっては) だいたい使いやすいデザインが出来てる。
名前を付けたらそれの役割ってのはほとんど自明だったりするし。
ぼんやりした構造って頭に残り難くて何をやってたかわけわからんようになるので、
名前を付けるってのはかなり大事なことだと思う。
438デフォルトの名無しさん
2020/06/16(火) 18:27:56.96ID:HoWpcnpR >>435
O(M+N) って、ハッシュ計算のコストを含めたうえでの最悪計算量でしょ。
ハッシュ計算のコストを除いた平均計算量を O(1) にすることも可能なのがハッシュの利点、というのが一般的かと。
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
> ...検索や追加を要素数によらず定数時間O(1)で実現する。...
O(M+N) って、ハッシュ計算のコストを含めたうえでの最悪計算量でしょ。
ハッシュ計算のコストを除いた平均計算量を O(1) にすることも可能なのがハッシュの利点、というのが一般的かと。
https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
> ...検索や追加を要素数によらず定数時間O(1)で実現する。...
439デフォルトの名無しさん
2020/06/16(火) 18:49:47.04ID:Ea3gt1wL >>438
キーはそんなにバイト数が長く無くて、常識的にはある程度で上限が有る事が多いので、通常はO(1)と書いてあるだけです。
なぜかというと、ハッシュ値で大体は特定できても、最後、キーが完全一致していることを確認しなくてはなりませんが、
その時に文字列の比較のために、文字列の文字数であるところのNに比例した時間が掛かるためです。
例えば、キーの文字列の長さNが、1GBだとすると、文字列比較のために1*10^9程度のループが必要となります。
キーはそんなにバイト数が長く無くて、常識的にはある程度で上限が有る事が多いので、通常はO(1)と書いてあるだけです。
なぜかというと、ハッシュ値で大体は特定できても、最後、キーが完全一致していることを確認しなくてはなりませんが、
その時に文字列の比較のために、文字列の文字数であるところのNに比例した時間が掛かるためです。
例えば、キーの文字列の長さNが、1GBだとすると、文字列比較のために1*10^9程度のループが必要となります。
440デフォルトの名無しさん
2020/06/16(火) 19:19:02.88ID:HoWpcnpR441デフォルトの名無しさん
2020/06/16(火) 19:21:15.40ID:uOZIHf/t スレ立てるまでもないスレにも同じようなこと書いたのですがすみません
巨大なファイルを読み込んで書き出すプログラムを書いています
time1, data1-1, data2-1, data3-1......datan-1
time2, data1-2, data2-2, data3-2......datan-2
:
みたいな構造が延々と続いています
でこれをdataごとに
data1.csv
time1 data1-1
time2 data1-2
:
ってそれぞれ書き出して分割する感じなんです
vector<ofstream&> files;
for (auto filename : filenames)
{
巨大なファイルを読み込んで書き出すプログラムを書いています
time1, data1-1, data2-1, data3-1......datan-1
time2, data1-2, data2-2, data3-2......datan-2
:
みたいな構造が延々と続いています
でこれをdataごとに
data1.csv
time1 data1-1
time2 data1-2
:
ってそれぞれ書き出して分割する感じなんです
vector<ofstream&> files;
for (auto filename : filenames)
{
442デフォルトの名無しさん
2020/06/16(火) 19:24:51.88ID:uOZIHf/t 失礼途中で送信してしまいました。
vector<ofstream&> files;
for (auto filename : filenames)
{
ofstream temp(filename, ios::out);
files.push_back(&temp);
}
こんな感じでofstreamの配列を作ってあとはそれぞれにデータを入れていこうとしたのですが
アクセス違反になります。スコープの外に出たらofstreamは勝手にcloseされる?そうなのでそのせいかなと思っています
複数のファイルに対して順々にデータを書いていきそれをループするのってどうしたらいいでしょうか
vector<ofstream&> files;
for (auto filename : filenames)
{
ofstream temp(filename, ios::out);
files.push_back(&temp);
}
こんな感じでofstreamの配列を作ってあとはそれぞれにデータを入れていこうとしたのですが
アクセス違反になります。スコープの外に出たらofstreamは勝手にcloseされる?そうなのでそのせいかなと思っています
複数のファイルに対して順々にデータを書いていきそれをループするのってどうしたらいいでしょうか
443デフォルトの名無しさん
2020/06/16(火) 19:29:01.32ID:zbVOEmpz 答え分かってんならちゃんと実体を外に持たせなよ
vector<ofstream> files;
for (auto filename : filenames)
{
ofstream temp(filename, ios::out);
files.push_back(std::move(temp));
}
vector<ofstream> files;
for (auto filename : filenames)
{
ofstream temp(filename, ios::out);
files.push_back(std::move(temp));
}
444デフォルトの名無しさん
2020/06/16(火) 20:59:11.88ID:i3Et6pFy 通常はO(1)(で見積もっときゃまぁ大きくは外れない)
445デフォルトの名無しさん
2020/06/16(火) 22:57:05.95ID:EUOlqdFN 業務でC++やることになりました
どうせなら体系的に学ぼうと思い、本を買おうと思いますがおすすめありますか?
CとC#の経験はあります
Cは組み込み開発での利用に、C#はデザインパターンを少しは活用出来る程度のレベルです
どうせなら体系的に学ぼうと思い、本を買おうと思いますがおすすめありますか?
CとC#の経験はあります
Cは組み込み開発での利用に、C#はデザインパターンを少しは活用出来る程度のレベルです
446デフォルトの名無しさん
2020/06/16(火) 23:21:49.71ID:yU3B6kSM >>435
キーの文字数Nはプログラムがビルドしおわったら変わらないのだから実質定数なのであって、
結局O(M)になるのでは…
(任意のxについて x + 定数 < a * xを満たす定数aを見出せるからオーダー表記の約束によりO(M+(定数)) = O(M)ェ、
しかもこの場合のMはデータの個数に比例するとわいえ、一般的はハッシュテーブルなら衝突しない限り
1回のテーブルアクセスで目的のエントリにたどり着くから、実際にはデータの個数÷ハッシュテーブルサイズ(エントリ数)
となるから衝突が無視できる(エントリ選択に統計的に偏りがなく、かつハッシュテーブルサイズが十分おおおきい
ならO(1)と逝って良いキモス、
キーの文字数Nはプログラムがビルドしおわったら変わらないのだから実質定数なのであって、
結局O(M)になるのでは…
(任意のxについて x + 定数 < a * xを満たす定数aを見出せるからオーダー表記の約束によりO(M+(定数)) = O(M)ェ、
しかもこの場合のMはデータの個数に比例するとわいえ、一般的はハッシュテーブルなら衝突しない限り
1回のテーブルアクセスで目的のエントリにたどり着くから、実際にはデータの個数÷ハッシュテーブルサイズ(エントリ数)
となるから衝突が無視できる(エントリ選択に統計的に偏りがなく、かつハッシュテーブルサイズが十分おおおきい
ならO(1)と逝って良いキモス、
447デフォルトの名無しさん
2020/06/16(火) 23:31:56.61ID:yU3B6kSM あと1億文字のstring aと10文字のstring bとでハッシュキーを求める手間はどうかというと、
正直にやると文字数に比例するが
うまいことやったら定数にできる
もしくは文字列の構成時に都度ハッシュを更新するようにして、
ハッシュが入用になったときカタが付いている形ににする
正直にやると文字数に比例するが
うまいことやったら定数にできる
もしくは文字列の構成時に都度ハッシュを更新するようにして、
ハッシュが入用になったときカタが付いている形ににする
448デフォルトの名無しさん
2020/06/16(火) 23:44:57.63ID:Z1WD1bfY そんな事をするなら素直にノードのポインタを持て
と言いたい
と言いたい
449デフォルトの名無しさん
2020/06/16(火) 23:56:47.86ID:yU3B6kSM それではもともとの問題が解決しない
一億文字のstring aがメモリ上に存在するとして、
まったく別の手段で同じ字面の一億文字の文字列bを作ってしまったとする
aはaのノードを指し、
bはbのノードを指す、としたときに、
2つのノードが実は同じ文字列であることを確かめるには、
プログラムが他にあまた生成した10億個の文字列を一つ一つ確かめ、
最長1億文字の比較を行わねば結論が出ない(
ハッシュテーブルなら一瞬で済む
一億文字のstring aがメモリ上に存在するとして、
まったく別の手段で同じ字面の一億文字の文字列bを作ってしまったとする
aはaのノードを指し、
bはbのノードを指す、としたときに、
2つのノードが実は同じ文字列であることを確かめるには、
プログラムが他にあまた生成した10億個の文字列を一つ一つ確かめ、
最長1億文字の比較を行わねば結論が出ない(
ハッシュテーブルなら一瞬で済む
450デフォルトの名無しさん
2020/06/16(火) 23:57:59.42ID:yU3B6kSM 訂正orz、
誤: 10億個の文字列
正: 10億個のノードの文字列
誤: 10億個の文字列
正: 10億個のノードの文字列
451デフォルトの名無しさん
2020/06/17(水) 01:21:46.64ID:6+sJE+by >>440
>N はわかったんだけど、 M もやっぱり最悪ケースの話ってことで合ってる?
>「通常はO(1)」って言ってるし。
ハッシュ値の値の種類が仮に1024個だとすると、
データの個数がMが1024に収まる範囲だと検索時間が増えないのでO(1)と言えます。
しかし、Mが、1024*1024 個になった場合、1つのハッシュ値あたり、1024個の
キーが入ってしまう事になりますので、Mが1024個の時に比べて検索時間は1024倍に
なります。
これも、Mがある範囲内ではO(1)と言えますが、Mが極端に大きいと、やはり、O(M)となりますね。
>N はわかったんだけど、 M もやっぱり最悪ケースの話ってことで合ってる?
>「通常はO(1)」って言ってるし。
ハッシュ値の値の種類が仮に1024個だとすると、
データの個数がMが1024に収まる範囲だと検索時間が増えないのでO(1)と言えます。
しかし、Mが、1024*1024 個になった場合、1つのハッシュ値あたり、1024個の
キーが入ってしまう事になりますので、Mが1024個の時に比べて検索時間は1024倍に
なります。
これも、Mがある範囲内ではO(1)と言えますが、Mが極端に大きいと、やはり、O(M)となりますね。
452デフォルトの名無しさん
2020/06/17(水) 02:05:09.95ID:6+sJE+by 補足しておくと、>>435で
>ハッシュを遣わなくて単純に比較した場合は、
>O(MN)
と書きましたが、ハッシュを使わない場合でもキーがランダムに近い場合、ここまで悪くなくて
検索時間は、O(M) 程度で済みます。
なぜかというとキーの文字数Nが長くなっても、比較は先頭の方の文字をいくつか調べる
だけで異なることが分かってしまうことが多いためです。
少し複雑ですが、この事情は、文字数Nを大きくしても余り変わりませんが、
Nを固定して、データの個数Mを大きくしていった場合、だんだんと文字列を長く調査しないと
判断が付かないケースが増えてきます。
そのため、O(M^2)のような傾向が出てくるはずです。
ただし、これは、ハッシュを使わない場合で、かつ、キーがランダムの場合です。
>ハッシュを遣わなくて単純に比較した場合は、
>O(MN)
と書きましたが、ハッシュを使わない場合でもキーがランダムに近い場合、ここまで悪くなくて
検索時間は、O(M) 程度で済みます。
なぜかというとキーの文字数Nが長くなっても、比較は先頭の方の文字をいくつか調べる
だけで異なることが分かってしまうことが多いためです。
少し複雑ですが、この事情は、文字数Nを大きくしても余り変わりませんが、
Nを固定して、データの個数Mを大きくしていった場合、だんだんと文字列を長く調査しないと
判断が付かないケースが増えてきます。
そのため、O(M^2)のような傾向が出てくるはずです。
ただし、これは、ハッシュを使わない場合で、かつ、キーがランダムの場合です。
453デフォルトの名無しさん
2020/06/17(水) 06:19:39.75ID:y8i+/mqG454デフォルトの名無しさん
2020/06/17(水) 06:22:30.70ID:y8i+/mqG >>442
左辺値参照を何だと思っている?
&tempは左辺値参照に渡せないし
tempを左辺値参照に渡したところで
forのブレースを抜けるたびにtempのdurationが満了していて
破棄済みのオブジェクト痕跡への参照になるだけだ
左辺値参照を何だと思っている?
&tempは左辺値参照に渡せないし
tempを左辺値参照に渡したところで
forのブレースを抜けるたびにtempのdurationが満了していて
破棄済みのオブジェクト痕跡への参照になるだけだ
455デフォルトの名無しさん
2020/06/17(水) 06:25:00.03ID:3yTyzYma 読み違えてたスマンコorz
キーというのは検索する文字列そのものを指していたのかそうか…。n_
一方>>446-447は
キー = ハッシュキー
ハッシュ = ハッシュキー
N = ハッシュキーの長さ
の意味で書いていた、、、。...n_
キーというのは検索する文字列そのものを指していたのかそうか…。n_
一方>>446-447は
キー = ハッシュキー
ハッシュ = ハッシュキー
N = ハッシュキーの長さ
の意味で書いていた、、、。...n_
456デフォルトの名無しさん
2020/06/17(水) 08:27:10.85ID:y8i+/mqG つーかそれ以前の問題で左辺値参照はdefault constructibleでないので
そもそもvectorの要素になれない
そもそもvectorの要素になれない
457デフォルトの名無しさん
2020/06/17(水) 10:02:38.14ID:Q2+1ZVNa458デフォルトの名無しさん
2020/06/17(水) 10:38:40.12ID:GES6ctGC 富豪ですね判ります
459はちみつ餃子 ◆8X2XSCHEME
2020/06/17(水) 11:38:12.26ID:3iRpcXWU >>456
今の C++ (C++11 以降) だと vector の要素に求める要件 (requirements) の中に DefaultConstructible は無いよ。
各メンバ関数 (コンストラクタも含む) の要件として要素が DefaultConstructible であることを要求するものはあるけど。
アロケータの方の要件で参照はダメってことになってるみたいなんで参照が駄目には違いないんだけど、
DefaultConstructible でないというのは直接の理由ではない。
今の C++ (C++11 以降) だと vector の要素に求める要件 (requirements) の中に DefaultConstructible は無いよ。
各メンバ関数 (コンストラクタも含む) の要件として要素が DefaultConstructible であることを要求するものはあるけど。
アロケータの方の要件で参照はダメってことになってるみたいなんで参照が駄目には違いないんだけど、
DefaultConstructible でないというのは直接の理由ではない。
460デフォルトの名無しさん
2020/06/17(水) 11:50:02.38ID:yIGLezdW &&はテンプレートでは左辺にも右辺にもなる
461デフォルトの名無しさん
2020/06/17(水) 13:02:53.13ID:6+sJE+by >>452
すみません、
>そのため、O(M^2)のような傾向が出てくるはずです。
これは忘れてください。
ハッシュを使わない場合の話ですが、Mが大きくなってもこのような傾向は出ず、
O(M)のままだと思われます。
なぜなら、同じハッシュ値に属するそれぞれのキーと、与えられたキーとの完全一致を
検査する際、何文字目で一致し無い事が分かるかについては、データの個数Mが大きく
なっても、その期待値は変化しないと考えられるためです。
つまり、完全一致検査時に、個々のキーとの完全一致検査をループして行う時、
1つずつのキーと与えられたキーとが一致し無い事が分かるまでに検査が必要な
先頭からの文字数の平均値は、データの個数が多くなっても変化しないと考えられます。
そのため、この検査に必要なトータル時間は、α・M のようになり、
αが定数になるため、記号で書けば O(M) となります。
すみません、
>そのため、O(M^2)のような傾向が出てくるはずです。
これは忘れてください。
ハッシュを使わない場合の話ですが、Mが大きくなってもこのような傾向は出ず、
O(M)のままだと思われます。
なぜなら、同じハッシュ値に属するそれぞれのキーと、与えられたキーとの完全一致を
検査する際、何文字目で一致し無い事が分かるかについては、データの個数Mが大きく
なっても、その期待値は変化しないと考えられるためです。
つまり、完全一致検査時に、個々のキーとの完全一致検査をループして行う時、
1つずつのキーと与えられたキーとが一致し無い事が分かるまでに検査が必要な
先頭からの文字数の平均値は、データの個数が多くなっても変化しないと考えられます。
そのため、この検査に必要なトータル時間は、α・M のようになり、
αが定数になるため、記号で書けば O(M) となります。
462デフォルトの名無しさん
2020/06/19(金) 05:28:33.37ID:LA4wBl0H windowsのフラットデザインのほうのuiですが、これがC#というやつですか?すごく起動が遅い
463デフォルトの名無しさん
2020/06/19(金) 09:08:14.85ID:rQKhbTAp464デフォルトの名無しさん
2020/06/19(金) 09:47:56.41ID:LA4wBl0H465デフォルトの名無しさん
2020/06/19(金) 23:16:25.19ID:c7VHi+F3 C++の仕様になぜGUIがない
言語が強制すればOSが統一できるのに
言語が強制すればOSが統一できるのに
466デフォルトの名無しさん
2020/06/19(金) 23:21:04.03ID:0XxGPvOp 幻想だよ
467はちみつ餃子 ◆8X2XSCHEME
2020/06/20(土) 01:10:58.81ID:OUofN66X468デフォルトの名無しさん
2020/06/20(土) 01:14:26.54ID:QdbcnniD GUIなんて流行ですぐ方法論も見た目もかわっちまうからな
20年ぐらい前ならウィンドウに必ずクローズボタンがあるみたいなの
必須だったろうけど、今のGUI設計でそんな前提の設計したら
「脳味噌20年前でとまっとるんか」いわれるのがオチ
スクロールバーとかもどんどん消えてるよな
20年ぐらい前ならウィンドウに必ずクローズボタンがあるみたいなの
必須だったろうけど、今のGUI設計でそんな前提の設計したら
「脳味噌20年前でとまっとるんか」いわれるのがオチ
スクロールバーとかもどんどん消えてるよな
469デフォルトの名無しさん
2020/06/20(土) 01:28:11.81ID:YEdOsyO1 まぁ上っ面をなぞるだけの平凡なGUIでもC++で規定してくれたら嬉しいけどねぇ
OSによらず同じC++のコードだけで簡単なGUIを出せるってなると色々捗る気はする
OSによらず同じC++のコードだけで簡単なGUIを出せるってなると色々捗る気はする
470デフォルトの名無しさん
2020/06/20(土) 02:01:25.69ID:Zc+p+3CN そろそろ音声ユーザーインターフェイスはよ
471デフォルトの名無しさん
2020/06/20(土) 03:39:21.03ID:ASLg4tM8472デフォルトの名無しさん
2020/06/20(土) 03:43:42.23ID:s3zB5lV1473デフォルトの名無しさん
2020/06/20(土) 03:44:49.57ID:s3zB5lV1474デフォルトの名無しさん
2020/06/20(土) 03:58:41.18ID:s3zB5lV1 もしそんなものを定義してしまったら、処理系を開発する会社が完全なる下請けになるじゃないか。
475デフォルトの名無しさん
2020/06/20(土) 06:11:52.19ID:tz6HL6iw GUIやデータ構造に関しては現行はXMLに統一って流れじゃないかね
当然重くなるけど今はマシンパワーでカバーする感じ
そのうちXMLパーサーがハード化されてストレスなくなるだろうよ
当然重くなるけど今はマシンパワーでカバーする感じ
そのうちXMLパーサーがハード化されてストレスなくなるだろうよ
476デフォルトの名無しさん
2020/06/20(土) 06:55:31.33ID:8i84u99i >>472-474
標準って何のためにあると思う?
標準って何のためにあると思う?
477デフォルトの名無しさん
2020/06/20(土) 07:21:58.33ID:v44POU7a PythonとC++でI/Oの速度って変わるの?
478デフォルトの名無しさん
2020/06/20(土) 08:17:17.83ID:3c7Ygm0n 変わるよ
亀と兎くらい
亀と兎くらい
479デフォルトの名無しさん
2020/06/20(土) 08:19:37.12ID:v44POU7a >>478
システムコール呼ぶだけなのになんで違うん?
システムコール呼ぶだけなのになんで違うん?
480デフォルトの名無しさん
2020/06/20(土) 08:25:37.47ID:3c7Ygm0n ゴールを呼ぶまでに差が生まれる
481デフォルトの名無しさん
2020/06/20(土) 09:06:19.16ID:v44POU7a んな変わらんってことねサンキュー
>>469
java の awt レベルでいいから欲しいですねえ
java の awt レベルでいいから欲しいですねえ
483デフォルトの名無しさん
2020/06/20(土) 10:14:39.22ID:huVEvmBy C++標準でも外部でも良いから簡単な記述で簡素なGUI作れるようになってほしいなあ
484デフォルトの名無しさん
2020/06/20(土) 11:25:01.67ID:DAim0Dxd >>477
測定するのが基本
測定するのが基本
485デフォルトの名無しさん
2020/06/20(土) 11:59:28.75ID:bxmHAIN3 ファイルシステムなんかは事実上ほぼ仕様が枯れてきてるから標準化できたけど
この意味GUIはまだ枯れてないからな
この意味GUIはまだ枯れてないからな
486デフォルトの名無しさん
2020/06/20(土) 12:00:20.85ID:p75lHsHl487デフォルトの名無しさん
2020/06/20(土) 12:01:02.76ID:bxmHAIN3 エンドユーザーがC++とはアプリの外見のことだなんて誤解するようになるのはやだね
488デフォルトの名無しさん
2020/06/20(土) 12:05:52.12ID:u8LBLBzP 既存のどのGUIを基本にするかってだけで宗教論争起こすだろ
489デフォルトの名無しさん
2020/06/20(土) 12:10:58.69ID:C5g3kKFk 外見くらい好きに作らせろ
490デフォルトの名無しさん
2020/06/20(土) 12:12:20.45ID:6XSjyfFJ こいうのは一種の中二病だよね
実際やってみれば
細かい制御ができない大雑把仕様
か
大掛かりなオレオレ仕様で学習が困難
ってなるのがオチ
おっさんになればわかる
実際やってみれば
細かい制御ができない大雑把仕様
か
大掛かりなオレオレ仕様で学習が困難
ってなるのがオチ
おっさんになればわかる
491デフォルトの名無しさん
2020/06/20(土) 12:17:29.80ID:hTyaQ2gm492デフォルトの名無しさん
2020/06/20(土) 12:25:31.96ID:6XSjyfFJ 可能性あるとしたらwebkitを共通仕様にするって線かな
でかすぎるけどね
でかすぎるけどね
493デフォルトの名無しさん
2020/06/20(土) 12:35:51.45ID:hTyaQ2gm フルスペックのGUIフレームワークではなく、ちょっとしたテストやデバッグに役立つ程度の簡素なものでもあると嬉しいんだけどね。
494デフォルトの名無しさん
2020/06/20(土) 12:38:41.23ID:s3zB5lV1 >>493
Windows使えや。
Windows使えや。
495デフォルトの名無しさん
2020/06/20(土) 13:10:07.38ID:s3zB5lV1 規格を統一するとgcc/clangのような無料コンパイラと差異がなくなってしまうため、MSはC++を主流サポートから外してしまって結果的にC++は落ち目となった。
GUIまで統一したら、今度こそC++は完全に見捨てられよう。
そうなったらWindows支配も終わるかもしれないが、プログラマには大混乱が起きる。
GUIまで統一したら、今度こそC++は完全に見捨てられよう。
そうなったらWindows支配も終わるかもしれないが、プログラマには大混乱が起きる。
496デフォルトの名無しさん
2020/06/20(土) 13:12:32.66ID:s3zB5lV1 >>495
GUI統一の動きがあっても、MSはサポートせずに、MingWだけがサポートする可能性がある。
Qtも自分のアドバンテージがなくなるのでサポートするわけなかろうし。
clangはAppleなのだからiOSやMacに支障を来たすためサポートしないだろう。
結果、gccだけがサポートする変な仕様として終わる。
GUI統一の動きがあっても、MSはサポートせずに、MingWだけがサポートする可能性がある。
Qtも自分のアドバンテージがなくなるのでサポートするわけなかろうし。
clangはAppleなのだからiOSやMacに支障を来たすためサポートしないだろう。
結果、gccだけがサポートする変な仕様として終わる。
497デフォルトの名無しさん
2020/06/20(土) 13:18:22.13ID:s3zB5lV1 それに、gccには既にGTKがあり、彼らの中では統一規格になっている。
それが彼らの中では世界標準である。
それが彼らの中では世界標準である。
498デフォルトの名無しさん
2020/06/20(土) 13:30:02.11ID:u8LBLBzP c++ってMSの主流じゃね?
C#の方がおこぼれっぽい
C#の方がおこぼれっぽい
499デフォルトの名無しさん
2020/06/20(土) 13:33:04.69ID:aXUmPW3Z またこのキチガイかよ…
連投する度に頭ん中に新しいお花畑でも作ってんのか?
連投する度に頭ん中に新しいお花畑でも作ってんのか?
500デフォルトの名無しさん
2020/06/20(土) 13:46:04.14ID:hTyaQ2gm すでにお花畑に埋もれているんだろう
501デフォルトの名無しさん
2020/06/20(土) 16:36:26.09ID:/Eg/RpNH カーネルがC#になる。
502デフォルトの名無しさん
2020/06/20(土) 18:44:23.71ID:bxmHAIN3 どんどんゴミ化していくWin10の究極奥義か
503デフォルトの名無しさん
2020/06/20(土) 20:16:12.65ID:+Wzjt0fO Win10Update作成者本人もなんで領域がRAWになるかわからないとかいう更新入れたくないよなというか強制だし
504デフォルトの名無しさん
2020/06/21(日) 00:11:33.65ID:Rbk+jGca WSL2だけ欲しいけど2004は怖くて入れられない
505デフォルトの名無しさん
2020/06/21(日) 09:18:33.28ID:KK75twmS >>475
みんな結局JSON使ってる気がする
みんな結局JSON使ってる気がする
506デフォルトの名無しさん
2020/06/21(日) 09:36:46.75ID:Pcgk88Ti XMLは実際に扱ってみればわかるが
自由度が高すぎるが故にパーシングがめっちゃ重い
手作業で変更とかされるとなんだかよくわからない
エラーで読めなくなることがあって難儀することが
まれによくある
タグで括るという無駄の多い構造のため必要な保存
情報のサイズに比してファイルサイズがやたらと
でかくなる
等々ロクなことがない
自由度が高すぎるが故にパーシングがめっちゃ重い
手作業で変更とかされるとなんだかよくわからない
エラーで読めなくなることがあって難儀することが
まれによくある
タグで括るという無駄の多い構造のため必要な保存
情報のサイズに比してファイルサイズがやたらと
でかくなる
等々ロクなことがない
507デフォルトの名無しさん
2020/06/21(日) 09:42:48.12ID:9qR4cBA5 だな
508デフォルトの名無しさん
2020/06/21(日) 22:56:51.71ID:WahLA6tX xmlnsの扱いがめんどい
509デフォルトの名無しさん
2020/06/22(月) 12:33:37.61ID:Uhqw9X2e boost::property_treeで使える範囲にしとくんだろうね。
510デフォルトの名無しさん
2020/06/22(月) 12:34:51.35ID:pJzisI2b N4713のD.8にuncaught_exceptionがあるんだけど、理由はなんで?
>>379が言ってたようなRAIIの話で
if (uncaught_exception()) terminate();
else throw system_error{...};
みたいなことすんなってこと?
>>379が言ってたようなRAIIの話で
if (uncaught_exception()) terminate();
else throw system_error{...};
みたいなことすんなってこと?
511デフォルトの名無しさん
2020/06/22(月) 12:54:18.39ID:GQVtnPwK XMLよりJSONのほうが容量小さくなるが、それでも今作ってるアプリではJSONも容量が大きすぎた
けっきょくCSVに落ち着いたわ
けっきょくCSVに落ち着いたわ
512デフォルトの名無しさん
2020/06/22(月) 14:19:48.28ID:fPKoMQb1513デフォルトの名無しさん
2020/06/22(月) 17:24:35.40ID:lBtyUm6f perlってpythonと比べたら10倍近く速くなかったっけ?
514デフォルトの名無しさん
2020/06/22(月) 17:37:29.72ID:KMeLbKpH 時と場合と環境とタイミングとプログラムとコンテキストによる
515デフォルトの名無しさん
2020/06/22(月) 18:03:57.06ID:JXDt+qCb >>483
Tcl/Tk
Tcl/Tk
516デフォルトの名無しさん
2020/06/22(月) 18:06:29.92ID:JXDt+qCb >>497
GTKは糞
GTKは糞
517デフォルトの名無しさん
2020/06/22(月) 18:08:18.53ID:5VJoOXgM ティックルティーケーと読むのかと思ったら、ティックルチンコらしいな。
その後出てきたのはグレートチンコと読むんだってな。
その後出てきたのはグレートチンコと読むんだってな。
518デフォルトの名無しさん
2020/06/22(月) 18:08:47.46ID:JXDt+qCb519デフォルトの名無しさん
2020/06/22(月) 20:55:06.18ID:jHNWxnNv520デフォルトの名無しさん
2020/06/22(月) 22:32:34.35ID:74ajGcn7 >>510
D.8 にも書いてある通り uncaught_exceptions() で同じことができるので、そっちを使えばいい。
わざわざ消してない実装が多いだろうから、たぶんまだしばらく uncaught_exception() も使えちゃうだろうね。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0619r4.html#3.7
D.8 にも書いてある通り uncaught_exceptions() で同じことができるので、そっちを使えばいい。
わざわざ消してない実装が多いだろうから、たぶんまだしばらく uncaught_exception() も使えちゃうだろうね。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0619r4.html#3.7
521デフォルトの名無しさん
2020/06/22(月) 23:25:55.80ID:xsRfWdvc まともな実装なら[[deprecated]]付けてるでしょ
522デフォルトの名無しさん
2020/06/23(火) 05:40:34.32ID:oj2a+YQY523デフォルトの名無しさん
2020/06/23(火) 10:14:52.18ID:rAKqcV1b524デフォルトの名無しさん
2020/06/23(火) 10:47:11.02ID:qPEbpbt+ constなメンバー変数ならpublicにしてもいい?
525デフォルトの名無しさん
2020/06/23(火) 10:56:31.49ID:rAKqcV1b 後で実装を変更してその変数が不要になったらどうする?
constだからといって不必要に実装を晒していいことにはならない
あくまで教科書的にはこう答えるしかないが、あとはケースバイケースで判断せよ
constだからといって不必要に実装を晒していいことにはならない
あくまで教科書的にはこう答えるしかないが、あとはケースバイケースで判断せよ
526デフォルトの名無しさん
2020/06/23(火) 11:38:38.63ID:oj2a+YQY メンバーにconstはあんまり付けないね
static constとかconstexprにするときくらい
書き込みを制限したいなら、それこそ雪駄と下駄で細かく調節できるから
static constとかconstexprにするときくらい
書き込みを制限したいなら、それこそ雪駄と下駄で細かく調節できるから
527デフォルトの名無しさん
2020/06/23(火) 19:20:38.55ID:60OAlPGb 個人のコードなら全てstruct、全てpublicで良い
仕事、共同、公開コードなら周りにあわせる
仕事、共同、公開コードなら周りにあわせる
528デフォルトの名無しさん
2020/06/23(火) 20:12:57.48ID:4z1R/L6q ランボーだな
529デフォルトの名無しさん
2020/06/23(火) 20:19:23.61ID:60OAlPGb 全て自分のコードなら
ポリシーがしっかりしていれば何の問題もない
ポリシーがしっかりしていれば何の問題もない
530デフォルトの名無しさん
2020/06/23(火) 20:22:22.86ID:rl0ysbNQ そのポリシーの帰結がpublicかstructかということだと思うが
何も考えてないのと変わらない
何も考えてないのと変わらない
531デフォルトの名無しさん
2020/06/23(火) 20:22:26.04ID:6iuxc80n 個人的には、publicにするかどうかはユーザーがアクセスする情報であるかどうかで決めればいいと思うけど
外から見える必要があるなら公開すればいいし
変数で公開するのが気持ち悪ければIsなんとかのメンバ関数作るとか
逆にユーザーが触れる必要のない情報ならconstだろうが公開すべきではない
外から見える必要があるなら公開すればいいし
変数で公開するのが気持ち悪ければIsなんとかのメンバ関数作るとか
逆にユーザーが触れる必要のない情報ならconstだろうが公開すべきではない
532デフォルトの名無しさん
2020/06/23(火) 20:24:28.42ID:60OAlPGb >>530
初心者的発想
初心者的発想
533デフォルトの名無しさん
2020/06/23(火) 20:24:40.50ID:rl0ysbNQ 正直プライベートメンバーがヘッダーから丸見えなC++の仕様はいかがなものかといつも思っている
534デフォルトの名無しさん
2020/06/23(火) 20:25:38.50ID:CqSQN5Gg ヘッダ提供している時点でユーザーに見せたくないものではないよね
隠したいならもっと本格的にやるわ
隠したいならもっと本格的にやるわ
535デフォルトの名無しさん
2020/06/23(火) 20:25:59.71ID:60OAlPGb ヘッダと実体に分けなきゃいけないのが欠点だと思う
536デフォルトの名無しさん
2020/06/23(火) 20:27:30.62ID:CqSQN5Gg でもjavaやc#みたいに一緒くたにされると、見辛いことこの上ない
537デフォルトの名無しさん
2020/06/23(火) 20:31:20.90ID:Rp8Vr+Lo >>536
テンプレートは嫌い?
テンプレートは嫌い?
>>535
それが分割コンパイルというものなのでは?
それが分割コンパイルというものなのでは?
539デフォルトの名無しさん
2020/06/23(火) 20:34:09.42ID:CqSQN5Gg templateでも長くなってきたら実装分けるだろ
普通はヘッダからさらにincludeするだけだけど、場合によっては分割コンパイルもする
普通はヘッダからさらにincludeするだけだけど、場合によっては分割コンパイルもする
540デフォルトの名無しさん
2020/06/23(火) 21:15:05.81ID:K4mymhGD >>536
そのためだけにインターフェース作ったりしてる
そのためだけにインターフェース作ったりしてる
541デフォルトの名無しさん
2020/06/23(火) 21:35:01.84ID:oj2a+YQY 数ヶ月前の自分て他人だかんな
なんでこんなアホなことしてんだとムカッ腹立ったりする
なんでこんなアホなことしてんだとムカッ腹立ったりする
542デフォルトの名無しさん
2020/06/23(火) 23:28:42.38ID:Rp8Vr+Lo543デフォルトの名無しさん
2020/06/23(火) 23:32:03.90ID:0n9/qQGG544デフォルトの名無しさん
2020/06/24(水) 05:30:51.33ID:fimjTN9U コンパイルが重いtemplateはよく分けるな
545デフォルトの名無しさん
2020/06/24(水) 07:09:07.40ID:MMfROoXz 明示的な具現化?
546デフォルトの名無しさん
2020/06/24(水) 07:16:09.73ID:+7c5yhaJ547デフォルトの名無しさん
2020/06/24(水) 07:24:43.03ID:5K2T8Wb8 標準ライブラリが分けられてないのに
どうやって分けるんだよ
使うテンプレートパラメーターがあらかじめ決まってないと実装を分けられないはずなんだが
実装を分けるってのは
コンパイル単位を分けるってことな
どうやって分けるんだよ
使うテンプレートパラメーターがあらかじめ決まってないと実装を分けられないはずなんだが
実装を分けるってのは
コンパイル単位を分けるってことな
548デフォルトの名無しさん
2020/06/24(水) 08:16:05.12ID:iulgQyvw C++のライブラリを更新するとき、新たなメンバ変数を追加するとメンバへのオフセットが
ずれてバイナリ互換性がなくなるといいますが、これを無理やりどうにかする方法って
ありますかね?
理屈上は、オフセットに影響を与えないメモリ位置に各インスタンスのメンバ変数を保持し、
参照、破棄等適宜すればいいと思いますが... ?? もしこれが可能ならば具体例とかを見たい
のですが、うまく探せませんでした。
ずれてバイナリ互換性がなくなるといいますが、これを無理やりどうにかする方法って
ありますかね?
理屈上は、オフセットに影響を与えないメモリ位置に各インスタンスのメンバ変数を保持し、
参照、破棄等適宜すればいいと思いますが... ?? もしこれが可能ならば具体例とかを見たい
のですが、うまく探せませんでした。
549デフォルトの名無しさん
2020/06/24(水) 08:46:11.21ID:MMfROoXz メンバ変数をprivateにして雪駄と下駄を用意する
メンバ変数へのアクセスを常に関数経由とすることで
オフセット等の物理的な条件で互換性が失われることを防げる
つーか、ソースコードを変更してるのにバイナリを更新しないのはおかしいだろ
Makefileのバグを疑うべき
メンバ変数へのアクセスを常に関数経由とすることで
オフセット等の物理的な条件で互換性が失われることを防げる
つーか、ソースコードを変更してるのにバイナリを更新しないのはおかしいだろ
Makefileのバグを疑うべき
550デフォルトの名無しさん
2020/06/24(水) 09:35:30.51ID:OmEqu4Is551デフォルトの名無しさん
2020/06/24(水) 11:11:37.90ID:RdcHMRga osの違いを吸収してるようなもんを作ってる場合
何でもフルチンで触らせるとそもそもの意味がなくなるわな
何でもフルチンで触らせるとそもそもの意味がなくなるわな
552デフォルトの名無しさん
2020/06/24(水) 11:43:22.15ID:6+kkBVmV >>548
python の C module の造り方
python の C module の造り方
553デフォルトの名無しさん
2020/06/24(水) 12:08:38.76ID:irp07WaX554デフォルトの名無しさん
2020/06/24(水) 12:13:38.23ID:irp07WaX >>553
追加。
Win32APIなどの手法を真似る方法もある。
OSの内部構造が修正になってもAPIは互換性を保ててる。
やりとりのための構造体は先頭の方にバイト数を入れるメンバが用意されていて、
以後のメンバの後世が変更になった場合、構造体の末尾に追加していっている。
先頭にバイト数を入れることで、個々の構造体が変化したかだけの影響を受けるため、
ライブラリ全体のバージョンが変化しても全ての関数の仕様を入れ替える必要がなくなっている。
追加。
Win32APIなどの手法を真似る方法もある。
OSの内部構造が修正になってもAPIは互換性を保ててる。
やりとりのための構造体は先頭の方にバイト数を入れるメンバが用意されていて、
以後のメンバの後世が変更になった場合、構造体の末尾に追加していっている。
先頭にバイト数を入れることで、個々の構造体が変化したかだけの影響を受けるため、
ライブラリ全体のバージョンが変化しても全ての関数の仕様を入れ替える必要がなくなっている。
555デフォルトの名無しさん
2020/06/24(水) 12:20:34.60ID:sRKtYS7k >>548
pimplでぐぐれ
pimplでぐぐれ
556548
2020/06/24(水) 16:28:24.79ID:iulgQyvw 皆さんどうもです。状況は (以下、ライブラリ -> lib アプリ -> app)
lib v1.0 リリース
app v1.0 が lib v1.0 をリンクしてビルド、リリース
lib v1.1 リリース(メンバ追加) <- 今ココ
app v1.0 クラッシュ
というわけで lib v1.1 を出すとき小細工して(でもメンバ変数相当を追加したい)
app v1.0 のクラッシュを防げないか、ということです。
とりあえず lib v1.0 には impl メンバはないです。
lib v1.0 リリース
app v1.0 が lib v1.0 をリンクしてビルド、リリース
lib v1.1 リリース(メンバ追加) <- 今ココ
app v1.0 クラッシュ
というわけで lib v1.1 を出すとき小細工して(でもメンバ変数相当を追加したい)
app v1.0 のクラッシュを防げないか、ということです。
とりあえず lib v1.0 には impl メンバはないです。
557デフォルトの名無しさん
2020/06/24(水) 16:41:30.01ID:nJwAdMhi >>555
pimplでバイナリ互換は保証できないよ
pimplでバイナリ互換は保証できないよ
558デフォルトの名無しさん
2020/06/24(水) 16:48:55.87ID:nJwAdMhi >>556
インスタンスをnewしてるのがアプリ側だったら
メンバ追加はほぼ絶望的
無理にやるとしたらメンバのアライメントの隙間に数バイトつっこむぐらい
バイナリ互換とる場合はIFはCにするのが定石だよ
(C++でやるなら上にあるとおりcomとかになって複雑になる)
よくわかってないみたいだから頭下げてアプリにビルドしなおしてもらいな
インスタンスをnewしてるのがアプリ側だったら
メンバ追加はほぼ絶望的
無理にやるとしたらメンバのアライメントの隙間に数バイトつっこむぐらい
バイナリ互換とる場合はIFはCにするのが定石だよ
(C++でやるなら上にあるとおりcomとかになって複雑になる)
よくわかってないみたいだから頭下げてアプリにビルドしなおしてもらいな
559デフォルトの名無しさん
2020/06/24(水) 17:26:36.53ID:L0Gy/Feu よく分からん
libは兎も角、appはソースあるのが普通じゃね
リンクしなおしている時点で、コンパイルからし直すのも出来るはず
ヘッダのバージョン合ってなきゃそりゃ転けるわ
libは兎も角、appはソースあるのが普通じゃね
リンクしなおしている時点で、コンパイルからし直すのも出来るはず
ヘッダのバージョン合ってなきゃそりゃ転けるわ
560デフォルトの名無しさん
2020/06/24(水) 18:00:35.46ID:irp07WaX >>558
newの変わりに、仮想関数のCreateObject()というメソッドを呼ぶ方式があるね。
newの変わりに、仮想関数のCreateObject()というメソッドを呼ぶ方式があるね。
561デフォルトの名無しさん
2020/06/24(水) 18:18:52.62ID:irp07WaX 1. Pimplの場合:
class CXxx {
public:
(メソッド群)
protected:
CImpl *pImpl;
};
2. 別解
使う側 :
class CBase {
public:
virtual CBase *CreateObject();
(メソッド群)
};
実装する側 :
class CDerived : public Base {
public:
CBase *CreateObject(); // 実際にはCDeriveの先頭アドレスをCBase*にcastしたものを返す。
(データメンバ群)
};
class CXxx {
public:
(メソッド群)
protected:
CImpl *pImpl;
};
2. 別解
使う側 :
class CBase {
public:
virtual CBase *CreateObject();
(メソッド群)
};
実装する側 :
class CDerived : public Base {
public:
CBase *CreateObject(); // 実際にはCDeriveの先頭アドレスをCBase*にcastしたものを返す。
(データメンバ群)
};
562デフォルトの名無しさん
2020/06/24(水) 18:26:04.51ID:OmEqu4Is563デフォルトの名無しさん
2020/06/24(水) 18:35:10.44ID:fimjTN9U >>547
プロジェクトの範囲内ではテンプレートパラメータが数種類に限られることも多いからそういう時には明示的インスタンス化が利用できるよ
プロジェクトの範囲内ではテンプレートパラメータが数種類に限られることも多いからそういう時には明示的インスタンス化が利用できるよ
564デフォルトの名無しさん
2020/06/24(水) 18:38:06.77ID:q+GJbQMN565デフォルトの名無しさん
2020/06/24(水) 18:57:23.17ID:irp07WaX566デフォルトの名無しさん
2020/06/24(水) 18:59:39.89ID:wsyC1+3+567デフォルトの名無しさん
2020/06/24(水) 19:01:25.53ID:QJ36Pf9n568デフォルトの名無しさん
2020/06/24(水) 19:08:20.34ID:irp07WaX >>565
すまん、こうでなくてはならなかった:
使う側:
class CBase {
public:
static CBase *CreateObject();
(メソッド群)
};
実装側:
class CDerived : public Base {
public:
(データメンバ群)
};
CBase *CBase::CreateObject() {
return new CDerived;
}
すまん、こうでなくてはならなかった:
使う側:
class CBase {
public:
static CBase *CreateObject();
(メソッド群)
};
実装側:
class CDerived : public Base {
public:
(データメンバ群)
};
CBase *CBase::CreateObject() {
return new CDerived;
}
569デフォルトの名無しさん
2020/06/24(水) 19:08:44.81ID:wsyC1+3+ >>567
実体のあるクラスをアップキャストすれば必要ねぇだろバカか
実体のあるクラスをアップキャストすれば必要ねぇだろバカか
570デフォルトの名無しさん
2020/06/24(水) 19:17:24.53ID:QJ36Pf9n 何が目的なんだか
その派生クラスのインスタンスを作りたいから、CreateObject呼ぶんだろ?
呼ぶ前に派生クラスのインスタンスが必要って、鶏と卵じゃないか
その派生クラスのインスタンスを作りたいから、CreateObject呼ぶんだろ?
呼ぶ前に派生クラスのインスタンスが必要って、鶏と卵じゃないか
571デフォルトの名無しさん
2020/06/24(水) 19:19:01.22ID:ML+2IMf2 こっそりlib差し替えとか後が怖いなーと思いましたw
572デフォルトの名無しさん
2020/06/24(水) 19:24:18.50ID:q+GJbQMN573デフォルトの名無しさん
2020/06/24(水) 19:27:44.47ID:QJ36Pf9n ヘッダにオブジェクトの中身を読み書きするinline関数有ったら危険
inlineじゃなくてもtemplateだとヤバイ
まあtemplateで実体生成されないように実装分離してたらセーフかな
inlineじゃなくてもtemplateだとヤバイ
まあtemplateで実体生成されないように実装分離してたらセーフかな
574デフォルトの名無しさん
2020/06/24(水) 19:29:28.85ID:q+GJbQMN 当然外から直接アクセスする変数は変えたらダメ
575デフォルトの名無しさん
2020/06/24(水) 19:42:58.81ID:q+GJbQMN ヘッダは基本変えない
不便ならポインタに置き換える変数1個だけ型と名前を変える
あとはライブラリ側のコードのみ変更
アクセス関数を後から増やすなら
クラスのポインタとパラメータをパラメータにしたグローバル関数にする
多少使いづらいが
互換性を考えて設計しなかったツケ
不便ならポインタに置き換える変数1個だけ型と名前を変える
あとはライブラリ側のコードのみ変更
アクセス関数を後から増やすなら
クラスのポインタとパラメータをパラメータにしたグローバル関数にする
多少使いづらいが
互換性を考えて設計しなかったツケ
576デフォルトの名無しさん
2020/06/24(水) 19:48:51.80ID:e6Wuxio/577デフォルトの名無しさん
2020/06/24(水) 21:43:18.10ID:N310/pVU 拡張した方は別の型(派生クラス)じゃあかんのか。
578デフォルトの名無しさん
2020/06/25(木) 09:10:26.77ID:TVNlb9r7579デフォルトの名無しさん
2020/06/25(木) 10:19:29.66ID:X3nsKEKb580デフォルトの名無しさん
2020/06/25(木) 10:26:19.02ID:lze6mCYp581デフォルトの名無しさん
2020/06/25(木) 12:53:57.93ID:yb+enRFi582デフォルトの名無しさん
2020/06/25(木) 18:36:00.50ID:KZb+gCmD583デフォルトの名無しさん
2020/06/25(木) 18:41:27.48ID:/eSpQqPW ヘッダは変更するの前提じゃないの?
バイナリ互換させるの前提なのだから
バイナリ互換させるの前提なのだから
584デフォルトの名無しさん
2020/06/25(木) 19:04:50.22ID:X3nsKEKb 「メンバ変数の一個をポインタに置き換える」
こともヘッダを変更するのが必須になると思うのだが。
こともヘッダを変更するのが必須になると思うのだが。
585デフォルトの名無しさん
2020/06/25(木) 19:07:11.43ID:TznTPNyN >>584
必須じゃない
必須じゃない
586デフォルトの名無しさん
2020/06/25(木) 19:13:33.80ID:g2od3l7G 実装側でアクロバットするのは無理やりバイナリ互換させる旧バージョン対応の方で良い
新バージョンの中身にあわせてヘッダを更新しておかないと、負の遺産が延々と続くことになる
新バージョンの中身にあわせてヘッダを更新しておかないと、負の遺産が延々と続くことになる
587デフォルトの名無しさん
2020/06/25(木) 19:14:44.69ID:L+/QiPNH588デフォルトの名無しさん
2020/06/25(木) 19:16:18.79ID:X3nsKEKb >>587
ええ!!??
ええ!!??
589デフォルトの名無しさん
2020/06/25(木) 19:27:44.15ID:aCPUEpAO バイナリ互換をはじめてかんがえた
って感じの人が多くて驚く
って感じの人が多くて驚く
590デフォルトの名無しさん
2020/06/25(木) 19:27:52.99ID:g2od3l7G pointerに置き換えたとして、指す先の実体の管理はどうするんだ
元々デストラクタが外部定義されてないと、デフォルトのデストラクタ呼び出しはinline化されてしまっている
元々デストラクタが外部定義されてないと、デフォルトのデストラクタ呼び出しはinline化されてしまっている
591デフォルトの名無しさん
2020/06/25(木) 19:32:44.29ID:aCPUEpAO なんでインラインだと思ったんだか
592デフォルトの名無しさん
2020/06/25(木) 19:34:45.97ID:aCPUEpAO ライブラリ作ったこと無いのかな?
593デフォルトの名無しさん
2020/06/25(木) 19:36:15.68ID:g2od3l7G いや、はじめからバイナリ互換させる前提で設計したライブラリでもない限り、小手先の対応でなんとかなる場面は物凄い限られるよ
594デフォルトの名無しさん
2020/06/25(木) 19:38:38.17ID:aCPUEpAO >>593
それは互換性を保つ技術が無いから
それは互換性を保つ技術が無いから
595デフォルトの名無しさん
2020/06/25(木) 19:41:06.01ID:aCPUEpAO メモリアラインメント調整等で発生する隙間を集めて変数として使う
っていう手もある
データ構造互換だとよくやる手法
っていう手もある
データ構造互換だとよくやる手法
596デフォルトの名無しさん
2020/06/25(木) 19:41:55.04ID:L+/QiPNH597デフォルトの名無しさん
2020/06/25(木) 19:42:42.30ID:g2od3l7G バイナリ互換前提で開発されていないから、問題が出ているんじゃないの?
appがコンパイルされた時点で、デストラクタやらコピコンやら代入やらをすべて明示的に外部定義していないと、コード中で必要に応じてデフォルトが呼ばれて、当然inline化もされてしまう
appがコンパイルされた時点で、デストラクタやらコピコンやら代入やらをすべて明示的に外部定義していないと、コード中で必要に応じてデフォルトが呼ばれて、当然inline化もされてしまう
598デフォルトの名無しさん
2020/06/25(木) 19:43:40.85ID:jUSiql3P599デフォルトの名無しさん
2020/06/25(木) 19:44:07.37ID:aCPUEpAO600デフォルトの名無しさん
2020/06/25(木) 19:45:52.88ID:aCPUEpAO ライブラリを作った事がないヤツが
ライブラリの互換性についてアドバイスしようとしてて笑える
ライブラリの互換性についてアドバイスしようとしてて笑える
601デフォルトの名無しさん
2020/06/25(木) 19:47:42.56ID:g2od3l7G ?
ライブラリ作ったことあるからこその内容だろうに
GCするとか、リークしたままOSに回収させるとかそれこそライブラリとしてあり得ない対応だろう
ライブラリ作ったことあるからこその内容だろうに
GCするとか、リークしたままOSに回収させるとかそれこそライブラリとしてあり得ない対応だろう
602デフォルトの名無しさん
2020/06/25(木) 19:51:39.44ID:aCPUEpAO なんでデストラクタがインラインだと思うんだ?
603デフォルトの名無しさん
2020/06/25(木) 19:55:22.62ID:g2od3l7G デフォルトだとinlineのデストラクタが生成されるのがc++の仕様だろ
じゃないと単なるプレーンな構造体でもデストラクタの呼び出しするはめになる
じゃないと単なるプレーンな構造体でもデストラクタの呼び出しするはめになる
604デフォルトの名無しさん
2020/06/25(木) 20:01:17.97ID:aCPUEpAO クラスをライブラリ化するのにメンバ関数がインライン?
ご冗談を
ご冗談を
605デフォルトの名無しさん
2020/06/25(木) 20:02:21.68ID:aCPUEpAO デストラクタがインラインなら>>595
606デフォルトの名無しさん
2020/06/25(木) 20:05:18.94ID:g2od3l7G バイナリ互換想定してないなら、inlineしない方が稀じゃね
全部外部定義だと、高速化の妨げになるじゃないか
世の中のc++用ライブラリを見てみれば良いさ
inlineが無いどころかheader onlyが幅を利かせている
全部外部定義だと、高速化の妨げになるじゃないか
世の中のc++用ライブラリを見てみれば良いさ
inlineが無いどころかheader onlyが幅を利かせている
607デフォルトの名無しさん
2020/06/25(木) 20:08:52.95ID:g2od3l7G alignmentサイズの隙間に入れたところで、コピーの時にコピーされるかどうかも不明
と言うか、単体だとまずされない
まあコピーも外部定義されていれば置き換え可能だけど
と言うか、単体だとまずされない
まあコピーも外部定義されていれば置き換え可能だけど
608デフォルトの名無しさん
2020/06/25(木) 20:10:03.10ID:L+/QiPNH >>599
そもそもバイナリ互換を考慮していないライブラリを今さら何とかしようとするウンコな発想ありきだからな。
まともなライブラリ実装者なら
「そんなクソとっとと便所に流してマトモなもの作り直せ」
としか言わんわ。
そもそもバイナリ互換を考慮していないライブラリを今さら何とかしようとするウンコな発想ありきだからな。
まともなライブラリ実装者なら
「そんなクソとっとと便所に流してマトモなもの作り直せ」
としか言わんわ。
609デフォルトの名無しさん
2020/06/25(木) 20:11:42.55ID:Y+MR3z5H >>606
テンプレートだろそれ
テンプレートだろそれ
610デフォルトの名無しさん
2020/06/25(木) 20:13:29.88ID:Y+MR3z5H >>607
コピーもインライン前提か?
コピーもインライン前提か?
611デフォルトの名無しさん
2020/06/25(木) 20:14:36.46ID:g2od3l7G inlineじゃないtemplateのヘッダオンリーでも、バイナリ互換保つの無理だよね
例えinline化されてなくても、各obj内で実体化されたtemplate関数が同一じゃないと何が起こっても文句言えない
例えinline化されてなくても、各obj内で実体化されたtemplate関数が同一じゃないと何が起こっても文句言えない
612デフォルトの名無しさん
2020/06/25(木) 20:15:41.12ID:g2od3l7G 明示的なinlineもだけど、定義せずコンパイラに任せた場合デフォルトで出来るものはinline扱いになる
613デフォルトの名無しさん
2020/06/25(木) 20:16:21.51ID:Y+MR3z5H なんでobj?
ライブラリっていってるんだからlibだろ
ライブラリっていってるんだからlibだろ
614デフォルトの名無しさん
2020/06/25(木) 20:18:38.89ID:g2od3l7G libはobjの集合だろうに
615デフォルトの名無しさん
2020/06/25(木) 20:19:42.46ID:Y+MR3z5H インライン混じりのライブラリ
ならメンバ変数を増やすのを心配する以前だろ
問題が変わってる
ならメンバ変数を増やすのを心配する以前だろ
問題が変わってる
616デフォルトの名無しさん
2020/06/25(木) 20:27:59.07ID:Y+MR3z5H >>611
だからヘッダは基本変更しない
だからヘッダは基本変更しない
617デフォルトの名無しさん
2020/06/25(木) 20:29:04.78ID:iE0yhaVV どうしても必要なことなら、
ライブラリの中にスタティックな連想配列置いて、thisアドレスをキーにして追加したいメンバ変数引くようにしたら?
トリッキーでないし確実に動く
ライブラリの中にスタティックな連想配列置いて、thisアドレスをキーにして追加したいメンバ変数引くようにしたら?
トリッキーでないし確実に動く
618デフォルトの名無しさん
2020/06/25(木) 20:29:54.44ID:g2od3l7G コピーされなきゃ良いよね
619デフォルトの名無しさん
2020/06/25(木) 20:30:23.57ID:g2od3l7G vectorで持たれてても再配置されたら困るし
620デフォルトの名無しさん
2020/06/25(木) 20:32:18.93ID:Y+MR3z5H621デフォルトの名無しさん
2020/06/25(木) 20:34:29.24ID:Y+MR3z5H 何の互換性を保ちたいのかわからなくなってきた
622デフォルトの名無しさん
2020/06/25(木) 20:42:06.05ID:N8mY4JDD 同感
623デフォルトの名無しさん
2020/06/25(木) 21:13:19.28ID:Y+MR3z5H ライブラリを使う(一部の)コードはコンパイル済みでリコンパイル出来ない
コンパイル済みのコード内で使ってるクラスのメンバ変数を追加したい
当然
クラスのサイズは変えられないし
コンパイル済みのコード内の(インライン展開されてる)関数も変えられない
どの関数がコンパイル済みコード内にあって
どの関数がライブラリ内にあるかは不明
コンパイル済みのコード内で使ってるクラスのメンバ変数を追加したい
当然
クラスのサイズは変えられないし
コンパイル済みのコード内の(インライン展開されてる)関数も変えられない
どの関数がコンパイル済みコード内にあって
どの関数がライブラリ内にあるかは不明
624デフォルトの名無しさん
2020/06/25(木) 21:14:06.17ID:Y+MR3z5H こんな感じ?
625デフォルトの名無しさん
2020/06/25(木) 21:25:58.94ID:GV91Na/E ほとんど読んでないけどID:aCPUEpAOとID:Y+MR3z5Hがド素人なのはわかった
626デフォルトの名無しさん
2020/06/25(木) 21:27:27.39ID:Y+MR3z5H はいはいwww
627デフォルトの名無しさん
2020/06/25(木) 21:32:36.99ID:GV91Na/E ヘッダの変更無しにどうやって新しい機能追加すんだよ
628デフォルトの名無しさん
2020/06/25(木) 21:39:56.91ID:Y+MR3z5H 機能を追加したいなんて言ってたか?
629デフォルトの名無しさん
2020/06/25(木) 21:40:05.85ID:GV91Na/E630デフォルトの名無しさん
2020/06/25(木) 21:46:21.80ID:Y+MR3z5H なにそのド素人発言
631デフォルトの名無しさん
2020/06/25(木) 21:47:56.11ID:GV91Na/E >>610,613,615
632デフォルトの名無しさん
2020/06/25(木) 21:49:41.84ID:GV91Na/E インスタンスで扱ってるなら暗黙定義された関数の動作が変わる可能性くらいすぐ気づけやド素人が
633デフォルトの名無しさん
2020/06/25(木) 21:58:47.71ID:W+LR7rOf ポインタで扱うとインライン関数がリコンパイル無しで変えられるって?
634デフォルトの名無しさん
2020/06/25(木) 22:01:17.65ID:W+LR7rOf ライブラリなんだから
メンバ関数は全てライブラリ側で実装するだろ普通
テンプレートとか別途リンクが不要なことが売りなライブラリならともかく
何のためのライブラリだか
メンバ関数は全てライブラリ側で実装するだろ普通
テンプレートとか別途リンクが不要なことが売りなライブラリならともかく
何のためのライブラリだか
636デフォルトの名無しさん
2020/06/25(木) 22:06:38.78ID:Q7o8gz5q てかこの要件だと>>617ですでに答え出てる気がする
637デフォルトの名無しさん
2020/06/25(木) 22:06:48.48ID:W+LR7rOf 案を出せない人間が何を言っても負け犬の遠吠え
638デフォルトの名無しさん
2020/06/25(木) 22:09:27.67ID:W+LR7rOf639デフォルトの名無しさん
2020/06/25(木) 22:11:36.08ID:W+LR7rOf640デフォルトの名無しさん
2020/06/25(木) 22:14:20.52ID:Q7o8gz5q641デフォルトの名無しさん
2020/06/25(木) 22:15:15.45ID:Q7o8gz5q642デフォルトの名無しさん
2020/06/25(木) 22:16:59.09ID:W+LR7rOf 外部から直接アクセスしない変数を置き換えるに決まってるたろ
連想配列だと
初期化順とかスレッド安全とかパフォーマンスとか
色々と心配だねえ
連想配列だと
初期化順とかスレッド安全とかパフォーマンスとか
色々と心配だねえ
643デフォルトの名無しさん
2020/06/25(木) 22:20:39.99ID:lze6mCYp644デフォルトの名無しさん
2020/06/25(木) 22:20:56.12ID:W+LR7rOf645デフォルトの名無しさん
2020/06/25(木) 22:26:37.67ID:Q7o8gz5q646デフォルトの名無しさん
2020/06/25(木) 22:26:45.54ID:W+LR7rOf647デフォルトの名無しさん
2020/06/25(木) 22:29:26.54ID:Q7o8gz5q 何言ってんだこいつ
648デフォルトの名無しさん
2020/06/25(木) 22:29:51.27ID:W+LR7rOf コンストラクタはインラインでも>>572で問題ないね
649デフォルトの名無しさん
2020/06/25(木) 22:35:32.05ID:W+LR7rOf650デフォルトの名無しさん
2020/06/25(木) 22:36:49.66ID:W+LR7rOf >>643じゃなかった
連想配列案
連想配列案
651デフォルトの名無しさん
2020/06/25(木) 22:47:52.28ID:Q7o8gz5q インラインじゃないならって、普通コンパイルオプションやnoinlineで指定してない限り、
実装が見えているメンバ関数は全てインライン展開はされうるんだぞ
そんな厳しい前提がOKなら>>645で言ったdeleteの問題だって対処できる
実装が見えているメンバ関数は全てインライン展開はされうるんだぞ
そんな厳しい前提がOKなら>>645で言ったdeleteの問題だって対処できる
652デフォルトの名無しさん
2020/06/25(木) 22:50:51.97ID:W+LR7rOf653デフォルトの名無しさん
2020/06/25(木) 22:54:30.29ID:W+LR7rOf >>651
ヘッダにない関数はインラインにしようがない
ヘッダにない関数はインラインにしようがない
654デフォルトの名無しさん
2020/06/25(木) 22:59:14.54ID:W+LR7rOf655デフォルトの名無しさん
2020/06/25(木) 23:01:53.27ID:W+LR7rOf デストラクタ問題に対応出来るのは今のところ>>595だけ
656デフォルトの名無しさん
2020/06/25(木) 23:05:32.49ID:Q7o8gz5q657デフォルトの名無しさん
2020/06/25(木) 23:06:38.16ID:Q7o8gz5q658デフォルトの名無しさん
2020/06/25(木) 23:11:48.74ID:W+LR7rOf659デフォルトの名無しさん
2020/06/25(木) 23:23:27.92ID:W+LR7rOf コンテナやスマポなど、コピーやデストラクタで処理される物の中身を少し大きくするとか
close()みたいな最後に必ず呼ばれる関数があればそこに入れ込むとか
中身がわかればもっと別の案も出るかも
close()みたいな最後に必ず呼ばれる関数があればそこに入れ込むとか
中身がわかればもっと別の案も出るかも
660デフォルトの名無しさん
2020/06/25(木) 23:30:07.30ID:W+LR7rOf >>656
速度が必要と書いてなければ速度無視が前提って...
なかなか衝撃発言ですねえ
C++なんだから組み込みのチープ環境かもしれないし
リアルタイム処理かもしれないし
もしかしたらISR内部かも
(ISRならnewも問題になるか)
速度がどうでもいい用途でいまだにC++を使うって
どんな業界かな?
速度が必要と書いてなければ速度無視が前提って...
なかなか衝撃発言ですねえ
C++なんだから組み込みのチープ環境かもしれないし
リアルタイム処理かもしれないし
もしかしたらISR内部かも
(ISRならnewも問題になるか)
速度がどうでもいい用途でいまだにC++を使うって
どんな業界かな?
661デフォルトの名無しさん
2020/06/25(木) 23:34:58.25ID:Q7o8gz5q ほんとにド素人だな・・・呆れた
662デフォルトの名無しさん
2020/06/25(木) 23:41:46.09ID:W+LR7rOf 負け宣言?
雑魚が
雑魚が
664デフォルトの名無しさん
2020/06/26(金) 07:52:12.45ID:UtOMuHDg 不変のアブストラクトクラスを作っておいて
実装はそこの派生クラスでやり
使用者はポインタで使う
実装はそこの派生クラスでやり
使用者はポインタで使う
666デフォルトの名無しさん
2020/06/26(金) 20:05:18.50ID:jgcbTaF5 糞コテ集合
667デフォルトの名無しさん
2020/06/26(金) 22:39:47.73ID:2sQMfeSo あと蟻人間とかいうやつが揃えばジャックポット
668デフォルトの名無しさん
2020/06/26(金) 22:59:40.41ID:ReyCZ0Ra よーし、みんな呼んじゃうゾ
void君、rubyガイジ、jquery房ーっ
void君、rubyガイジ、jquery房ーっ
669デフォルトの名無しさん
2020/06/27(土) 00:11:14.27ID:rOaH6R8n 蟻ははちみつが大好き。
ハチとアリは同属。
ハチとアリは同属。
670デフォルトの名無しさん
2020/06/27(土) 03:40:34.85ID:W+OG+j+5 ∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
671デフォルトの名無しさん
2020/06/27(土) 03:55:34.00ID:aqzZKmXR 心底どうでもいい
672デフォルトの名無しさん
2020/06/27(土) 10:40:14.09ID:rOaH6R8n 片山右京
673デフォルトの名無しさん
2020/06/27(土) 13:08:47.90ID:5dDNakqG 杉下右京
674デフォルトの名無しさん
2020/06/27(土) 14:16:45.56ID:rOaH6R8n 博文
675デフォルトの名無しさん
2020/06/27(土) 22:55:32.89ID:XmSaDv1W 今時のmodern c++で、マルチスレッドやるにはどうすればいいでしょうか。とりあえず今はC++17でコンパイルしてますが
1.c++20のコルーチンとコールチンライブラリを使う
2.固定スレッド数のスレッドプールなら簡単に実装できるので自分で実装、もしくは素敵なライブラリがある?
3.std::thread,std::asyncでいいや
1.c++20のコルーチンとコールチンライブラリを使う
2.固定スレッド数のスレッドプールなら簡単に実装できるので自分で実装、もしくは素敵なライブラリがある?
3.std::thread,std::asyncでいいや
677デフォルトの名無しさん
2020/06/27(土) 23:00:22.36ID:XmSaDv1W とりあえず、MSVCを使ってます
1は時期尚早?
2はMSVCだとTask Parallel Libraryがあるけど、プライオリティキューを使いたいとなるとやっぱ自前?
3はね
皆さんはどんな感じでしょうか
1は時期尚早?
2はMSVCだとTask Parallel Libraryがあるけど、プライオリティキューを使いたいとなるとやっぱ自前?
3はね
皆さんはどんな感じでしょうか
678デフォルトの名無しさん
2020/06/27(土) 23:06:40.51ID:TsX0h7IG マルチスレッドやる
がわからん
何をしたいの?
がわからん
何をしたいの?
679デフォルトの名無しさん
2020/06/27(土) 23:10:16.30ID:XmSaDv1W タスクの実行を(優先順位付きで)スケジュールしたり、キャンセルしたりしたいです
非同期処理?
なんてイエバいいのだろう
非同期処理?
なんてイエバいいのだろう
680デフォルトの名無しさん
2020/06/27(土) 23:12:59.91ID:TsX0h7IG 環境は?
681デフォルトの名無しさん
2020/06/27(土) 23:14:55.69ID:XmSaDv1W MSVCのWindowsアプリです
682デフォルトの名無しさん
2020/06/27(土) 23:24:28.13ID:TsX0h7IG MFC
Windows API
std::thread
どれでも出来るけど
求めるものは?
性能?作りやすさ?移植性?
Windows API
std::thread
どれでも出来るけど
求めるものは?
性能?作りやすさ?移植性?
683デフォルトの名無しさん
2020/06/27(土) 23:26:07.41ID:XmSaDv1W まぁ、windowsにはwin32でthread pool apiがあったり、ATLでCThreadPoolクラスみたいのがあるっぽいんですが、昔より今時の方法で..
性能はあんま気にしてません
作りやすさですね
性能はあんま気にしてません
作りやすさですね
684デフォルトの名無しさん
2020/06/27(土) 23:26:45.37ID:TsX0h7IG 普通に自作すれば?
仕様を好み通りに出来る
仕様を好み通りに出来る
685デフォルトの名無しさん
2020/06/27(土) 23:29:23.19ID:XmSaDv1W 性能はあんま気にしてませんが、テスト的にstd::threadで今は実装してますが、セマフォなりで全く制御してないのでCPU使用率がはねあがって、セマフォで制御するくらいならスレッドプールくらいは導入したいなと
686デフォルトの名無しさん
2020/06/27(土) 23:35:09.74ID:XmSaDv1W687デフォルトの名無しさん
2020/06/27(土) 23:51:55.88ID:IY07Q1dO msvcならasync使えばthread pool使われてたような
async|deferredでは問題ないけど、asyncのみだと仕様的にアウトっぽいから将来的に修正されるかもしれんが
async|deferredでは問題ないけど、asyncのみだと仕様的にアウトっぽいから将来的に修正されるかもしれんが
688デフォルトの名無しさん
2020/06/27(土) 23:55:27.13ID:TsX0h7IG プライオリティキュー
自体を既に使ってるなら
待つ仕組みだけ追加すれば良いのでは?
自体を既に使ってるなら
待つ仕組みだけ追加すれば良いのでは?
689デフォルトの名無しさん
2020/06/27(土) 23:58:18.31ID:TsX0h7IG while (1){
イベント待ち
イベントクリア
キューから取得
処理
}
----
キューに追加
イベントセット
イベント待ち
イベントクリア
キューから取得
処理
}
----
キューに追加
イベントセット
690デフォルトの名無しさん
2020/06/28(日) 00:14:46.55ID:En8ZMxKR691デフォルトの名無しさん
2020/06/28(日) 00:19:31.12ID:BWJrAYP0 while (1){
イベント待ち
イベントクリア
while (キューから取得){
処理
}
}
----
キューに追加
イベントセット
イベント待ち
イベントクリア
while (キューから取得){
処理
}
}
----
キューに追加
イベントセット
692デフォルトの名無しさん
2020/06/28(日) 00:21:59.78ID:BWJrAYP0 こうだった
std::set / less
同じプライオリティがダブらないならこれでも
std::set / less
同じプライオリティがダブらないならこれでも
693デフォルトの名無しさん
2020/06/28(日) 00:25:52.98ID:En8ZMxKR プライオリティはダブルんですけど、要素がプライオリティじゃなくて、プライオリティと例えば実行するstd::functionのペアで、このペアオブジェクトがダブらないはず
694デフォルトの名無しさん
2020/06/28(日) 00:27:09.32ID:h/QEc5EX お前は人の相談に乗れるレベルなのか?
695デフォルトの名無しさん
2020/06/28(日) 00:33:11.03ID:BWJrAYP0696デフォルトの名無しさん
2020/06/28(日) 00:42:37.03ID:En8ZMxKR >>695
unordered系しか本格的に使ったことしかないんですけど
std::pair使わずに独自ペアオブジェクトじゃだめそうだな..
std::pairをstd::shared_ptrでラップすればOKそうに見える
unordered系しか本格的に使ったことしかないんですけど
std::pair使わずに独自ペアオブジェクトじゃだめそうだな..
std::pairをstd::shared_ptrでラップすればOKそうに見える
697デフォルトの名無しさん
2020/06/28(日) 00:43:43.83ID:BWJrAYP0 lessもプライオリティとfunctionのペアってことね
同じプライオリティの処理が
キューにセットした順にはならなくなるけど
個人的には
キューにセットした回数分実行するために
multisetにしたい
同じプライオリティの処理が
キューにセットした順にはならなくなるけど
個人的には
キューにセットした回数分実行するために
multisetにしたい
698デフォルトの名無しさん
2020/06/28(日) 00:46:39.83ID:BWJrAYP0 プライオリティが多くないなら
ブライオリティ別のdequeにすれば
公平性は保たれるし比較も不要
ブライオリティ別のdequeにすれば
公平性は保たれるし比較も不要
699デフォルトの名無しさん
2020/06/28(日) 00:46:53.66ID:En8ZMxKR multisetですか、ちょっと調べてみます
700デフォルトの名無しさん
2020/06/28(日) 00:56:32.40ID:En8ZMxKR あー。multisetでいいですね。それにします。
ありがとうございます
ありがとうございます
701デフォルトの名無しさん
2020/06/28(日) 06:20:46.65ID:vMsHglGs ここまでintel TBBなし
702デフォルトの名無しさん
2020/06/28(日) 06:44:27.88ID:8Xgo7zrJ >>675
C++17ならstd::execution::parが使えるぞ
C++17ならstd::execution::parが使えるぞ
703デフォルトの名無しさん
2020/06/30(火) 18:13:09.56ID:W+MWiusu C++17を指定する#pragmaない? gccかclで
704デフォルトの名無しさん
2020/06/30(火) 20:39:19.04ID:8IN9xg77 >>703
引数じゃいかんのか?
引数じゃいかんのか?
705デフォルトの名無しさん
2020/06/30(火) 21:05:33.59ID:W+MWiusu 本当はC++17をデフォにする設定とかあればいいんだけど
探しても見つからんかった
探しても見つからんかった
706デフォルトの名無しさん
2020/06/30(火) 21:06:36.98ID:W+MWiusu 「現行規格」をデフォにできねえのおかしいだろ
作業が必要でも構わんが方法がないのは
作業が必要でも構わんが方法がないのは
707デフォルトの名無しさん
2020/06/30(火) 21:12:22.03ID:Y/VrOCax エイリアスしたらだめなの?
全然見当違いなこと言ってる?
全然見当違いなこと言ってる?
708デフォルトの名無しさん
2020/06/30(火) 21:12:29.49ID:e6PapWOV おかしいのはお前
709デフォルトの名無しさん
2020/06/30(火) 21:15:58.24ID:8IN9xg77 Makefileか*shrcにでも書いておけばいいだろ…
710デフォルトの名無しさん
2020/06/30(火) 21:15:59.68ID:64JVWZe8 あるだろ
-std=c++17
-std=c++17
711デフォルトの名無しさん
2020/06/30(火) 21:34:29.72ID:Awxu+7Gs 普通の人
オプションないのはおかしいだろ
→あるはずだから探そう
オプションないのはおかしいだろ
→あるはずだから探そう
712はちみつ餃子 ◆8X2XSCHEME
2020/06/30(火) 22:05:18.46ID:ZpGOlbch GCC なら specs に書いておくという方法もあるよ。
713デフォルトの名無しさん
2020/07/01(水) 01:50:44.15ID:Rk3KIbda GCC 11からデフォルトで17になるよ
やったね
やったね
714デフォルトの名無しさん
2020/07/01(水) 10:19:56.89ID:rbRREsWh C++で作られているモダンなマテリアル風デザインのWindows用デスクトップアプリのソースを見ると
Direct2dやGDIを駆使して自前で描画していたのですが、ここまでしないといけないものなんでしょうか…?
Direct2dやGDIを駆使して自前で描画していたのですが、ここまでしないといけないものなんでしょうか…?
715デフォルトの名無しさん
2020/07/01(水) 10:45:42.03ID:BkFpWX8v ソレがイヤなら金だして買え
C++BuilderやらMFCやら色々あるぞ
C++BuilderやらMFCやら色々あるぞ
716デフォルトの名無しさん
2020/07/01(水) 12:12:18.25ID:IfUrt5hg コンパイルオプションであるのは当たり前だけど
それだとソースとmakefileみたいに別管理になる
ソースにコメントでC++17以上とか描くくらいなら
最初からpragmaでC++17以上指定とかしたいって
自然な要求だと思うけど
それだとソースとmakefileみたいに別管理になる
ソースにコメントでC++17以上とか描くくらいなら
最初からpragmaでC++17以上指定とかしたいって
自然な要求だと思うけど
717デフォルトの名無しさん
2020/07/01(水) 12:22:38.02ID:BzwPXT9B C++17の機能を使わなきゃ良い
718デフォルトの名無しさん
2020/07/01(水) 12:30:52.21ID:IfUrt5hg 0x以前でも動くのが理想
719デフォルトの名無しさん
2020/07/01(水) 12:33:19.40ID:bZXPscHV >>714
別にそこまでしなくても良いけど自前描画は割とメリットも多い
Win32のコントロールって一つ一つは割と大きなオブジェクトだからね
それを省いて絵だけで完結させると驚くほど軽くなったりする
WinFormsに対するWPFの発想がこれ
ただしWPFは抽象化に抽象化を重ねた結果、返って重くなってしまったという産廃だが
別にそこまでしなくても良いけど自前描画は割とメリットも多い
Win32のコントロールって一つ一つは割と大きなオブジェクトだからね
それを省いて絵だけで完結させると驚くほど軽くなったりする
WinFormsに対するWPFの発想がこれ
ただしWPFは抽象化に抽象化を重ねた結果、返って重くなってしまったという産廃だが
720デフォルトの名無しさん
2020/07/01(水) 12:49:57.46ID:gL8G43CT >>716
元の質問者は引数じゃいけない、エイリアスじゃいけないとは一言も説明してないのに、回答を無視してできないのはおかしいとか言ってるから、はあ?できるだろって叩かれてるんだと思うが。
あと、プリプロセッサで指定バージョン以下のコンパイラを使ったときにエラーにすることは今でもできる。
元の質問者は引数じゃいけない、エイリアスじゃいけないとは一言も説明してないのに、回答を無視してできないのはおかしいとか言ってるから、はあ?できるだろって叩かれてるんだと思うが。
あと、プリプロセッサで指定バージョン以下のコンパイラを使ったときにエラーにすることは今でもできる。
721デフォルトの名無しさん
2020/07/01(水) 13:20:57.29ID:lJkrSuwc722デフォルトの名無しさん
2020/07/01(水) 13:24:24.14ID:lJkrSuwc そもそもpragmaは無視しても問題ないんだぞ
こんなもんで17指定してなんの意味があるんだか
こんなもんで17指定してなんの意味があるんだか
723デフォルトの名無しさん
2020/07/01(水) 20:22:39.52ID:OO2qW6bI static_assert(__cplusplus >= 201703, "C++17 or later only");
これだと、せっかくC++17できるコンパイラなのにエラーという愚かなことになるだろ
#pragmaとは言ったけど、has_includeみたいな標準に何か追加でもいいんだけど
これだと、せっかくC++17できるコンパイラなのにエラーという愚かなことになるだろ
#pragmaとは言ったけど、has_includeみたいな標準に何か追加でもいいんだけど
724デフォルトの名無しさん
2020/07/01(水) 20:35:37.32ID:8lUxucUi C++17の機能を使わないのが一番
725デフォルトの名無しさん
2020/07/01(水) 20:37:50.71ID:KhLQxxHt またABIか変わるかもしれないのにソースファイルごとに勝手にコンパイラが変わったら困るんじゃないの?
726デフォルトの名無しさん
2020/07/01(水) 21:14:42.95ID:b6g5MaOw コンパイラオプションつけるのになんの問題が
727デフォルトの名無しさん
2020/07/02(木) 04:30:05.73ID:qK+Va6mV ダメだ通じてない
728デフォルトの名無しさん
2020/07/02(木) 08:58:39.89ID:Xcy/mciM そりゃ意味ないからな
configureに準拠規格オプション探すマクロ1つ入れとけば済む話だし
configureに準拠規格オプション探すマクロ1つ入れとけば済む話だし
729デフォルトの名無しさん
2020/07/02(木) 10:53:47.11ID:qK+Va6mV // this program is C++17
と書いて手作業に期待するのを
#pragma C++17
で自動化するのは意味がないと言うのか?
自動認識はそう珍しい話ではないと思うが
と書いて手作業に期待するのを
#pragma C++17
で自動化するのは意味がないと言うのか?
自動認識はそう珍しい話ではないと思うが
730デフォルトの名無しさん
2020/07/02(木) 11:27:53.06ID:JVdKJwPF 今でもconfigure.acに
AX_CXX_COMPILE_STDCXX_17
って書くだけで済むから
AX_CXX_COMPILE_STDCXX_17
って書くだけで済むから
731デフォルトの名無しさん
2020/07/02(木) 11:40:05.93ID:JVdKJwPF 他人に巻くプログラムならビルドパッケージでどうとでもなるし
自家用ならmakefileにオプションまでベタ書きでいいし
何にこだわってるのか知らん
自家用ならmakefileにオプションまでベタ書きでいいし
何にこだわってるのか知らん
732デフォルトの名無しさん
2020/07/02(木) 12:20:13.78ID:qK+Va6mV プログラム1つのためにGCCをわざわざビルドしろだと?
おちょくってんのか
おちょくってんのか
733デフォルトの名無しさん
2020/07/02(木) 12:21:08.29ID:5hT1fktY C++17の機能を使わなきゃ良いだけ
734デフォルトの名無しさん
2020/07/02(木) 12:23:23.48ID:jaxwQaY9 素人はあれこれツール使いこなすのいやなんだよね
わかる
わかる
735デフォルトの名無しさん
2020/07/02(木) 12:27:34.40ID:Kyu9Eer8736デフォルトの名無しさん
2020/07/02(木) 12:29:59.81ID:Kyu9Eer8 今ある機能でどうとでもなることを
将来搭載されても後方互換性がなくて結局今ある機能に頼る羽目になる新機能をつけろつけろと騒がれても困りますよw
将来搭載されても後方互換性がなくて結局今ある機能に頼る羽目になる新機能をつけろつけろと騒がれても困りますよw
737デフォルトの名無しさん
2020/07/02(木) 12:30:50.81ID:qK+Va6mV 729へのリプライでそういうこと書くか?
738デフォルトの名無しさん
2020/07/02(木) 12:32:13.62ID:qK+Va6mV739デフォルトの名無しさん
2020/07/02(木) 12:39:44.74ID:Kyu9Eer8 configur.acといわれてgccをビルドするとか思っちゃう人はヒューマンステージが低いのでもっと修行してくださいwwww
740デフォルトの名無しさん
2020/07/02(木) 12:40:24.89ID:qK+Va6mV typoするほどプルプルしてんの?
741デフォルトの名無しさん
2020/07/02(木) 13:32:58.91ID:Kyu9Eer8 >>740
ミスしか突っ込めない時点で負けだよw
ミスしか突っ込めない時点で負けだよw
742デフォルトの名無しさん
2020/07/02(木) 15:38:52.42ID:Vurtjy2V ウェブ系の人にはなじみが無いかもしれないけど、C/C++のライブラリってバイナリだよ。
743デフォルトの名無しさん
2020/07/02(木) 16:22:54.35ID:fs1yx03v744デフォルトの名無しさん
2020/07/02(木) 18:12:48.64ID:O1gKlzQs Makefileに書けばいいじゃん
745デフォルトの名無しさん
2020/07/02(木) 18:31:29.81ID:pD7vCP0t 俺の環境のgccのバージョン10だぜ
746デフォルトの名無しさん
2020/07/02(木) 20:04:26.96ID:tTltJbRW >>729
Makefile なりなんなりで別管理になることを問題だと思ってるのはあなただけ。
具体的に何がどれだけの問題なのか、よく考えて示してくれないとたぶん伝わらない。
単に面倒だということなら、多くの人は新たな #pragma の仕様を定めて実装するほうが面倒だとわかるので、
それがあって当然だなどという主張にはならない。
Makefile なりなんなりで別管理になることを問題だと思ってるのはあなただけ。
具体的に何がどれだけの問題なのか、よく考えて示してくれないとたぶん伝わらない。
単に面倒だということなら、多くの人は新たな #pragma の仕様を定めて実装するほうが面倒だとわかるので、
それがあって当然だなどという主張にはならない。
747デフォルトの名無しさん
2020/07/02(木) 20:17:30.19ID:EhH78vwe コンパイラは対応する仕様決まらないままファイルの読み込み、パースをしなきゃいけないわけ?
必ず先頭行に書くとかなら未だしも
途中で現れたらどうするの?
引数で指定されているのと矛盾したらどうするの?
複数異なる指定があったら?
必ず先頭行に書くとかなら未だしも
途中で現れたらどうするの?
引数で指定されているのと矛盾したらどうするの?
複数異なる指定があったら?
748デフォルトの名無しさん
2020/07/02(木) 20:19:59.76ID:Vurtjy2V >>746
Perlのソースコードをjavacでコンパイルする事はない。
ということは、言語をソースコードの属性としたほうが良いのでは?
という考え方は理解できるかな。
一概に否定しない。
とはいえ、C++ではどっちにしろビルドシステムが必要なので、ソース内で指定できることに意義を感じない。
Perlのソースコードをjavacでコンパイルする事はない。
ということは、言語をソースコードの属性としたほうが良いのでは?
という考え方は理解できるかな。
一概に否定しない。
とはいえ、C++ではどっちにしろビルドシステムが必要なので、ソース内で指定できることに意義を感じない。
749デフォルトの名無しさん
2020/07/02(木) 20:22:38.02ID:EhH78vwe メンバ関数定義の際にクラス内の型名を使った戻り値型を先に書く場合、クラス名::戻り値型 って書かなきゃいけないくらいパーサに配慮した仕様になっているのに、そんな面倒くさい要望に対応されるとは考えにくい
750デフォルトの名無しさん
2020/07/02(木) 20:23:33.54ID:R/kQb57d 自分で作ったならバージョンわかってるやろ
ライブラリとして配布するならpkg-configでも書いとけばいい
何が問題だよ
ライブラリとして配布するならpkg-configでも書いとけばいい
何が問題だよ
751デフォルトの名無しさん
2020/07/02(木) 20:24:28.66ID:EhH78vwe 拡張子で分けるのが一番自然だよね
xxx.cc17とかxxx.17.ccとか
xxx.cc17とかxxx.17.ccとか
752デフォルトの名無しさん
2020/07/02(木) 20:24:41.75ID:R/kQb57d 標準のバージョンなんかよりたくさん環境依存あって
それを自動解決する方法はいろいろあるのだから
それを使えばなんの問題もないんだよ
それを自動解決する方法はいろいろあるのだから
それを使えばなんの問題もないんだよ
753デフォルトの名無しさん
2020/07/02(木) 20:25:20.06ID:1S4E8SKc ライブラリとして配布するのに
C++17を要求するって
使ってもらう気無いだろ
C++17を要求するって
使ってもらう気無いだろ
754デフォルトの名無しさん
2020/07/02(木) 20:27:04.96ID:Vurtjy2V ライブラリを使ってくださるお客様にC++17を用意させるのは心苦しいかもしれないな。
755デフォルトの名無しさん
2020/07/02(木) 20:27:07.52ID:EhH78vwe 今時c++17必須でも大丈夫だろ
msvcですら使い物になる程度まで対応しているんだぞ
msvcですら使い物になる程度まで対応しているんだぞ
756デフォルトの名無しさん
2020/07/02(木) 20:28:23.76ID:1S4E8SKc >>755
組み込みは未経験か?
組み込みは未経験か?
757デフォルトの名無しさん
2020/07/02(木) 20:28:44.61ID:Vurtjy2V むしろ20はよ来いと思ってますが。
758デフォルトの名無しさん
2020/07/02(木) 20:34:28.40ID:EhH78vwe 組み込みのほうがwindowsより規格対応早いくらいじゃね
まあ全部は使えないけど、それは03だろうが同じだ
むしろコンパイル時に出来ることが増えた分組み込みには新しい規格のほうが向いている
まあ全部は使えないけど、それは03だろうが同じだ
むしろコンパイル時に出来ることが増えた分組み込みには新しい規格のほうが向いている
759デフォルトの名無しさん
2020/07/02(木) 20:36:35.79ID:1S4E8SKc 小規模組み込みは未経験か?
760デフォルトの名無しさん
2020/07/02(木) 20:43:28.28ID:EhH78vwe 小規模だとコンパイラ使えるだけでも御の字
コア部分は結局アセンブリで書くし
そもそも自由にスタックすら使えなくね?
コア部分は結局アセンブリで書くし
そもそも自由にスタックすら使えなくね?
761デフォルトの名無しさん
2020/07/02(木) 20:47:32.39ID:Vurtjy2V RAM16バイトしかないしね。
無理ですわ。
無理ですわ。
762デフォルトの名無しさん
2020/07/02(木) 21:00:59.82ID:qK+Va6mV763デフォルトの名無しさん
2020/07/02(木) 21:02:30.64ID:qK+Va6mV764デフォルトの名無しさん
2020/07/02(木) 21:03:18.41ID:EhH78vwe 拡張子で区別しろよ
FORTRANを見習って
FORTRANを見習って
765デフォルトの名無しさん
2020/07/02(木) 21:03:28.33ID:qK+Va6mV >>741
737の突っ込みは見なかったことにしたいんだよね
737の突っ込みは見なかったことにしたいんだよね
766デフォルトの名無しさん
2020/07/02(木) 21:04:54.87ID:Vurtjy2V >>762
どのレス?
どのレス?
767デフォルトの名無しさん
2020/07/02(木) 21:06:16.16ID:jaxwQaY9 もうGCCビルドした?
768デフォルトの名無しさん
2020/07/02(木) 21:06:39.99ID:qK+Va6mV >>766
716
716
769デフォルトの名無しさん
2020/07/02(木) 21:07:29.63ID:qK+Va6mV >>757
禿同
禿同
770デフォルトの名無しさん
2020/07/02(木) 21:14:02.46ID:EhH78vwe 念願のconceptが
771デフォルトの名無しさん
2020/07/02(木) 21:19:01.95ID:Pm5AW70q 目的がわからなすぎて、始め何をしたいのかさっぱりわからんかった。
答えがでるたびにゴールを動かされてる気分だったわ。
コミュ障のID:qK+Va6mVが全て悪い
答えがでるたびにゴールを動かされてる気分だったわ。
コミュ障のID:qK+Va6mVが全て悪い
772デフォルトの名無しさん
2020/07/02(木) 21:24:05.51ID:qK+Va6mV ゴールを真面目に追ってくれてありがとう
773デフォルトの名無しさん
2020/07/02(木) 21:29:34.62ID://fjMSvC >>772
死ね
死ね
774デフォルトの名無しさん
2020/07/02(木) 21:45:55.51ID:Vurtjy2V まあ一通り意見が出そろったと思いますが、ISO/IEC 14882:2023への提案は、今回は見送らせていただきたいと存じます。
また何かありましたら、スレのほうまでご連絡ください。
また何かありましたら、スレのほうまでご連絡ください。
775デフォルトの名無しさん
2020/07/02(木) 22:48:32.20ID:R/kQb57d K&Rしか解さないコンパイラのためにプロトタイプ宣言したコードの先頭にCのバージョン書くか
アホらし
アホらし
776デフォルトの名無しさん
2020/07/02(木) 22:59:45.64ID:il/EZBAV extern シー
777デフォルトの名無しさん
2020/07/02(木) 23:21:51.63ID:1S4E8SKc >>763
色々とやってる
色々とやってる
778デフォルトの名無しさん
2020/07/02(木) 23:30:42.18ID:NPHwzOsK 色々とやらかしてる
779デフォルトの名無しさん
2020/07/02(木) 23:32:21.40ID:IPGZ+Gs9 範囲for文でコンテナを走査するときに要素を参照で持つかどうかふと迷った
それがパフォーマンスに影響するなら当然実測するべきだが、大概こんなもんが律速になるわけないからどっちかに決めときたい
要素を変更するなら参照、そうじゃないなら参照じゃない、でおk?
ちなみに型は指定するよりautoにした方が大抵の場合速いみたいな話あるよね?
それがパフォーマンスに影響するなら当然実測するべきだが、大概こんなもんが律速になるわけないからどっちかに決めときたい
要素を変更するなら参照、そうじゃないなら参照じゃない、でおk?
ちなみに型は指定するよりautoにした方が大抵の場合速いみたいな話あるよね?
780デフォルトの名無しさん
2020/07/02(木) 23:32:49.02ID:NPHwzOsK 質問なのですが自作アプリをソースコードでGCCをビルドして配布する場合、
テストってどうするの?
あらゆるGCCのビルド条件でテストするの??
テストってどうするの?
あらゆるGCCのビルド条件でテストするの??
782デフォルトの名無しさん
2020/07/02(木) 23:38:42.50ID:1S4E8SKc783デフォルトの名無しさん
2020/07/02(木) 23:45:17.05ID:jaxwQaY9784デフォルトの名無しさん
2020/07/03(金) 02:56:17.35ID:36TwtcUk >>780
僕はclang-cl、cl、gccで各Release/Debug、計6種のバイナリを作ってテスト通してますよ。
実際、通らないことが稀にあるので、そうゆう手順になりました。
とはいえ、ミスをしない人なら、必要ない事かも。
テストも必要ないかもしれない。
僕はclang-cl、cl、gccで各Release/Debug、計6種のバイナリを作ってテスト通してますよ。
実際、通らないことが稀にあるので、そうゆう手順になりました。
とはいえ、ミスをしない人なら、必要ない事かも。
テストも必要ないかもしれない。
785デフォルトの名無しさん
2020/07/03(金) 06:34:45.62ID:pwGjxhFH >>784
デスヨネー;
ていうかソースコードで配布したものをユーザーがautomakeでGCCをビルドする文化とか
ソフトウェアー工学的に正しくテストされてるうちに入れることが本当に可能なの??
とそこはかとなく疑問が、
デスヨネー;
ていうかソースコードで配布したものをユーザーがautomakeでGCCをビルドする文化とか
ソフトウェアー工学的に正しくテストされてるうちに入れることが本当に可能なの??
とそこはかとなく疑問が、
786デフォルトの名無しさん
2020/07/03(金) 06:42:13.15ID:pwGjxhFH もはやautomakeでGCCをビルドするレベルになると、
事はソースコードを書いた人の品質にとどまらず、
ユーザーがどのような経緯でインストールしたかわからない
野良ライブラリとか野良コンパイラの品質が絡んできてしまうま、
事はソースコードを書いた人の品質にとどまらず、
ユーザーがどのような経緯でインストールしたかわからない
野良ライブラリとか野良コンパイラの品質が絡んできてしまうま、
787703
2020/07/03(金) 07:07:39.48ID:AnL7VPS4 まあしかし結局#pragmaはないってことね
最初の質問には答えて貰えたようだ
みんなありがとう
最初の質問には答えて貰えたようだ
みんなありがとう
788デフォルトの名無しさん
2020/07/03(金) 07:59:45.22ID:9AQoDd9l CMakeとかmeson使えよ
789デフォルトの名無しさん
2020/07/03(金) 08:30:15.36ID:AnL7VPS4 いやそれは勝手にするさ
俺の状況をいちいち知らんやつに
わかってもらう必要もないし
俺の状況をいちいち知らんやつに
わかってもらう必要もないし
790デフォルトの名無しさん
2020/07/03(金) 09:00:50.39ID:mxts/vg4 無知が謎の上から目線
791デフォルトの名無しさん
2020/07/03(金) 09:02:31.13ID:mxts/vg4 gccをビルドとかなんの話だよwwww
792デフォルトの名無しさん
2020/07/03(金) 09:06:03.21ID:mxts/vg4 そもそもコンパイラは後方互換性を気にしていれば良くて
過去のコードがコンパイルできる、古い記法なら古いよとメッセージを出して終わるまでやれば良くて
将来変わるであろう規格に備えて私の知らない規格ですよと教えてあげる必要はなくエラーで落ちればそれでいい
過去のコードがコンパイルできる、古い記法なら古いよとメッセージを出して終わるまでやれば良くて
将来変わるであろう規格に備えて私の知らない規格ですよと教えてあげる必要はなくエラーで落ちればそれでいい
793デフォルトの名無しさん
2020/07/03(金) 09:24:17.78ID:AnL7VPS4 恰好つけたいんなら余計なことは言わないほうがいいぜ(クスクス
794デフォルトの名無しさん
2020/07/03(金) 09:45:48.23ID:0L14wyJb795デフォルトの名無しさん
2020/07/03(金) 09:59:43.49ID:AnL7VPS4 あれは何かおかしいのか? おまえの頭のほうが(ry
796デフォルトの名無しさん
2020/07/03(金) 10:28:37.24ID:0L14wyJb >>795
無知を指摘されただけのことを自分の事情的に言い訳して謎の上から目線へ変換してるのが頭悪すぎでしょw
無知を指摘されただけのことを自分の事情的に言い訳して謎の上から目線へ変換してるのが頭悪すぎでしょw
797デフォルトの名無しさん
2020/07/03(金) 10:45:09.88ID:AnL7VPS4 いらんものを使わんのを無知とか大きなお世話なんだよ
おまえだっていらんものは使わんだろうが、それも頭が悪いからか?
いちいちひっ絡んでくるのは何かよっぽど悔しい思いしてるんだろうな
俺は最近あんまり誰かをコテンパンにやっつけた憶えはないんだが
何か気に障ったのか?
おまえだっていらんものは使わんだろうが、それも頭が悪いからか?
いちいちひっ絡んでくるのは何かよっぽど悔しい思いしてるんだろうな
俺は最近あんまり誰かをコテンパンにやっつけた憶えはないんだが
何か気に障ったのか?
798デフォルトの名無しさん
2020/07/03(金) 10:47:55.45ID:AnL7VPS4 ずーっと前にシバイたったやつがまだ根に持ってるのかな
だとしたらキモすぎ
だとしたらキモすぎ
799デフォルトの名無しさん
2020/07/03(金) 10:59:50.18ID:0L14wyJb 他人に教えを乞うておきながら
やあご苦労的な上から目線でまとめるバカwww
匿名掲示板で根に持つも何も、一体お前誰だよwwwww
バカってホントwwww
やあご苦労的な上から目線でまとめるバカwww
匿名掲示板で根に持つも何も、一体お前誰だよwwwww
バカってホントwwww
800デフォルトの名無しさん
2020/07/03(金) 11:01:41.75ID:0L14wyJb 正体わからない場所で根に持たれてると思うってことは
同じようなことを繰り返してるんだろ?
無知を晒して指摘されてるのになんか偉そうとかwwww
あるいはココロの病気かwww
同じようなことを繰り返してるんだろ?
無知を晒して指摘されてるのになんか偉そうとかwwww
あるいはココロの病気かwww
801デフォルトの名無しさん
2020/07/03(金) 11:03:13.38ID:AnL7VPS4 787のどこが上から目線なんだよ
言いがかりはやめてもらおうか
言いがかりはやめてもらおうか
802デフォルトの名無しさん
2020/07/03(金) 11:13:37.77ID:0L14wyJb >>801
わからないなら人間関係ヤバイでしょw
わからないなら人間関係ヤバイでしょw
803デフォルトの名無しさん
2020/07/03(金) 11:14:42.94ID:0L14wyJb 散々罵倒しといてこれくらいで許したるわとかいうメダカ師匠になってるんだよwww
804デフォルトの名無しさん
2020/07/03(金) 11:19:30.11ID:AnL7VPS4805デフォルトの名無しさん
2020/07/03(金) 11:26:31.12ID:AnL7VPS4 煽ってるつもりのようだが脇甘すぎだろw
806デフォルトの名無しさん
2020/07/03(金) 12:17:55.40ID:0L14wyJb >>805
煽って他人に教えを乞うスタイルはお前だろwwww
煽って他人に教えを乞うスタイルはお前だろwwww
807デフォルトの名無しさん
2020/07/03(金) 12:19:01.99ID:AnL7VPS4808デフォルトの名無しさん
2020/07/03(金) 12:19:30.89ID:0L14wyJb 匿名掲示板で根に持たれてる自覚があるとか相当ココロの状態やばいよw
809デフォルトの名無しさん
2020/07/03(金) 12:20:19.89ID:AnL7VPS4810デフォルトの名無しさん
2020/07/03(金) 12:20:41.85ID:0L14wyJb811デフォルトの名無しさん
2020/07/03(金) 12:24:37.22ID:jbweNl0h はい次
812デフォルトの名無しさん
2020/07/03(金) 12:36:38.06ID:AnL7VPS4813デフォルトの名無しさん
2020/07/03(金) 12:38:58.29ID:oEOxZVHb814デフォルトの名無しさん
2020/07/03(金) 12:41:35.64ID:AnL7VPS4 なんか他の#pragma使ってなさそうだね
ルールを途中で変更する#pragmaは珍しくないんだが
ルールを途中で変更する#pragmaは珍しくないんだが
815デフォルトの名無しさん
2020/07/03(金) 12:48:45.85ID:oEOxZVHb まだ何がダメなのかわかってないらしい
しかし途中でコンパイラ切り変えるのは画期的だわw
しかし途中でコンパイラ切り変えるのは画期的だわw
816デフォルトの名無しさん
2020/07/03(金) 12:57:41.14ID:AnL7VPS4 コンパイラ切り変え??? 何の話をしている?
817デフォルトの名無しさん
2020/07/03(金) 13:00:50.61ID:oEOxZVHb もういいよ飽きた
818デフォルトの名無しさん
2020/07/03(金) 13:01:08.06ID:AnL7VPS4 ID変わったけど話し方が酷似している
さては、またあいつか
さては、またあいつか
819デフォルトの名無しさん
2020/07/03(金) 13:05:25.55ID:6268sYfp go は
// コメントに描いてあっても反応するから怖い
// コメントに描いてあっても反応するから怖い
820デフォルトの名無しさん
2020/07/03(金) 13:07:15.94ID:6268sYfp BOM付選んだコンパイラもあるし
コンパイルオプション選んだコンパイラもあるけど
ソースの先頭のエンコード選んだコンパイラはないんだっけ
コンパイルオプション選んだコンパイラもあるけど
ソースの先頭のエンコード選んだコンパイラはないんだっけ
821デフォルトの名無しさん
2020/07/03(金) 13:09:03.86ID:6268sYfp822デフォルトの名無しさん
2020/07/03(金) 13:15:32.85ID:AnL7VPS4 ISO/IEC14882は3年毎に改訂されることになっているんだから
今後は定期的な改定に備える計画もあって然るべきだと思う
今後は定期的な改定に備える計画もあって然るべきだと思う
823デフォルトの名無しさん
2020/07/03(金) 13:22:06.06ID:ShNCsHag 何がいったいわかったのだろう
それに勝手に他の人を認定してるしwww
相当ヤバいわw
それに勝手に他の人を認定してるしwww
相当ヤバいわw
824デフォルトの名無しさん
2020/07/03(金) 13:26:13.21ID:AnL7VPS4 推測と認定の区別がつかないやつ
実社会でも不自由してそうだな
実社会でも不自由してそうだな
825デフォルトの名無しさん
2020/07/03(金) 13:30:10.98ID:AnL7VPS4 あわよくばまぐれ当たりを狙ったようなテキトーな言葉遣いをするやつ
迫力ねえんだよ
迫力ねえんだよ
826デフォルトの名無しさん
2020/07/03(金) 13:32:31.36ID:ShNCsHag では何がわかったんだ?
ああ?
喧嘩に負けて上から目線の捨て台詞にしか見えねーんだよw
ああ?
喧嘩に負けて上から目線の捨て台詞にしか見えねーんだよw
827デフォルトの名無しさん
2020/07/03(金) 13:35:59.48ID:AnL7VPS4 ほらな
心当たりのあることを咎めてこないから全くダメージにならない
何かイヤミを言ってやろうという意図だけはわかるんだが滑りすぎ
心当たりのあることを咎めてこないから全くダメージにならない
何かイヤミを言ってやろうという意図だけはわかるんだが滑りすぎ
828デフォルトの名無しさん
2020/07/03(金) 13:53:09.64ID:BB9T+E2r ここでいつも似たような喧嘩をしている二人って毎回同じ奴らだろう。
なんだかんだ言ってお前ら仲良いな。
他のスレ住人に見せつけてくれなくていいから、よそでやれ。
なんだかんだ言ってお前ら仲良いな。
他のスレ住人に見せつけてくれなくていいから、よそでやれ。
829デフォルトの名無しさん
2020/07/03(金) 14:02:21.86ID:/+uSoVK/ 独りで客寄せのサクラだったりして
830デフォルトの名無しさん
2020/07/03(金) 14:03:03.18ID:ZGwZb8L6 ここまで酷いと自作自演にしか観えない
831デフォルトの名無しさん
2020/07/03(金) 14:06:09.04ID:AnL7VPS4 そういえば俺にひっ絡んでくるやつ
話し方というかアホさが似てると思うことはちょくちょくある
話し方というかアホさが似てると思うことはちょくちょくある
832デフォルトの名無しさん
2020/07/03(金) 14:15:34.52ID:ShNCsHag >>827
787がメダカ師匠になってることがわからないようじゃどうしようもないよw
787がメダカ師匠になってることがわからないようじゃどうしようもないよw
833デフォルトの名無しさん
2020/07/03(金) 14:49:50.97ID:Rli2dJzV まぐれ当たり来ないな
834デフォルトの名無しさん
2020/07/03(金) 15:56:25.56ID:f9zPtScu >>747
先頭行に書けばいいだけだろ
まあ使い勝手を考えてコメントを除く先頭行に書くようにすればいい
> 途中で現れたらどうするの?
エラーにすればいい
> 引数で指定されているのと矛盾したらどうするの?
どちらを優先するかを決めておけばいい
> 複数異なる指定があったら?
エラーにすればいい
よくある処理だしなんの問題もないけど?
先頭行に書けばいいだけだろ
まあ使い勝手を考えてコメントを除く先頭行に書くようにすればいい
> 途中で現れたらどうするの?
エラーにすればいい
> 引数で指定されているのと矛盾したらどうするの?
どちらを優先するかを決めておけばいい
> 複数異なる指定があったら?
エラーにすればいい
よくある処理だしなんの問題もないけど?
835デフォルトの名無しさん
2020/07/03(金) 15:58:53.44ID:36TwtcUk C++使いにしては低能過ぎるレスが多いな。
どういうことだ。
どういうことだ。
836デフォルトの名無しさん
2020/07/03(金) 16:01:05.70ID:3KYyPS1e >>782
プリミティブ型ならレジスタに乗るって思って良いんですかね?
プリミティブ型ならレジスタに乗るって思って良いんですかね?
837デフォルトの名無しさん
2020/07/03(金) 16:11:49.06ID:fxIx3skX >>836
構造体型/配列型以外のデータは原則的にレジスタには乗る。
ただし、参照と直値のどちらが効率が良いかは、レジスタに乗るかどうかだけで
決まるわけではない。
1個のレジスタに乗らなくてもレジスタ数個分ならコピーしてしまった方が
参照より速くなる場合は多い。ケースバイケースだが、レジスタ5個分とかでも
コピーした方が速い場合もある。
構造体型/配列型以外のデータは原則的にレジスタには乗る。
ただし、参照と直値のどちらが効率が良いかは、レジスタに乗るかどうかだけで
決まるわけではない。
1個のレジスタに乗らなくてもレジスタ数個分ならコピーしてしまった方が
参照より速くなる場合は多い。ケースバイケースだが、レジスタ5個分とかでも
コピーした方が速い場合もある。
838デフォルトの名無しさん
2020/07/03(金) 16:59:35.38ID:9AQoDd9l そもそもボトルネックになるのかっていう
839デフォルトの名無しさん
2020/07/03(金) 17:22:38.22ID:f9zPtScu840デフォルトの名無しさん
2020/07/03(金) 17:37:19.38ID:fxIx3skX >>839
憶測じゃなく、俺は高速化の専門家だ。
憶測じゃなく、俺は高速化の専門家だ。
841デフォルトの名無しさん
2020/07/03(金) 17:43:16.98ID:3KYyPS1e842デフォルトの名無しさん
2020/07/03(金) 17:47:39.31ID:fxIx3skX >>841
読んだから、高速化のためには、レジスタに乗るかどうかだけで決めるべきじゃないので正確にアドバイスしたが、あなたが理解できないだけだよ。
読んだから、高速化のためには、レジスタに乗るかどうかだけで決めるべきじゃないので正確にアドバイスしたが、あなたが理解できないだけだよ。
843デフォルトの名無しさん
2020/07/03(金) 17:51:37.27ID:fxIx3skX >>842
参照を使った場合、参照を介してのメンバアクセスにはコストがかかるので、
むしろ最初にコピーした方が高速になることがあるんだ。
文字列データや、巨大なバッファを持つようなものはコピーしてはいけない。
それは速度だけじゃなく、無駄なメモリー領域の確保まで必要となるため。
もしメモリー効率度外視して、バッファ確保の時間も0だと仮定してよいなら、
大きなデータであっても、参照を介してアクセスするよりもコピーした方が速いことが有る。
ただし、その場合にはキャッシュを超えない程度の場合は、という条件が付くことになる。
参照を使った場合、参照を介してのメンバアクセスにはコストがかかるので、
むしろ最初にコピーした方が高速になることがあるんだ。
文字列データや、巨大なバッファを持つようなものはコピーしてはいけない。
それは速度だけじゃなく、無駄なメモリー領域の確保まで必要となるため。
もしメモリー効率度外視して、バッファ確保の時間も0だと仮定してよいなら、
大きなデータであっても、参照を介してアクセスするよりもコピーした方が速いことが有る。
ただし、その場合にはキャッシュを超えない程度の場合は、という条件が付くことになる。
844デフォルトの名無しさん
2020/07/03(金) 17:58:05.10ID:yyYbA8Zx 引数受け渡しがクリティカルになるような状況ならinline化するかipo最適化するだろ
値だろうがconst参照だろうが、最適化されれば違いはなくなる
値だろうがconst参照だろうが、最適化されれば違いはなくなる
845デフォルトの名無しさん
2020/07/03(金) 18:00:47.69ID:36TwtcUk おまえらは王者の風格が足りない。
偽C++使いめ。
偽C++使いめ。
846デフォルトの名無しさん
2020/07/03(金) 18:10:53.48ID:fxIx3skX847デフォルトの名無しさん
2020/07/03(金) 18:16:59.50ID:3KYyPS1e848デフォルトの名無しさん
2020/07/03(金) 18:20:12.77ID:v8523RMt 違いはなくならないこともあるが
普通は無視していい
パフォーマンスが非常に重要なループなら
想像で語らないで実測が基本だし
コンテナのメンバ関数経由でアクセスすることも疑問に思わないと
普通は無視していい
パフォーマンスが非常に重要なループなら
想像で語らないで実測が基本だし
コンテナのメンバ関数経由でアクセスすることも疑問に思わないと
849デフォルトの名無しさん
2020/07/03(金) 18:28:20.50ID:v8523RMt コピーは非常に時間がかかることもある
構造体やクラスのちょっとした変更で後から増えることもある
参照は極端に速度低下することはない
確実にコピーの方が速い時だけコピーにしておいて
不明な時、判断が面倒な時は参照にしておけばいい
私の中の基本ルールが>>782
最適化が必要なら
参照かコピーかだけにとどまらないもっと大がかりな事まで考える
2択だけなんて事はしない
構造体やクラスのちょっとした変更で後から増えることもある
参照は極端に速度低下することはない
確実にコピーの方が速い時だけコピーにしておいて
不明な時、判断が面倒な時は参照にしておけばいい
私の中の基本ルールが>>782
最適化が必要なら
参照かコピーかだけにとどまらないもっと大がかりな事まで考える
2択だけなんて事はしない
850デフォルトの名無しさん
2020/07/03(金) 18:29:04.81ID:v8523RMt 関数パラメータも同じ
851デフォルトの名無しさん
2020/07/03(金) 18:30:44.76ID:33Ox5yaL アホみたいなチューニングが必要なら、そもそも範囲forを使うのやめたら?
直感と異なるかもしれんが、未だ普通のforのほうが早い。
直感と異なるかもしれんが、未だ普通のforのほうが早い。
852デフォルトの名無しさん
2020/07/03(金) 18:38:28.00ID:v8523RMt アホみたいなチューニングってのが意味不明だが
必要ならやらなきゃならん
コンテナ経由ってのがそもそも遅くなる要因
直接ポインタで扱う方が当然速度は期待できる
>>782みたいな基本ルールって
それぞれ自分の中にあると思う
それを外れる最適化がヒツヨウニなるのは極めて稀
稀であったとしても必要な時はある
必要ならやらなきゃならん
コンテナ経由ってのがそもそも遅くなる要因
直接ポインタで扱う方が当然速度は期待できる
>>782みたいな基本ルールって
それぞれ自分の中にあると思う
それを外れる最適化がヒツヨウニなるのは極めて稀
稀であったとしても必要な時はある
853デフォルトの名無しさん
2020/07/03(金) 18:39:47.81ID:yyYbA8Zx inline化してたらコピーが速いなんて事象は起こり得ないだろ
854デフォルトの名無しさん
2020/07/03(金) 18:55:06.29ID:36TwtcUk 社内報にアウトライン化による高速化事例が載ってましたが。
855デフォルトの名無しさん
2020/07/03(金) 18:58:23.70ID:BB9T+E2r856デフォルトの名無しさん
2020/07/03(金) 19:23:59.85ID:O03V1sqG >>840
自称高速化の専門家とやらの妄想は要らんよw
自称高速化の専門家とやらの妄想は要らんよw
857デフォルトの名無しさん
2020/07/03(金) 19:26:52.77ID:O03V1sqG858デフォルトの名無しさん
2020/07/03(金) 19:31:01.09ID:C0RVqI6W 高速化の専門家www
じゃあおれも
じゃあおれも
859デフォルトの名無しさん
2020/07/03(金) 19:40:17.44ID:3fEHgumK 他称なら兎も角、自称の専門家って他のことは分かりませんって意味でしかないよね
860デフォルトの名無しさん
2020/07/03(金) 19:43:24.17ID:v8523RMt 高速化の基本はアルゴリズム、データ構造
その辺の専門家が参照かコピーかみたいな小さな事を気にするのかな?
どんなコンテナとか無視して
その辺の専門家が参照かコピーかみたいな小さな事を気にするのかな?
どんなコンテナとか無視して
861デフォルトの名無しさん
2020/07/03(金) 20:07:32.86ID:36TwtcUk 他に「夏本番、キラキラ☆コーデ」というのも載ってたけど、関係なさそうだったんで読んでません。
862デフォルトの名無しさん
2020/07/03(金) 20:12:17.82ID:v8523RMt863デフォルトの名無しさん
2020/07/03(金) 20:13:28.58ID:36TwtcUk コーディネートではなくコーディングの略ということはもちろんわかっています。
とはいえ、意識の階層が違いすぎて、「あ、これ関係ねーやつだな」って。
とはいえ、意識の階層が違いすぎて、「あ、これ関係ねーやつだな」って。
864デフォルトの名無しさん
2020/07/03(金) 20:14:05.89ID:v8523RMt インラインの反対はアウトラインなのか
865蟻人間 ◆T6xkBnTXz7B0
2020/07/03(金) 20:47:01.49ID:ZXpf7qOR アウトアブライン
out-of-line
out-of-line
866デフォルトの名無しさん
2020/07/03(金) 20:47:30.73ID:36TwtcUk あ、そういえば。
インライン、アウトラインで思い出したんだけど。
むかしツタヤでDVD探してて、カシラモジ・・・カシラモジ・・・ってカ行探してたんだけど無い。
つぎイ行探しても、あれ??無いわ??ってなった。
で、ふとア行見たら・・・アタマモジかよ・・・ありました。
インライン、アウトラインで思い出したんだけど。
むかしツタヤでDVD探してて、カシラモジ・・・カシラモジ・・・ってカ行探してたんだけど無い。
つぎイ行探しても、あれ??無いわ??ってなった。
で、ふとア行見たら・・・アタマモジかよ・・・ありました。
867デフォルトの名無しさん
2020/07/03(金) 20:48:50.40ID:oEOxZVHb 陽ライン
868デフォルトの名無しさん
2020/07/03(金) 21:33:38.36ID:AnL7VPS4 高速化の専門家って当然ハードわかるよな
わかる、つーか皇帝レベル
わかる、つーか皇帝レベル
869デフォルトの名無しさん
2020/07/03(金) 21:58:20.31ID:36TwtcUk >>865
オブライアンはアイルランド系の苗字ですね。
オブライアンはアイルランド系の苗字ですね。
870デフォルトの名無しさん
2020/07/03(金) 22:43:36.42ID:95N/W1ib イ行
871デフォルトの名無しさん
2020/07/03(金) 22:53:21.02ID:36TwtcUk872デフォルトの名無しさん
2020/07/03(金) 23:55:09.00ID:2ewiuNjd873デフォルトの名無しさん
2020/07/04(土) 00:46:19.57ID:KIBH4SNT 「慶應卒の学歴なんていらない」10代起業で成功する子の共通点
https://www.excite.co.jp/news/article/President_35457/
起業で成功するキャリア形成の仕方とは? 元プロサッカー選手で起業家の鈴木啓祐氏に聞いた
https://sogyotecho.jp/career-development/
【アプリ開発で起業】必要な心得とマネタイズ方法のすべて
https://www.dreamgate.gr.jp/contents/column/application-development
学生起業家が開発、「人を軸に本を探すアプリ」とは?読書通じて「考える力」養って
https://newswitch.jp/p/20168
島田商高生がアプリ考案、発表 ICT起業家育成プログラム
https://www.at-s.com/news/article/local/central/730010.html
医師コンビが「治療用アプリ」で起業、禁煙に続き高血圧治療アプリを開発
https://diamond.jp/articles/-/229375
好きが高じて“カレー起業”、キャッシュレス決済アプリ「TOKYO MIX CURRY」の挑戦
https://diamond.jp/articles/-/215868
https://www.excite.co.jp/news/article/President_35457/
起業で成功するキャリア形成の仕方とは? 元プロサッカー選手で起業家の鈴木啓祐氏に聞いた
https://sogyotecho.jp/career-development/
【アプリ開発で起業】必要な心得とマネタイズ方法のすべて
https://www.dreamgate.gr.jp/contents/column/application-development
学生起業家が開発、「人を軸に本を探すアプリ」とは?読書通じて「考える力」養って
https://newswitch.jp/p/20168
島田商高生がアプリ考案、発表 ICT起業家育成プログラム
https://www.at-s.com/news/article/local/central/730010.html
医師コンビが「治療用アプリ」で起業、禁煙に続き高血圧治療アプリを開発
https://diamond.jp/articles/-/229375
好きが高じて“カレー起業”、キャッシュレス決済アプリ「TOKYO MIX CURRY」の挑戦
https://diamond.jp/articles/-/215868
874デフォルトの名無しさん
2020/07/04(土) 09:49:13.31ID:sAcpDZbT >>828
俺もちょいちょい喧嘩してるけど今回関係ないぞ
俺もちょいちょい喧嘩してるけど今回関係ないぞ
875デフォルトの名無しさん
2020/07/04(土) 19:16:06.20ID:rNblEJCx 浅はかな推測が外れまくったという
珍しくも何ともない現象だな
珍しくも何ともない現象だな
876デフォルトの名無しさん
2020/07/05(日) 07:47:21.10ID:3TMy8TU+ std::vectorのstd::shared_ptrを返すメソッドGetHoge()があるのですが、
for (auto e : *GetHoge())
でループすると要素があるにも関わらずループしません
auto t = GetHoge();
for (auto e : *t)
とするとループします
これは何か違いがあるのでしょうか??
MSVCです
for (auto e : *GetHoge())
でループすると要素があるにも関わらずループしません
auto t = GetHoge();
for (auto e : *t)
とするとループします
これは何か違いがあるのでしょうか??
MSVCです
877デフォルトの名無しさん
2020/07/05(日) 09:34:39.04ID:M7eGAoZB msvcならeとかtにカーソル合わせればどういう型になってるかかわかるんじゃないの
878デフォルトの名無しさん
2020/07/05(日) 10:04:45.65ID:cAnzpYmx 無駄にコストを上げる必要は無いと思う
879デフォルトの名無しさん
2020/07/05(日) 11:12:16.02ID:Sc6x6nbH イテレータ型にしなきゃいけないんじゃない?
880デフォルトの名無しさん
2020/07/05(日) 11:57:29.61ID:cm1+apW3 >>876 さんの質問への直接の答えじゃないけど、
typeid(e)::name() とかで auto の解釈を見れば何か分かるんじゃないかな。
特定の場合に auto はどのような型を生成するか、っていう
一般的な情報って言うか規則もどこかで見られるのかも知れんけど。
typeid(e)::name() とかで auto の解釈を見れば何か分かるんじゃないかな。
特定の場合に auto はどのような型を生成するか、っていう
一般的な情報って言うか規則もどこかで見られるのかも知れんけど。
881デフォルトの名無しさん
2020/07/05(日) 13:00:13.16ID:S3hYTv6M >>876
範囲for文の中ではauto&&の参照で範囲オブジェクトを束縛してくれるんだけど
上の場合は束縛されるのは*GetHoge() (=中身のvector)であって、GetHoge()の戻り値そのもの(=shared_ptr)は束縛されない
なのでshared_ptrはループに入る前に破壊されてしまって、参照カウントが0になると中身も破壊されてしまう
下の場合は戻り値のshared_ptrをtで確保してるから大丈夫ってこと
範囲for文の中ではauto&&の参照で範囲オブジェクトを束縛してくれるんだけど
上の場合は束縛されるのは*GetHoge() (=中身のvector)であって、GetHoge()の戻り値そのもの(=shared_ptr)は束縛されない
なのでshared_ptrはループに入る前に破壊されてしまって、参照カウントが0になると中身も破壊されてしまう
下の場合は戻り値のshared_ptrをtで確保してるから大丈夫ってこと
882デフォルトの名無しさん
2020/07/05(日) 13:03:35.81ID:NbYPgepr >>881
なるほど
なるほど
883デフォルトの名無しさん
2020/07/05(日) 13:16:51.38ID:wYW3xnyi C++はますます書いてあることと動作の関係を掴み難くなりつつ
あるな!
あるな!
884デフォルトの名無しさん
2020/07/05(日) 15:02:20.05ID:G8wpw7EE >>876
最初の書き方の場合、GetHoge() の戻り値は、一時オブジェクト。
一時オブジェクトの生存期間は、その部分式を含んだ完全式の終わりまでとされている。
GetHoge()が書いてある場所は、for ブロックの開始時に、最初に一度だけ評価されるが、
完全式としては、その時点で終わっている。
だから、関数戻り値の一時オブジェクトの生存期間は、forブロックに入る直前に終わってしまう。
戻り値の型は、shared_ptr<vector<T>>で、この中身を参照している shared_ptrが全て
消失した時点で中身まで deleteされる。
そのため、forブロックの中では、もはや、vector<T>が削除されてしまっているということらしいね。
2番目の書き方の場合は、shared_ptr が変数 t にコピーされているので、参照カウンタが1つ分残っている。
そのため、それが指している vector<T> のメモリブロックも削除されずに残っている。
というわけで、ループしているのに結果がおかしいというのは分かるが、全くループしない理由は余り分からない。
最初の書き方の場合、GetHoge() の戻り値は、一時オブジェクト。
一時オブジェクトの生存期間は、その部分式を含んだ完全式の終わりまでとされている。
GetHoge()が書いてある場所は、for ブロックの開始時に、最初に一度だけ評価されるが、
完全式としては、その時点で終わっている。
だから、関数戻り値の一時オブジェクトの生存期間は、forブロックに入る直前に終わってしまう。
戻り値の型は、shared_ptr<vector<T>>で、この中身を参照している shared_ptrが全て
消失した時点で中身まで deleteされる。
そのため、forブロックの中では、もはや、vector<T>が削除されてしまっているということらしいね。
2番目の書き方の場合は、shared_ptr が変数 t にコピーされているので、参照カウンタが1つ分残っている。
そのため、それが指している vector<T> のメモリブロックも削除されずに残っている。
というわけで、ループしているのに結果がおかしいというのは分かるが、全くループしない理由は余り分からない。
885デフォルトの名無しさん
2020/07/05(日) 15:10:48.51ID:0KU/lBNo >>883
バカ用じゃないってだけ
バカ用じゃないってだけ
886デフォルトの名無しさん
2020/07/05(日) 15:37:26.46ID:OSntWRwy887デフォルトの名無しさん
2020/07/05(日) 16:19:00.25ID:NbYPgepr 痛レータ
888デフォルトの名無しさん
2020/07/05(日) 16:52:53.28ID:/j2YKhHE >>883
クールパルルパクルリンパ(); ←関数
クールパルルパクルリンパ(); ←関数
889デフォルトの名無しさん
2020/07/05(日) 17:09:54.17ID:S3hYTv6M >>884
ちょっと間違ってる
範囲for文はここで書いてるように「同等な書き換え」がされて、範囲オブジェクトはここの例で言うauto&& __rangeに束縛される
https://en.cppreference.com/w/cpp/language/range-for
そして、__rangeに束縛されたものが一時オブジェクトであれば、参照束縛による寿命の延長でforブロックの終了まで生存する
だからこういうのは問題ないのよ
for(auto a: std::vector<int>{1,2,3})
あと最後に関しては破壊されたvectorを使っちゃってるから未定義動作で何が起きても文句は言えない
メチャメチャな値を取り出そうと、全くループしなかろうとその時の気まぐれよ
>>886
同意。Getという名前は不適切だな
ちょっと間違ってる
範囲for文はここで書いてるように「同等な書き換え」がされて、範囲オブジェクトはここの例で言うauto&& __rangeに束縛される
https://en.cppreference.com/w/cpp/language/range-for
そして、__rangeに束縛されたものが一時オブジェクトであれば、参照束縛による寿命の延長でforブロックの終了まで生存する
だからこういうのは問題ないのよ
for(auto a: std::vector<int>{1,2,3})
あと最後に関しては破壊されたvectorを使っちゃってるから未定義動作で何が起きても文句は言えない
メチャメチャな値を取り出そうと、全くループしなかろうとその時の気まぐれよ
>>886
同意。Getという名前は不適切だな
890デフォルトの名無しさん
2020/07/05(日) 17:14:11.09ID:G8wpw7EE >>89
こんな機能があったとは:
Temporary range expression
If range_expression returns a temporary, its lifetime is extended until the end of the loop, as indicated by binding to the forwarding reference __range, but beware that the lifetime of any temporary within range_expression is not extended.
こんな機能があったとは:
Temporary range expression
If range_expression returns a temporary, its lifetime is extended until the end of the loop, as indicated by binding to the forwarding reference __range, but beware that the lifetime of any temporary within range_expression is not extended.
891デフォルトの名無しさん
2020/07/05(日) 18:01:59.74ID:LGYlGSYG 昔はC++は複雑怪奇、C#はシンプルで分かりやすいって感じだったけれど、
今はC#の方が仕様拡張で複雑になってきて相対的に大差なくなって来てる気がする
今はC#の方が仕様拡張で複雑になってきて相対的に大差なくなって来てる気がする
892デフォルトの名無しさん
2020/07/05(日) 18:04:58.41ID:Sc6x6nbH いろいろ考えたらC++にあるアレが必要になったんだよ
アレだよアレ
わかるだろ
アレだよアレ
わかるだろ
893デフォルトの名無しさん
2020/07/05(日) 18:20:14.04ID:/j2YKhHE 本来標準ライブラリーで済むものまで言語仕様に入ってやがる
それというのも標準ライブラリーがしょぼくてかつ改善が入らん
あっちはだれがやってるんだ
それというのも標準ライブラリーがしょぼくてかつ改善が入らん
あっちはだれがやってるんだ
894デフォルトの名無しさん
2020/07/05(日) 18:31:21.12ID:wYW3xnyi895デフォルトの名無しさん
2020/07/05(日) 19:22:37.86ID:3TMy8TU+ 皆さんはありがとう御座います
GetHogeは実際はEnumHogeで内部でstd::shared_ptr<std::vector>を生成して返すメソッドです
一時的なオブジェクトで書き方の違いで結果が変わるなんて知りませんでした
とりあえず、変数に代入します
GetHogeは実際はEnumHogeで内部でstd::shared_ptr<std::vector>を生成して返すメソッドです
一時的なオブジェクトで書き方の違いで結果が変わるなんて知りませんでした
とりあえず、変数に代入します
896デフォルトの名無しさん
2020/07/05(日) 19:59:22.90ID:G8wpw7EE898デフォルトの名無しさん
2020/07/05(日) 21:12:13.70ID:wYW3xnyi ていうか
>>889
>あと最後に関しては破壊されたvectorを使っちゃってるから未定義動作で何が起きても文句は言えない
>メチャメチャな値を取り出そうと、全くループしなかろうとその時の気まぐれよ
mjd?!
{
auto t = GetHoge();
for (auto e : *t) {
... // (A)
}
// (B)
}
ならt(GetHoge()が返したshared_ptr<vector<T> >は(B)になるまで生存するから
(A)において*tの要素を参照する(auto &&)することは全く問題無いんじゃ…
>>889
>あと最後に関しては破壊されたvectorを使っちゃってるから未定義動作で何が起きても文句は言えない
>メチャメチャな値を取り出そうと、全くループしなかろうとその時の気まぐれよ
mjd?!
{
auto t = GetHoge();
for (auto e : *t) {
... // (A)
}
// (B)
}
ならt(GetHoge()が返したshared_ptr<vector<T> >は(B)になるまで生存するから
(A)において*tの要素を参照する(auto &&)することは全く問題無いんじゃ…
899デフォルトの名無しさん
2020/07/05(日) 21:15:51.36ID:wYW3xnyi 訂正orz,
誤: (B)になるまで生存する
正: 少なくとも(B)になるまでは生存する(参照カウンタが0より大の状態を保つ)
誤: (B)になるまで生存する
正: 少なくとも(B)になるまでは生存する(参照カウンタが0より大の状態を保つ)
900デフォルトの名無しさん
2020/07/05(日) 21:20:48.10ID:0KU/lBNo >>894
イヤミになってない
イヤミになってない
901デフォルトの名無しさん
2020/07/05(日) 21:24:12.71ID:wYW3xnyi902デフォルトの名無しさん
2020/07/05(日) 21:30:37.86ID:kFjTOHVy C++は局所的に動作を想像できない場合が多いのがなぁ。
バカじゃなけりゃマクロ使いまくったCコードも理解できるかというとそうじゃないだろうと。
バカじゃなけりゃマクロ使いまくったCコードも理解できるかというとそうじゃないだろうと。
903デフォルトの名無しさん
2020/07/05(日) 21:36:58.75ID:wYW3xnyi904デフォルトの名無しさん
2020/07/05(日) 21:37:43.23ID:Bskedq4a 腐った代入オペレータかかれるだけで悲惨なことになる
905デフォルトの名無しさん
2020/07/05(日) 21:42:04.47ID:wYW3xnyi (上の話に限って言えばvector<T>のTに間してどれだけ腐った代入オペレータが定義されていようとも)
別に
別に
906デフォルトの名無しさん
2020/07/05(日) 22:06:13.63ID:0KU/lBNo907デフォルトの名無しさん
2020/07/05(日) 22:08:49.40ID:0KU/lBNo しかしまあ歳は取りたくないと思ったな
全盛時の俺にはありえんことが相次いで起きている一例だった
全盛時の俺にはありえんことが相次いで起きている一例だった
908デフォルトの名無しさん
2020/07/05(日) 22:35:02.11ID:S3hYTv6M >>901
そうだよ
そうだよ
909デフォルトの名無しさん
2020/07/05(日) 23:23:07.13ID:7RTbKb77 C++のラムダって、Javaとかみたいに1文だけの場合にreturn省略できないんですかね?
[](auto a, auto b){ return a + b; } → [](auto a, auto b) { a + b } みたいな感じで。
[](auto a, auto b){ return a + b; } → [](auto a, auto b) { a + b } みたいな感じで。
910デフォルトの名無しさん
2020/07/05(日) 23:59:55.29ID:S3hYTv6M 今はムリ
検討はされてるから将来的に出来るようになるかもしれない
検討はされてるから将来的に出来るようになるかもしれない
911デフォルトの名無しさん
2020/07/06(月) 00:06:22.43ID:J5KuSvPS913はちみつ餃子 ◆8X2XSCHEME
2020/07/06(月) 05:27:19.13ID:Js6m+wFY Rust に慣れてくると C++ で return を書くのを忘れることもある。
914デフォルトの名無しさん
2020/07/06(月) 07:02:55.73ID:oajwJTo1 >>910
ありがとうございます。C++23ぐらいを期待します
ありがとうございます。C++23ぐらいを期待します
915デフォルトの名無しさん
2020/07/06(月) 07:29:08.62ID:hCVItazY916デフォルトの名無しさん
2020/07/06(月) 07:43:23.12ID:tvsN32eC >>911
my powers are weak old man.
my powers are weak old man.
917デフォルトの名無しさん
2020/07/06(月) 21:29:07.26ID:J5KuSvPS 非バカの要件にコード見た瞬間最初から全部ワカルというのが入るということは
>>894で宣言して合ったのに対し別段オブジェクションをつけるでもなく
>俺は瞬間でもないが落ち着いて追えるケースでしかない
とだけ言ったのだから彼は自ら非バカではないと告白したのである
漏れの有り様の批判に繋げられても困る
>>894で宣言して合ったのに対し別段オブジェクションをつけるでもなく
>俺は瞬間でもないが落ち着いて追えるケースでしかない
とだけ言ったのだから彼は自ら非バカではないと告白したのである
漏れの有り様の批判に繋げられても困る
918デフォルトの名無しさん
2020/07/06(月) 21:39:04.45ID:Edtf8jlD919デフォルトの名無しさん
2020/07/06(月) 22:16:12.21ID:Edtf8jlD std::vector<YYY>で返して
std::vector<YYY> XXX::EnumYYY ()
で、受け取った方で他でスマポにしようということで
auto yyy = x.EnumYYY();
auto ptr = std::make_shared<std::vector<YYY>>(std::move(yyy));
とかやればオーバーヘッド少なくスマポ作れるんです?
std::vector<YYY> XXX::EnumYYY ()
で、受け取った方で他でスマポにしようということで
auto yyy = x.EnumYYY();
auto ptr = std::make_shared<std::vector<YYY>>(std::move(yyy));
とかやればオーバーヘッド少なくスマポ作れるんです?
920デフォルトの名無しさん
2020/07/06(月) 22:36:37.36ID:J5KuSvPS 記憶管理という本来隠すべき実装の詳細(と多くの人が考える事柄)を
使う人が意識せねばならな続けるのは嫌すぐる、
使う人が意識せねばならな続けるのは嫌すぐる、
921デフォルトの名無しさん
2020/07/06(月) 23:09:10.15ID:J5KuSvPS getterがshared_ptr<T> pを返したとたん、pの寿命と*(p.get())の寿命の二重管理の責務が利用者に行く
>>876の真の原因はこれ
getterがオブジェクトのディープコピーを返したらそんな二重管理は生じないで済む
getterが仮にオブジェクトXの参照を返す仕様だとしても、Xの実体を保持するオブジェクトのY寿命と
getterを呼ぶタイミングの二重管理以上の手間にはならない
結局shared_ptr<T>を返すインターフェースは不恰好さだけが残る
>>876の真の原因はこれ
getterがオブジェクトのディープコピーを返したらそんな二重管理は生じないで済む
getterが仮にオブジェクトXの参照を返す仕様だとしても、Xの実体を保持するオブジェクトのY寿命と
getterを呼ぶタイミングの二重管理以上の手間にはならない
結局shared_ptr<T>を返すインターフェースは不恰好さだけが残る
922デフォルトの名無しさん
2020/07/07(火) 02:12:04.06ID:bKZU32Ct923デフォルトの名無しさん
2020/07/07(火) 05:32:28.01ID:Njz9GOYM >>922
2行目で述べている、利用者がしくれば危険性が生じるという事実と
1行目の「「二重管理」にはならないでしょ」という主張は矛盾してねえが、
本当に所有権の共有が必要ならshared_ptr<T>を使うのはアリだが、shared_ptr<T>が保持する
Tの実体のみに興味がある利用者に対してはshared_ptr<T>を使っていることを
クラスUで隠蔽する方が良い
Tが持っている演算を全てクラスUからTに委譲し、UをT同然に使えるようにするのがbest
そこまでやる手間が嫌という理由でUにTを返すメソッドU::get()を備えさせる簡易手段に訴えたとしても、
Uの定義だけ見れば循環参照にならないことをUの提供者が保証できるから
(Tがジェネリックな型だった場合の)Uの利用者やプログラム全体のメンテナーに地雷原を歩かせずに済むメリットがある
2行目で述べている、利用者がしくれば危険性が生じるという事実と
1行目の「「二重管理」にはならないでしょ」という主張は矛盾してねえが、
本当に所有権の共有が必要ならshared_ptr<T>を使うのはアリだが、shared_ptr<T>が保持する
Tの実体のみに興味がある利用者に対してはshared_ptr<T>を使っていることを
クラスUで隠蔽する方が良い
Tが持っている演算を全てクラスUからTに委譲し、UをT同然に使えるようにするのがbest
そこまでやる手間が嫌という理由でUにTを返すメソッドU::get()を備えさせる簡易手段に訴えたとしても、
Uの定義だけ見れば循環参照にならないことをUの提供者が保証できるから
(Tがジェネリックな型だった場合の)Uの利用者やプログラム全体のメンテナーに地雷原を歩かせずに済むメリットがある
924デフォルトの名無しさん
2020/07/07(火) 06:29:56.58ID:Njz9GOYM ちゅか明白すぎて激しく書き忘れたが、オブジェクトTのグローバルな所有権の共有が必要な場合、
shared_ptr<T>が保持するTの実体へのアクセスの排他制御を行わねばならないが
shared_ptr<T>はこの点なんのサポートもしてくれない(せいぜい自身が使う参照カウンタの排他を行うだけ
なので、Tの排他はshared_ptr<T>をwrapしたクラスUが行う必要があり、かつ行えば十分
この点一つとってもクラスUを設けずshared_ptr<T>をTの利用者に直接返す設計のダメさ加減がワカル
gdgdだ、
shared_ptr<T>が保持するTの実体へのアクセスの排他制御を行わねばならないが
shared_ptr<T>はこの点なんのサポートもしてくれない(せいぜい自身が使う参照カウンタの排他を行うだけ
なので、Tの排他はshared_ptr<T>をwrapしたクラスUが行う必要があり、かつ行えば十分
この点一つとってもクラスUを設けずshared_ptr<T>をTの利用者に直接返す設計のダメさ加減がワカル
gdgdだ、
925デフォルトの名無しさん
2020/07/07(火) 06:31:29.19ID:Tvc5gvFF926デフォルトの名無しさん
2020/07/07(火) 06:48:05.06ID:hl3O6vw8927デフォルトの名無しさん
2020/07/07(火) 07:19:57.60ID:Njz9GOYM 漏れの心の内面がC++の規格に反映されているわけでないのだから
聞くだけ無駄くね?
聞くだけ無駄くね?
928デフォルトの名無しさん
2020/07/07(火) 08:11:38.64ID:GpjZMZK2929デフォルトの名無しさん
2020/07/07(火) 08:43:44.25ID:kKeNsU/l930928
2020/07/07(火) 09:14:32.95ID:D+WevL4Y931デフォルトの名無しさん
2020/07/07(火) 12:07:28.86ID:/8q6WRwj 参照カウンタがゼロになることから
getのたびにvectorを作成しており
その管理を呼び手に委ねてることがわかる
こんなものは素直に実体を返せば良い
呼び手がスマポで管理することも出来るし
特に管理せずスコープを抜けた段階で自動で破棄することも出来る
getのたびにvectorを作成しており
その管理を呼び手に委ねてることがわかる
こんなものは素直に実体を返せば良い
呼び手がスマポで管理することも出来るし
特に管理せずスコープを抜けた段階で自動で破棄することも出来る
932デフォルトの名無しさん
2020/07/07(火) 12:43:21.61ID:D+WevL4Y933デフォルトの名無しさん
2020/07/07(火) 20:34:36.65ID:fHFPpwji 内部で管理してるオブジェクトの見せ方は色々あって難しいけど
今回の場合は新しく作ったvectorでしょ?そんなもんそのまま呼んだ奴にくれてやれよ
無駄な包装紙付けられたり、後からやっぱ俺のものとか言い出されたらウザいだろ?いらん未練残すな
今回の場合は新しく作ったvectorでしょ?そんなもんそのまま呼んだ奴にくれてやれよ
無駄な包装紙付けられたり、後からやっぱ俺のものとか言い出されたらウザいだろ?いらん未練残すな
934デフォルトの名無しさん
2020/07/08(水) 07:03:23.04ID:SF9V14yC vector自体がムブコン持ってるんだから
935デフォルトの名無しさん
2020/07/08(水) 08:37:14.85ID:qWtjrxlX この場合ムーブじゃなくてRVOな
936デフォルトの名無しさん
2020/07/08(水) 09:04:46.82ID:eJ60/BI8 >>935
「この場合」って、実装見ないとわからない話では?どっかで実装の話出てたっけ?
「この場合」って、実装見ないとわからない話では?どっかで実装の話出てたっけ?
937デフォルトの名無しさん
2020/07/08(水) 09:11:01.56ID:qWtjrxlX938デフォルトの名無しさん
2020/07/08(水) 10:07:11.80ID:SF9V14yC >>935
??? 最適化は関係ねえだろ
??? 最適化は関係ねえだろ
939デフォルトの名無しさん
2020/07/08(水) 10:18:43.63ID:eJ60/BI8 >>937 呼び出し元しか書いてないやん。
940デフォルトの名無しさん
2020/07/08(水) 10:20:00.04ID:qWtjrxlX あー、調べてみたらNRVOは未だに保証は無いのな
まぁ何にせよスマポにする理由は無い
まぁ何にせよスマポにする理由は無い
941デフォルトの名無しさん
2020/07/08(水) 10:23:29.25ID:qWtjrxlX >>938
RVOにムーブコンストラクタは要らん
RVOにムーブコンストラクタは要らん
942デフォルトの名無しさん
2020/07/08(水) 10:30:21.07ID:eJ60/BI8 これは触らないほうがよさそうだ
943デフォルトの名無しさん
2020/07/08(水) 10:33:29.86ID:SF9V14yC944デフォルトの名無しさん
2020/07/08(水) 10:36:03.62ID:qWtjrxlX945デフォルトの名無しさん
2020/07/08(水) 10:38:14.66ID:qWtjrxlX て>>934本人か
なんでコピーを除外したの?
なんでコピーを除外したの?
946デフォルトの名無しさん
2020/07/08(水) 10:48:43.23ID:SF9V14yC947デフォルトの名無しさん
2020/07/08(水) 10:55:56.92ID:qWtjrxlX 質問に答えてねーだろw
948デフォルトの名無しさん
2020/07/08(水) 11:19:20.44ID:SF9V14yC949デフォルトの名無しさん
2020/07/08(水) 11:26:59.21ID:SF9V14yC あ、もしかしてshared_ptr使ってんのにディープコピーとか言ってたコレ◎か?
950デフォルトの名無しさん
2020/07/08(水) 11:51:13.02ID:qWtjrxlX951デフォルトの名無しさん
2020/07/08(水) 11:54:26.16ID:hADFKHgu 観客へのアピールだったり警鐘だったりするんだろう本人の中では
余計なお世話かも知れないし役に立つかも知れない
余計なお世話かも知れないし役に立つかも知れない
952デフォルトの名無しさん
2020/07/08(水) 12:31:38.98ID:SF9V14yC953デフォルトの名無しさん
2020/07/08(水) 13:01:09.98ID:T5O+XOTR moveが使われるかどうか心配なら昔ながらの方法を使えば良い
これなら古い環境に移植もできる
いずれにしろスマポで返すのは余計なおせっかい
これなら古い環境に移植もできる
いずれにしろスマポで返すのは余計なおせっかい
954デフォルトの名無しさん
2020/07/08(水) 13:07:38.11ID:qWtjrxlX955デフォルトの名無しさん
2020/07/08(水) 13:37:00.65ID:SF9V14yC >>954
auto t = GetHoge();
てなことするのにshared_ptrを使うことの是非はムブコン関係あるぞ
おまえさんが気が付いてないのを責めはせんが
さっきからwだの[鏡]だのとナメた口の利き方をしてくれるな
ああそうか煽り合いに持って行ければ誤魔化せると思っているのか
auto t = GetHoge();
てなことするのにshared_ptrを使うことの是非はムブコン関係あるぞ
おまえさんが気が付いてないのを責めはせんが
さっきからwだの[鏡]だのとナメた口の利き方をしてくれるな
ああそうか煽り合いに持って行ければ誤魔化せると思っているのか
956デフォルトの名無しさん
2020/07/08(水) 13:44:29.75ID:qWtjrxlX957デフォルトの名無しさん
2020/07/08(水) 13:50:52.29ID:SF9V14yC >>956
◎がディープコピーと言い出してからの話だろ
しばらく他のやつらが泥仕合してたようだがそっちにゃ興味ねえ
前後は気にせず933の発言に同調したというだけだ
最適化だのコピコンだの俺が言ってもねえことばかりいい加減にしてくれ
◎がディープコピーと言い出してからの話だろ
しばらく他のやつらが泥仕合してたようだがそっちにゃ興味ねえ
前後は気にせず933の発言に同調したというだけだ
最適化だのコピコンだの俺が言ってもねえことばかりいい加減にしてくれ
958デフォルトの名無しさん
2020/07/08(水) 14:28:50.36ID:AWXToegO 下みたいなコードをみたんだけど、参照にするメリットってないよね?
void aaa (const int& bbb) {
ccc.ddd=bbb;
}
void aaa (const int& bbb) {
ccc.ddd=bbb;
}
959デフォルトの名無しさん
2020/07/08(水) 16:02:47.79ID:K6lGGEpK intなら無いね
960デフォルトの名無しさん
2020/07/08(水) 16:52:52.95ID:/QG168fn 初書き込みです。
初歩的な質問で申し訳ありません
Visual Studio 2008のC++を使っています。
今回、プログラムを変更したのでバージョンをあげたいのですが
アセンブリ情報がどこにあるかわかりません。
どなたかご教示願いますm(__)m
初歩的な質問で申し訳ありません
Visual Studio 2008のC++を使っています。
今回、プログラムを変更したのでバージョンをあげたいのですが
アセンブリ情報がどこにあるかわかりません。
どなたかご教示願いますm(__)m
961蟻人間 ◆T6xkBnTXz7B0
2020/07/08(水) 18:56:14.52ID:wtc6YQgJ962デフォルトの名無しさん
2020/07/08(水) 19:02:59.81ID:j+7F6b9j .rcな
963デフォルトの名無しさん
2020/07/08(水) 19:38:32.50ID:Sbr5rKl2 >>876みたいなコード片の解釈でこんな議論になるというところがC++の問題だな。
964デフォルトの名無しさん
2020/07/08(水) 20:14:05.50ID:j+7F6b9j 仕方無いよバカなんだから
965はちみつ餃子 ◆8X2XSCHEME
2020/07/08(水) 23:46:18.81ID:JUx+fj2a まただ。
このスレを覗いた俺は書き込みを見て落胆した。
また時間がループしてる。
何時になったら、この無間地獄から逃げられるのか。
C++ とはいったい何なのだ?
このスレを覗いた俺は書き込みを見て落胆した。
また時間がループしてる。
何時になったら、この無間地獄から逃げられるのか。
C++ とはいったい何なのだ?
>>966
外患罪あるいは内乱罪に問われるソフトウェアを
外患罪あるいは内乱罪に問われるソフトウェアを
968蟻人間 ◆T6xkBnTXz7B0
2020/07/09(木) 01:05:16.73ID:2UhyUN9n969蟻人間 ◆T6xkBnTXz7B0
2020/07/09(木) 01:07:59.16ID:2UhyUN9n 心を持ったボットたちは疎外感を抱えている。我々人類は彼らに何ができるだろう。
970蟻人間 ◆T6xkBnTXz7B0
2020/07/09(木) 01:16:06.85ID:2UhyUN9n C++とは人間と機械の間のインターフェイス。そして、プログラムを作るための言葉。
971デフォルトの名無しさん
2020/07/09(木) 06:14:05.11ID:oTij6wm7 どうして大物ハンドル持ちの御三方がリレーポエムなの?
ネット界隈で起きてるムーブメントか何かか。
ネット界隈で起きてるムーブメントか何かか。
972デフォルトの名無しさん
2020/07/09(木) 08:47:55.37ID:ah/SMoHN お酒でも入ったんじゃない?
973デフォルトの名無しさん
2020/07/09(木) 09:40:16.08ID:ZjuYlaOw 大物てwww
ちょwww
ちょwww
974デフォルトの名無しさん
2020/07/09(木) 12:40:39.38ID:UKjdf0ou ネタを解説するのは無粋だけど >>965 は昔からあるミームだからね。
https://www.google.com/search?q=%22%E3%81%93%E3%81%AE%E3%82%B9%E3%83%AC%E3%82%92%E8%A6%97%E3%81%84%E3%81%9F%E4%BF%BA%E3%81%AF%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%82%92%E8%A6%8B%E3%81%A6%E8%90%BD%E8%83%86%E3%81%97%E3%81%9F%E3%80%82%22+%22site%3Ahttp%3A%2F%2F*.5ch.net%22&oq=%22%E3%81%93%E3%81%AE%E3%82%B9%E3%83%AC%E3%82%92%E8%A6%97%E3%81%84%E3%81%9F%E4%BF%BA%E3%81%AF%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%82%92%E8%A6%8B%E3%81%A6%E8%90%BD%E8%83%86%E3%81%97%E3%81%9F%E3%80%82%22+%22site%3Ahttp%3A%2F%2F*.5ch.net%22
https://www.google.com/search?q=%22%E3%81%93%E3%81%AE%E3%82%B9%E3%83%AC%E3%82%92%E8%A6%97%E3%81%84%E3%81%9F%E4%BF%BA%E3%81%AF%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%82%92%E8%A6%8B%E3%81%A6%E8%90%BD%E8%83%86%E3%81%97%E3%81%9F%E3%80%82%22+%22site%3Ahttp%3A%2F%2F*.5ch.net%22&oq=%22%E3%81%93%E3%81%AE%E3%82%B9%E3%83%AC%E3%82%92%E8%A6%97%E3%81%84%E3%81%9F%E4%BF%BA%E3%81%AF%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%82%92%E8%A6%8B%E3%81%A6%E8%90%BD%E8%83%86%E3%81%97%E3%81%9F%E3%80%82%22+%22site%3Ahttp%3A%2F%2F*.5ch.net%22
975デフォルトの名無しさん
2020/07/09(木) 13:22:45.87ID:LAghEeB5 同一人物だから。
976デフォルトの名無しさん
2020/07/09(木) 13:26:30.06ID:vrNDocOm 知ってた
977デフォルトの名無しさん
2020/07/09(木) 13:32:17.57ID:DLLEuHaF 何何先生?、ミーム感染の話?ハルヒの夏休み?
新人研修?派遣入れ替え時の話?
毎度同じ質問なんて毎度同じ
新人研修?派遣入れ替え時の話?
毎度同じ質問なんて毎度同じ
978デフォルトの名無しさん
2020/07/09(木) 13:57:03.75ID:DLLEuHaF コロナ感染追跡アプリとしてダウンロードしてもらい
マイナバーカード読み取りで国民投票出来るソフトを開発すべし
マイナバーカード読み取りで国民投票出来るソフトを開発すべし
979デフォルトの名無しさん
2020/07/09(木) 14:10:10.85ID:vrNDocOm コロナアプリは入れようとは思わないけど
ウェザーニュースアプリは入れてみた
ウェザーニュースアプリは入れてみた
980デフォルトの名無しさん
2020/07/09(木) 14:54:52.91ID:mgzGAUUl981デフォルトの名無しさん
2020/07/09(木) 14:58:04.43ID:TlzlBxT2 .manifest
982蟻人間 ◆T6xkBnTXz7B0
2020/07/09(木) 16:45:10.75ID:LAHxv0GZ983デフォルトの名無しさん
2020/07/11(土) 05:56:37.58ID:ckcY8r2v やっぱ>>933とか簡潔に要点が押さえてあるとオモタ、
GetHoge()が呼ぶたびに毎度新しく作ったvectorを返すのならディープコピーを返したらええ
ディープコピーは生成元と所有権で揉めることがありえないからふつくしい
最適化によって実際にはreturn時にvectorの要素がコピーのかわりにmoveされるかもわからんがふつくしさは損なわれない
(さらにいうと、GetHoge()がインライン関数なら最適化でそもそもvector自体のコピーも移動も起きない公算がおおきい
>>918-919な疑問に関しては、
std::vector<T> v1 = GetHoge(); // std::vector<T>のディープコピーを返すバージョンのGetHoge()
std::shared_ptr<std::vector<T> > ptr(new std::vector<T>(v1)); // (*1)
で良いジャマイカ、
非バカが見れば(最適化有効化時は)実際には*1において、v1の要素が*(ptr.get())にコピーではなくmoveされる公算が大きいということがワカル
しかしバカが見ても動作は明確でなんの危険も無い
ptrが一時オブジェクトであっても問題が無い
それでいいジャマイカ、にんげんだもの
GetHoge()が呼ぶたびに毎度新しく作ったvectorを返すのならディープコピーを返したらええ
ディープコピーは生成元と所有権で揉めることがありえないからふつくしい
最適化によって実際にはreturn時にvectorの要素がコピーのかわりにmoveされるかもわからんがふつくしさは損なわれない
(さらにいうと、GetHoge()がインライン関数なら最適化でそもそもvector自体のコピーも移動も起きない公算がおおきい
>>918-919な疑問に関しては、
std::vector<T> v1 = GetHoge(); // std::vector<T>のディープコピーを返すバージョンのGetHoge()
std::shared_ptr<std::vector<T> > ptr(new std::vector<T>(v1)); // (*1)
で良いジャマイカ、
非バカが見れば(最適化有効化時は)実際には*1において、v1の要素が*(ptr.get())にコピーではなくmoveされる公算が大きいということがワカル
しかしバカが見ても動作は明確でなんの危険も無い
ptrが一時オブジェクトであっても問題が無い
それでいいジャマイカ、にんげんだもの
984デフォルトの名無しさん
2020/07/11(土) 12:27:05.11ID:wTK7zrpK なんだかものすごく懐しさを思わせる文体だな
20年ぐらい前のニチャンネラーの書き方だな
20年ぐらい前のニチャンネラーの書き方だな
985デフォルトの名無しさん
2020/07/12(日) 06:25:16.82ID:tiZP2jTh ある整数nが他の整数の4乗であることを調べたい。
(int)pow(pow(n, (double)1/4), 4) が n であるかどうか調べりゃ良いよな?
キャストはどっちかのpowにつければ十分だよね?
(int)pow(pow(n, (double)1/4), 4) が n であるかどうか調べりゃ良いよな?
キャストはどっちかのpowにつければ十分だよね?
987デフォルトの名無しさん
2020/07/12(日) 06:48:24.60ID:D8OEpmlP なにそのカッコ
988デフォルトの名無しさん
2020/07/12(日) 06:52:03.42ID:D8OEpmlP powよりsqrt 2回の方が良い
浮動小数点演算が非常に遅い環境なら
整数の2分検索という手も
浮動小数点演算が非常に遅い環境なら
整数の2分検索という手も
989デフォルトの名無しさん
2020/07/12(日) 07:00:58.89ID:D8OEpmlP int m = (int)sqrt(sqrt((double)n);
if (n == m*m*m*m) ...
普通はこれで良い
if (n == m*m*m*m) ...
普通はこれで良い
991デフォルトの名無しさん
2020/07/12(日) 07:03:01.16ID:D8OEpmlP >>985だと内側のpowの結果を整数に丸めないと
992デフォルトの名無しさん
2020/07/12(日) 07:05:50.02ID:D8OEpmlP >>990
2個のn*nを1回にするかどうかはコンパイラ次第
コンパイラに頼るならカッコつけずにn*n*n*nで良いし
頼らないならn*nを一時変数に一旦入れないと
そもそもnを4乗しても意味ないけど
2個のn*nを1回にするかどうかはコンパイラ次第
コンパイラに頼るならカッコつけずにn*n*n*nで良いし
頼らないならn*nを一時変数に一旦入れないと
そもそもnを4乗しても意味ないけど
993デフォルトの名無しさん
2020/07/12(日) 07:06:15.17ID:m1mq7f3n 外でキャストしても無意味だろ、内をキャストしなきゃ
intにキャストだと誤差で1減る可能性があるから四捨五入しなきゃダメ
でだ、4乗するのにpow()はありえないし
4乗根もpow()よりsqrt(sqrt())の方がマシじゃないかな
でだ、元々整数だけの問題なのにsqrt()使うのが嫌
二分探索で(x * x * x * x) == nになるxを探す方がいいんじゃ?
intにキャストだと誤差で1減る可能性があるから四捨五入しなきゃダメ
でだ、4乗するのにpow()はありえないし
4乗根もpow()よりsqrt(sqrt())の方がマシじゃないかな
でだ、元々整数だけの問題なのにsqrt()使うのが嫌
二分探索で(x * x * x * x) == nになるxを探す方がいいんじゃ?
994デフォルトの名無しさん
2020/07/12(日) 07:12:28.75ID:D8OEpmlP nが平方数なら
普通はsqrt(n)の結果に誤差は無い
nもdoubleも32bitの環境でdoubleキャストによって誤差が出る場合や
sqrtの計算方法が普通ではない場合には
丸め方法も考えないと
普通はsqrt(n)の結果に誤差は無い
nもdoubleも32bitの環境でdoubleキャストによって誤差が出る場合や
sqrtの計算方法が普通ではない場合には
丸め方法も考えないと
995デフォルトの名無しさん
2020/07/12(日) 07:15:24.87ID:tiZP2jTh 二分探索ってO(log n)でしょ?
sqrtとかpowより速いの?
これも「実装依存」なの?
sqrtとかpowより速いの?
これも「実装依存」なの?
996デフォルトの名無しさん
2020/07/12(日) 07:16:36.03ID:tiZP2jTh まあ速さよりは間違えそうじゃなさと文法的な分かりやすさ、短さの方が今求めてるものですけど
言ってなくてすみません
言ってなくてすみません
997デフォルトの名無しさん
2020/07/12(日) 07:18:45.88ID:D8OEpmlP doubleが非常に遅い環境や
浮動小数点演算のライブラリを積みたくない場合
などで2分検索を使う場合もある
という程度
浮動小数点演算のライブラリを積みたくない場合
などで2分検索を使う場合もある
という程度
998デフォルトの名無しさん
2020/07/12(日) 08:11:47.62ID:oJ0fA8EI 「平方数か」を高速に判定する方法があれば、
平方数なら → 平方根を計算 → 平方根が平方数か
…という2段階の判定もありそうな感じ。
平方数なら → 平方根を計算 → 平方根が平方数か
…という2段階の判定もありそうな感じ。
999デフォルトの名無しさん
2020/07/12(日) 08:31:16.95ID:m1mq7f3n1000デフォルトの名無しさん
2020/07/12(日) 09:41:30.40ID:uBv3fNFk 整数Cを素因数の4乗で割っていき、
1になるまで余りが出なければ、
全体は整数の4乗である
1になるまで余りが出なければ、
全体は整数の4乗である
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 58日 21時間 48分 5秒
新しいスレッドを立ててください。
life time: 58日 21時間 48分 5秒
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を超えています。これ以上書き込みはできません。
ニュース
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 【映画】「果てしなきスカーレット」入場者プレゼント実施 細田守監督描き下ろし「歴代ヒロイン」色紙7種をランダム配布 [muffin★]
- 色づく世界の明日からっておもろい?
- 【閲覧注意】ちずちんな
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 高市総理、睡眠時間30分😢
- フェリーの魅力を語ろう。
- 引越したんだがかなり大変だな
