X



C++相談室 part134
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 5fcb-Q2eK)
垢版 |
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
0079デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
垢版 |
2018/02/05(月) 23:20:37.74ID:y5vbQcAP0
メンバのコピーコンストラクタを起動すべきところをmemcpy()しかしない手製コピーコンストラクタで済ませようとしたら破滅が訪れる

MyClass(const MyClass&) = default; なら勝手にやってくれるのでその心配が無いので安心
0091デフォルトの名無しさん (ワッチョイ 7723-Us3F)
垢版 |
2018/02/06(火) 14:01:35.47ID:rGp9SuaC0
そもそも memcpy は前者の性能保証も後者の仕様の保証もどちらも満たしてない
仕様が保証されてるなら多分性能的に大丈夫だろうという程度

間違いを認めると死ぬ病気なんだろうからもうこれ以上は言わない。
009462 (ワッチョイ 9fbd-CNA0)
垢版 |
2018/02/06(火) 22:02:19.27ID:MckGyr3K0
memcpy()より速いコピー手段Xが仮にあったとして
論理的にmemcpy()で済むケースについてコンパイラが提供する
デフォルトのコピーコンストラクタがコピー手段Xにならない理由がわからん…

個人的には「=default;」と書いたら最高性能なんなら毎回手でmemcpy()とか書きたくないカンジ
0100デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
垢版 |
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は間違いなんジャマイカ、
0105デフォルトの名無しさん
垢版 |
2018/02/07(水) 07:27:28.65
頭のいいコンパイラなら勝手にベクトル処理とかしてくれるんじゃないの?

知らんけど
0106デフォルトの名無しさん (ワッチョイ 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

{
0107片山博文MZ ◆T6xkBnTXz7B0 (スププ Sd62-d/x4)
垢版 |
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の( )の中で、変数を宣言できることを知らない人は多い。
0110デフォルトの名無しさん (ワッチョイ 4539-102K)
垢版 |
2018/02/11(日) 17:00:15.07ID:RGzNlubj0
それほど待ち遠しいか?
0111デフォルトの名無しさん (ワッチョイ 99b3-7Au1)
垢版 |
2018/02/11(日) 17:27:44.93ID:QA9xO9uU0
待ち遠しくない
0112デフォルトの名無しさん (ドコグロ MM0a-/0XS)
垢版 |
2018/02/11(日) 17:34:07.64ID:A61Ds/EIM
for( ) の制御変数はそのループでしか使わないことが多いから意味あったけど、if( ) でそんなケースはまれだしなぁ
あれば使うけど待ち遠しいって言うほどじゃない気がする
0118デフォルトの名無しさん
垢版 |
2018/02/11(日) 20:06:43.52
>>116
>if(DWORD err = GetLastError(); err != NO_ERROR)

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

変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと)
複文書けるのは特にメリット感じないわ
0120デフォルトの名無しさん
垢版 |
2018/02/11(日) 20:56:03.30
>>119
それが通るという変更だと思ってたわ

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

if((my $err = GetLastError()) != NO_ERROR)
0121デフォルトの名無しさん (ワッチョイ d27e-jA6l)
垢版 |
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; }
0122デフォルトの名無しさん (ワッチョイ ddc3-saCW)
垢版 |
2018/02/12(月) 12:22:30.52ID:sATukCOa0
Cでは名前空間っていうのをすごい扱っていた気がするんだけどC++は名前空間扱うことってないの?
一つのアプリケーションも完成させたことがないど素人の質問ですまんが
0125デフォルトの名無しさん (ワッチョイ 319f-R9JW)
垢版 |
2018/02/12(月) 20:44:41.93ID:gfcybQxo0
>>122
気のせい。
0127はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-jA6l)
垢版 |
2018/02/13(火) 17:30:20.31ID:tUR5ZBgZ0
構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
0134デフォルトの名無しさん (ワッチョイ 9f23-TT3E)
垢版 |
2018/02/15(木) 12:08:37.28ID:Sgd3BwBT0
std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、
キャッシュのような機能を実装したいのだけど、
C++でそのような仕組みを作れるクラスはないですか?
0137デフォルトの名無しさん (ブーイモ MMbf-4Nx+)
垢版 |
2018/02/15(木) 19:13:27.39ID:CSnzpiZpM
C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ
0143デフォルトの名無しさん (ワッチョイ 9fa8-yZIn)
垢版 |
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リスト見て処理すればいい
0144デフォルトの名無しさん (ワッチョイ ff80-Pey1)
垢版 |
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
0145デフォルトの名無しさん
垢版 |
2018/02/16(金) 04:31:51.17
>>144
> # ary は、hash に追加・アクセスした順

参照のたびに最後尾に追加しなおすの?
0146デフォルトの名無しさん (ワッチョイ d7e3-2H/C)
垢版 |
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\
0147144 (ワッチョイ ff80-Pey1)
垢版 |
2018/02/16(金) 07:56:00.35ID:DpsRPWWQ0
>>145

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

どういう意味か、正確にはわからないけど
0149134 (ワッチョイ 9f23-TT3E)
垢版 |
2018/02/16(金) 09:56:21.20ID:+b2iJMK40
みなさんありがとうございます。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも
無いかと思ったのですが、標準ではやっぱり無いですか。

>>143のように、std::mapをメンバの一つに持たせた独自クラスを
一から作っていくことになるんですかね。
0150デフォルトの名無しさん (ワッチョイ 9f12-pjg9)
垢版 |
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
0162デフォルトの名無しさん (マクド FF6b-xgEu)
垢版 |
2018/02/17(土) 09:43:48.64ID:Lqib7/b9F
以下のようにconst char*型の文字列でchar*型の変数を初期化したいときに
strcpyやstrlenを書かずにstd::stringを利用して短くかけないかと思うのですが
msvcだとエラーにならず、clang, gccだとdeleteでセグメンテーション違反になります。
どうすればより良い感じになるでしょうか?const_castはできれば使いたくないです。

#include <string.h>
#include <string>
#include <iostream>
int main()
{
const char* asdf = "asdf";
// char* psz2 = new char[strlen(asdf)+1];
// strcpy(psz2, asdf);
std::string *psz = new std::string(asdf);
char* psz2 = &(*psz)[0];

std::cout << psz2 << std::endl;
delete psz2;
return 0;
}
0164デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/17(土) 10:21:38.22ID:4SqFrjwY0
何故stringそのものじゃなくて内部データをdeleteしようと思ったのか
newで確保した配列じゃないからdeleteはできない
stringの内部データは静的な配列と動的な配列を組み合わせて表現されている
mscvの場合先頭16文字はchar[16]でそれ以降は動的な配列に入るようになっている
psz[0]のアドレスはchar[16]の先頭アドレスなので当然deleteできない
msvcはdeleteに失敗しても落ちないのかな
0165デフォルトの名無しさん (ワッチョイ ff80-Pey1)
垢版 |
2018/02/17(土) 10:47:53.57ID:IU1gsQgu0
>>155-159
本格的な本なら、ロベール、ハーバート・シルトの独習

軽めの本なら、柴田 望洋、林 晴比古、猫
0166デフォルトの名無しさん (ワッチョイ 9fcb-8YMj)
垢版 |
2018/02/17(土) 11:22:13.08ID:++v6vSjK0
ハンガリー人まだ絶滅してないのか。
stringはnull terminatedでないからpszはおかしい。
psz2もnull terminatedの保証がないからc_strを使うべき。
うまくいったらstrdupも調べとこうな。
0170デフォルトの名無しさん (ワッチョイ bf0e-qi38)
垢版 |
2018/02/17(土) 16:50:38.35ID:Q4Uv6cZz0
>>162
弁護士の唐沢です
しっかり「char* const」と「const char*」の違いを認識しなさい
const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね?
最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ
0173デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/17(土) 17:34:22.09ID:4SqFrjwY0
>>167
データは連続しているので同じになる
16文字まではスタックを使い、それ以上の長さになるとヒープにコピーされる
実装ではメンバの配列には何かしらのエスケープ文字が入る
ちなみにmsvcでは実装の都合上free(&str[0])で強引に解放できる
0174173 (ワッチョイ 1f7e-T3WU)
垢版 |
2018/02/17(土) 17:49:08.26ID:4SqFrjwY0
補足
スタックとヒープを使い分けるかどうかは実装依存
gcc、clang、msvcでは行われている
したがって短い文字列でnewを避けるためにstringを使わないというのは意味が無い
0175デフォルトの名無しさん
垢版 |
2018/02/17(土) 18:06:03.81
>>171
strdupで確保した領域をfreeでなくdeleteするのは正しいの?
■ このスレッドは過去ログ倉庫に格納されています

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