C++相談室 part134

■ このスレッドは過去ログ倉庫に格納されています
2018/01/20(土) 09:05:42.21ID:mJKRg6iz0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part133
http://mevius.5ch.net/test/read.cgi/tech/1511509970/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/01/30(火) 20:17:26.27ID:fsahOVUj0
レスありがとうございます。

>>56
Implimentは複数あって、ユーザーが選ぶことができる
というのを想像して作っていました。

>>57
template化する前はそこでインクルードしていました。

>>58
たしかに、このコードだけでは大丈夫ですね。
正確にはこのコードだけではないので、他に原因があるのかもしれません。
ご指摘ありがとうございます。
2018/01/30(火) 21:08:08.01ID:VkcoBYQV0
Implement入れ替えさせたいならユーザーに適当な所で
template Interface<MyImplement>;
って書かせりゃいいだけじゃないの?
2018/01/30(火) 21:19:19.29ID:Lbh+cCVN0
typename imp::base
2018/02/04(日) 11:20:04.76ID:r6E1M8790
質問ですが
「このクラスはバイト列としてコピーできる」ということを明らかにするために
明示的にコピーコンストラクタを書くとして、
どう書けば処理系に依存することなくデフォルトのコピーコンストラクタ以上の性能になることを保証できますか
(もしくは、「このクラスはバイト列としてコピーできる」ということを明示する構文はありますか)
2018/02/04(日) 11:26:54.06ID:i7yJvuTcd
>>62
MyClass(const MyClass&) = default;
2018/02/04(日) 11:36:31.71ID:H9FebDBN0
デフォルトのコピーコンストラクタはメンバのコピーコンストラクタを起動するので、
そのクラス (に属するオブジェクト) 全体がバイト列としてコピーするわけではない。

trivially copyable class の要件を満たすように書けばバイト列としてコピー可能と保証される。
コンストラクタの書き方だけでは保証できない。
2018/02/04(日) 13:04:56.23ID:WecC8o2P0
memcpyするコピコンをユーザー定義すればええやん
2018/02/04(日) 13:46:35.82ID:r6E1M8790
>>63
なるほど「= default;」のありがたみがわかりた

>>64
なるほどそれだと安全性の点でイマイチ…
バイト列としてそのままリモートPCに送ったりするクラスに誰かが
バイト列としてのコピーが可能でないコードを追加したとしても
コンパイラで検出する術が無いっぽいように読める
2018/02/04(日) 13:47:37.01ID:r6E1M8790
訂正
誤:バイト列としてのコピーが可能でないコード
正:バイト列としてのコピーを不可能にするコード
2018/02/04(日) 13:47:46.54ID:HBpG+TPK0
>>62
std::is_trivially_copyable<T>がtrueになるように書いて
https://cpprefjp.github.io/reference/type_traits/is_trivially_copyable.html
トリビアル型とは何かは検索して
2018/02/04(日) 13:52:58.38ID:HBpG+TPK0
>>66
なおさらtype_traitsで条件に合わなければコンパイルを失敗させればよい
2018/02/04(日) 14:08:05.83ID:r6E1M8790
>>69
おk
2018/02/04(日) 16:47:05.72ID:H9FebDBN0
>>65
まあ書こうと思えば書けないことはないが、
やった結果に整合性がとれるかどうかは別問題なのでな……。
2018/02/04(日) 17:24:06.38ID:H9FebDBN0
流れをぶった切って質問するんだけど、
配列の一部をとる参照とかって作れない?
実際にはコンパイルが通らないけど、やりたいことはこんな感じ。

int a[3];
int (&b)[2] = static_cast<int (&)[2]>(a);
2018/02/04(日) 18:06:17.19ID:B+seqFts0
reinterpret_castすれば?
2018/02/04(日) 18:22:52.47ID:HJ1AdVlZ0
ポインタにして剥がせばいい
2018/02/04(日) 18:28:31.26ID:HBpG+TPK0
配列型はポインタではないので途中からとかない
2018/02/04(日) 18:55:06.41ID:i/oNqC3f0
一応うまく行ったけど規格で保証された挙動かどうかはよくわからない
https://ideone.com/wVzc6b
2018/02/04(日) 19:14:07.38ID:NcR26d4z0
でもポインタにしてしまうと困るシチュエーションなんてありうるの?
マクロの中でsizeofしてるとか?
2018/02/04(日) 20:30:26.18ID:WecC8o2P0
>>71
意味わかんねえ
どーゆーこと?
2018/02/05(月) 23:20:37.74ID:y5vbQcAP0
メンバのコピーコンストラクタを起動すべきところをmemcpy()しかしない手製コピーコンストラクタで済ませようとしたら破滅が訪れる

MyClass(const MyClass&) = default; なら勝手にやってくれるのでその心配が無いので安心
2018/02/05(月) 23:28:20.73ID:QTKEhMlZ0
しかしまあ >>68 なんていう便利なモノがあるとは
フラフラこういうスレ読んでるのもためになるなあ
2018/02/06(火) 07:54:17.35ID:CtmFRYuD0
>>79
>>62
2018/02/06(火) 08:05:48.85ID:cp/uvOeq0
>>62
処理系に依存することなく「保証」なんて出来ない
以上
2018/02/06(火) 08:27:38.08ID:rGp9SuaC0
>>63で解決している
もしくは以下への回答も>>69で出ている
2018/02/06(火) 09:14:20.61ID:CtmFRYuD0
バイト列コピーが = default; なわけねーだろアホ
2018/02/06(火) 11:45:28.85ID:rGp9SuaC0
よく読め
バイト列コピーでokの保証は>>69
遅くならないコンストラクタの書き方が>>63
2018/02/06(火) 11:48:04.39ID:rGp9SuaC0
そもそも「どうコンストラクタを書けば」ってのを質問してるんで
バイト列コピーでコンストラクタを書けってのは単に>>65の珍解答に過ぎない
2018/02/06(火) 11:51:41.68ID:CtmFRYuD0
すまんが日本語でたのむ
2018/02/06(火) 11:54:37.03ID:rGp9SuaC0
元の質問>>62
・処理系に依存せずデフォルトより遅くならないことが保証されているコンストラクタの書き方
もしくは
・バイト列コピーでokと明示する構文

だろ。
前者は>>63
後者は>>68-69
2018/02/06(火) 12:36:57.61ID:CtmFRYuD0
元質問: デフォルトのコピーコンストラクタ以上の性能
おまえ: デフォルトより遅くならないこと

よく読めをそのまま返す
2018/02/06(火) 12:57:03.34ID:bHMYZ9Vj0
以上っていうのは等しいかまたはそれを越えるという意味だぞ
2018/02/06(火) 14:01:35.47ID:rGp9SuaC0
そもそも memcpy は前者の性能保証も後者の仕様の保証もどちらも満たしてない
仕様が保証されてるなら多分性能的に大丈夫だろうという程度

間違いを認めると死ぬ病気なんだろうからもうこれ以上は言わない。
2018/02/06(火) 14:38:54.29ID:CtmFRYuD0
バイトコピーでmemcpyより高性能な手段を1つでも例示したらどうなんだ

> 間違いを認めると死ぬ病気なんだろうから

ああ、おまえがか
2018/02/06(火) 18:18:02.35ID:cp/uvOeq0
https://stackoverflow.com/questions/28623895/why-is-memmove-faster-than-memcpy
2018/02/06(火) 22:02:19.27ID:MckGyr3K0
memcpy()より速いコピー手段Xが仮にあったとして
論理的にmemcpy()で済むケースについてコンパイラが提供する
デフォルトのコピーコンストラクタがコピー手段Xにならない理由がわからん…

個人的には「=default;」と書いたら最高性能なんなら毎回手でmemcpy()とか書きたくないカンジ
2018/02/06(火) 22:06:49.77ID:CtmFRYuD0
>>94
class A {
public:
A() {}
A(A const&) { std::cout << "aho"; }
};

class B {
public:
A a;
B() = default;
};

int main()
{
B b, c = b; //this will call you.
}
2018/02/06(火) 22:09:42.68ID:MckGyr3K0
>>95は「論理的にmemcpy()で済むケース」では無いからちげう
2018/02/06(火) 22:29:22.47ID:CtmFRYuD0
だから日本語でたのむって言っただろ
2018/02/06(火) 22:29:24.08ID:MckGyr3K0
どうした?
訂正はよ
2018/02/06(火) 23:07:57.82ID:hdfY5rL3M
間違いを認めて・・・死んだのか?
2018/02/06(火) 23:21:41.18ID:MckGyr3K0
仕方ないので漏れが訂正するわ;
ttps://ideone.com/TZnGv4

↑のコードの
(*1)は「=default;」でデフォルトのコピコンの使用を明示
(*2)は手でmemcpy()でコピーするように書いたコピコン

次の条件で試したら(*1)も(*2)も同じコードになったわ
x86-64 gcc 7.2
-O2 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra

こことかで試せるが保存と公開方法がわからんかったのでideoneを使わせてもろうた
ttps://gcc.godbolt.org/

漏れの国語力ではようわからんが、さすがに多分>>84は間違いなんジャマイカ、
2018/02/06(火) 23:34:18.80ID:Ur4dB7lv0
Cから来た連中ってどうしてmemcpyやmemset使いたがるんだろうな
2018/02/07(水) 04:09:18.59ID:OAPGz/K+0
>>76
reinterpret_cast でなければ通らないときはだいたい駄目なときやわ。
2018/02/07(水) 04:22:37.75ID:OAPGz/K+0
>>100
「default がバイト列コピーとは『限らない』」という意味で >>84 は真。
2018/02/07(水) 05:00:09.29ID:1UF8v8gcM
開始アドレス、終了アドレス、サイズが64bit等で割り切れれば
バイトコピーより早いコピーはあるだろうね
105デフォルトの名無しさん
垢版 |
2018/02/07(水) 07:27:28.65
頭のいいコンパイラなら勝手にベクトル処理とかしてくれるんじゃないの?

知らんけど
106デフォルトの名無しさん (ワッチョイ 57b3-wbgk)
垢版 |
2018/02/07(水) 22:28:51.20ID:MTpdY7NJ0
"!"!"!MOHYO!"!"!"2"

1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]]

2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL!

3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{

41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0
.3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end

{
2018/02/10(土) 19:52:35.19ID:x9I4Wn6Pd
C++では、
int i;
for (i = 0; i < 9; ++i) { ... }
が、
for (int i = 0; i < 9; ++i) { ... }
って書けるのは知っているだろう。( )の中で、変数を宣言できる。

だが、ifやwhileの( )の中で、変数を宣言できることを知らない人は多い。
2018/02/11(日) 04:31:12.99ID:9irhhPDg0
C++17では
if ( auto v = n; conditions ) {
...
}
が可能になるし、これからは広がってくれるかのう
2018/02/11(日) 06:11:03.22ID:l3GMmVaq0
>>108
これホント待ち遠しい
110デフォルトの名無しさん (ワッチョイ 4539-102K)
垢版 |
2018/02/11(日) 17:00:15.07ID:RGzNlubj0
それほど待ち遠しいか?
111デフォルトの名無しさん (ワッチョイ 99b3-7Au1)
垢版 |
2018/02/11(日) 17:27:44.93ID:QA9xO9uU0
待ち遠しくない
2018/02/11(日) 17:34:07.64ID:A61Ds/EIM
for( ) の制御変数はそのループでしか使わないことが多いから意味あったけど、if( ) でそんなケースはまれだしなぁ
あれば使うけど待ち遠しいって言うほどじゃない気がする
2018/02/11(日) 17:36:34.68ID:bT0HWvJB0
理想主義的な文法ですが、実効性はあるのか疑問ですね
2018/02/11(日) 17:40:12.67ID:KWDwqk940
一瞬意図が分からなかったが
()の中が;で区切れるという話?
2018/02/11(日) 17:41:52.24ID:rD0gl3AiM
dynamic_castとの組み合わせで使うとかどうよ
2018/02/11(日) 19:11:10.58ID:av7bQMHG0
結構あると思うけどね
if(DWORD err = GetLastError(); err != NO_ERROR)
この場合NO_ERRORが0だって分かってるから
if(DWORD err = GetLastError())
で済むから無意味だけど
2018/02/11(日) 19:17:28.82ID:yo2OB3cP0
>>116
前者の方が意図が明確だし意味はあると思う
118デフォルトの名無しさん
垢版 |
2018/02/11(日) 20:06:43.52
>>116
>if(DWORD err = GetLastError(); err != NO_ERROR)

普通こうやろ
if((DWORD err = GetLastError()) != NO_ERROR)

変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと)
複文書けるのは特にメリット感じないわ
2018/02/11(日) 20:41:29.80ID:Ag9E1Urq0
それ通らんよ
こうだろ

DWORD err;
if((err = GetLastError()) != NO_ERROR)

if内でしか使わないerrが外部に漏れてるのがよろしくないってこと
120デフォルトの名無しさん
垢版 |
2018/02/11(日) 20:56:03.30
>>119
それが通るという変更だと思ってたわ

こう書けるPerlのほうがまだ優位性あるね

if((my $err = GetLastError()) != NO_ERROR)
2018/02/11(日) 22:10:23.49ID:p+z832PL0
if(init ; expr)だと初期化と式が関連していなくてもいいので>>120とは違う構文になる
だからこんなのでもよい
if(int err = GetLastError(); hoge.aho())

lock_guardもしておける
if(std::lock_guard<std::mutex> lock(m); flag)

構造化束縛も使える
if(auto [a, b, c] = f(); b > c){ std::cout << "b > c" << std::endl; }
122デフォルトの名無しさん (ワッチョイ ddc3-saCW)
垢版 |
2018/02/12(月) 12:22:30.52ID:sATukCOa0
Cでは名前空間っていうのをすごい扱っていた気がするんだけどC++は名前空間扱うことってないの?
一つのアプリケーションも完成させたことがないど素人の質問ですまんが
2018/02/12(月) 12:43:48.54ID:qekpeHDJ0
>>122
まずは"C"の入門書を読んで、何を見間違えたのかはっきりさせてからにしようか。
2018/02/12(月) 14:08:57.84ID:sGdsmrZD0
初心者スレに池
125デフォルトの名無しさん (ワッチョイ 319f-R9JW)
垢版 |
2018/02/12(月) 20:44:41.93ID:gfcybQxo0
>>122
気のせい。
2018/02/13(火) 00:10:36.10ID:YGwN9DGw0
>>122
Cにnamespaceは無いだろ
2018/02/13(火) 17:30:20.31ID:tUR5ZBgZ0
構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
2018/02/13(火) 17:45:08.06ID:a1RYP/Gm0
こんな名前空間もあるね
int x;
int main(void)
{
x = 1;
int x;
x = 2;
{
int x;
x = 3;
}
return 0;
}
2018/02/13(火) 17:55:17.58ID:Xr6xvVy+M
それはスコープでは
2018/02/13(火) 18:15:03.36ID:a1RYP/Gm0
変数だよ
代入でもあるね
2018/02/13(火) 20:09:02.02ID:NNOtJgpO0
謎すぎワロタがそこから上のスコープのxを参照してくれ
2018/02/13(火) 20:19:22.41ID:Za/EZbH7M
ブロックって言ってる
2018/02/13(火) 21:49:01.90ID:a1RYP/Gm0
アホばっかり
がっかり
2018/02/15(木) 12:08:37.28ID:Sgd3BwBT0
std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、
キャッシュのような機能を実装したいのだけど、
C++でそのような仕組みを作れるクラスはないですか?
2018/02/15(木) 17:00:44.45ID:GbCJk+7h0
自分で実装するならどうにでもなるだろ
そのための道具は全て標準で揃っている
2018/02/15(木) 18:15:51.96ID:6url8MQd0
バックグラウンドならスレッド使うしかないんじゃないかな
137デフォルトの名無しさん (ブーイモ MMbf-4Nx+)
垢版 |
2018/02/15(木) 19:13:27.39ID:CSnzpiZpM
C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ
2018/02/15(木) 19:34:35.63ID:95vLe5Bi0
>>137
どんな点が、性格悪い、と思わせるのですか?
2018/02/15(木) 20:03:21.73ID:qihnyYvs0
それだよそれ
2018/02/15(木) 21:14:35.68ID:MoAPifjS0
C++は多分チューリング完全だと思う
2018/02/15(木) 21:20:32.50ID:6nYos/bmM
>>136
要素数が閾値を超えるのは要素が追加される時だからその時に古い奴を削除すりゃいいだけじゃね?
2018/02/15(木) 23:50:52.95ID:fG1U9Z3qM
>>135
簡単で良いのでサンプルコード書いてもらえませんか?
2018/02/16(金) 00:43:14.82ID:uaG+5sVQ0
>>135じゃないけどシンプルにいくなら
{
map<key,value> data; // 本来のデータ
map<key,list<key>::iterator> lruindex; //
list<key> lrulist; // LRUリスト
... // mapと同じインターフェイス
}
みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい
2018/02/16(金) 03:16:29.76ID:DpsRPWWQ0
辞書・線形リスト・2分木を、組み合わせる。Ruby で書くと、

class LRU_hash
def initialize (max_size = 3)
# ary は、hash に追加・アクセスした順
@hash = {}; @ary = []
@max_size = max_size
end

def push (key)
if @hash.has_key? key
# 一旦、要素を削除してから、最後尾に追加しなおす
@ary.delete key
else
if @max_size == @hash.size
# 先頭要素を削除してから、最後尾に追加する
@hash.delete(@ary.shift)
end
@hash[key] = true
end
@ary.push key
end

def print_buf
puts @ary.join ', '
end
end

ary = ["あ", "a", "あ", "い", "b", "あ", "c"]
hash = LRU_hash.new 4
ary.map { |key| hash.push key }
hash.print_buf #=> い, b, あ, c
145デフォルトの名無しさん
垢版 |
2018/02/16(金) 04:31:51.17
>>144
> # ary は、hash に追加・アクセスした順

参照のたびに最後尾に追加しなおすの?
2018/02/16(金) 06:27:04.53ID:HICjIKnm0
プログラムを作っていて困っています。
プログラム動作環境、windows 7 x86_x64

プロセスをExplorerを親として、
起動したプロセスにファイルの存在するディレクトリを作業ディレクトリとして
割り当てたい。

ただし、プロセスへのアタッチによる変更は禁止とする。

ようするにファイルをダブルクリックして起動するのと同じ状況を再現したいのです。



C:\hoge\fuga.exe

[現状]
Explorer C:\hoge\fuga.exe

explorer.exe
カレントディレクトリ
C:\Windows\System32\

[理想]
Explorer C:\hoge\fuga.exe

explorer.exe
カレントディレクトリ
C:\hoge\
2018/02/16(金) 07:56:00.35ID:DpsRPWWQ0
>>145

>>134
で、LRU と書いてあるから、Hash に追加しようとした度に、
すでに存在する場合でも、配列の最後尾に追加しなおした

どういう意味か、正確にはわからないけど
2018/02/16(金) 08:03:01.53ID:TOIQut300
>>146
explorer.exeへのショートカットを作ってプロパティで作業ディレクトリを指定するか、
COMでIShellLink::SetWorkingDirectoryを使って同じことをするあたりか?
2018/02/16(金) 09:56:21.20ID:+b2iJMK40
みなさんありがとうございます。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも
無いかと思ったのですが、標準ではやっぱり無いですか。

>>143のように、std::mapをメンバの一つに持たせた独自クラスを
一から作っていくことになるんですかね。
2018/02/16(金) 10:11:55.71ID:JoalkiMd0
amazonランキングの謎を解く とか言う本でmove-to-frontを見た

本の紹介「Amazonランキングの謎を解く」
http://www.kenkyuu.net/whatsnew/2011/08/book2011-08-01.html
>「move-to-front規則」(最後に売れた順に並べる、つまり、注文のたびに1位にジャンプする)

Move To Front - Wikipedia
https://ja.wikipedia.org/wiki/Move_To_Front
2018/02/16(金) 10:54:10.09ID:TOIQut300
ageだね
2018/02/16(金) 14:25:37.67ID:UjPhOEUu0
>>149
「c++ lru map」でググったか?
いくつかサンプルになりそうなコードが見つかるんだけど
2018/02/16(金) 18:05:58.99ID:GGXfeEqkM
江添さんのC++17本予約しようかな
2018/02/16(金) 18:26:06.12ID:waI0am5S0
予約しなくても売れ残るからいつでも買える
2018/02/16(金) 20:04:35.13ID:1Lr9lxEpa
C++を勉強しようと思ってる者ですが書籍を探しております。Cはある程度書けるのでそれを前提とした書籍が欲しいです
2018/02/16(金) 20:33:50.33ID:Rc+MuzY40
C++ クイック入門&リファレンス
プログラミング言語C++ 第4版
2018/02/16(金) 20:36:34.10ID:9b60nRDg0
>>155
C++11 以前だが accelerated c++, ここでフォローするよ
2018/02/16(金) 20:37:11.23ID:TOIQut300
禿4は俺も推奨する
C++11の良本だ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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