[過去ログ] C++相談室 part157 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1: 2021/08/09(月)10:57 ID:JaaB5Egp(1/2) AAS
前スレ
C++相談室 part156
2chスレ:tech
903(1): [sega] 2021/11/02(火)10:51 ID:7a5iqwfV(1) AAS
std::thread で作られるスレッドって
スタックサイズはデフォルトいくつなん?
変更とかできるん?
904: 2021/11/02(火)10:59 ID:oKrr57AH(1) AAS
>>903
スタックなんて概念がないのに制御できるわけがない
905: 2021/11/02(火)11:48 ID:LR6fq+wY(1/3) AAS
linuxならulimit -sかpthread_attr_setstacksizeで設定できる
ただ確保されるのは仮想メモリなので現実的にはその設定あんまり使い所がない
そしてC++とか関係ない
906: 2021/11/02(火)13:09 ID:TehqQXLJ(1/2) AAS
stdよりposixのほうが洗練されてるよな
907: 2021/11/02(火)17:28 ID:LR6fq+wY(2/3) AAS
何いってんの?この人
908: 2021/11/02(火)19:04 ID:TehqQXLJ(2/2) AAS
意味わかんなくてpthread使ってんなら相当頭悪い
909: 2021/11/02(火)19:13 ID:U4IKz2Wy(1) AAS
むだに喧嘩すんなよ
910: 2021/11/02(火)19:28 ID:LR6fq+wY(3/3) AAS
比較対象がおかしいんだからしょうがなくね?w
911(2): 2021/11/05(金)00:18 ID:2vTbLoUN(1) AAS
基底クラスに定数持たせるけど値は継承先で決めたい。
例)Carクラスには計算に使うが変更はしない定数 weight hight width があり、それは継承した車種クラス毎に異なる、など。
下記でコンパイル通るようですが、定数増えると見づらく、もっとスマートなやり方あったらご教授願いたく。
class Car
{
protected:
const double weight, height, width;
public:
Car(double w, double h, double wd)
: weight(w)
省8
912(1): 2021/11/05(金)00:22 ID:O1PLiy99(1) AAS
別に普通だと思うけどどの辺が見づらいと思うんだ?
913: はちみつ餃子 ◆8X2XSCHEME 2021/11/05(金)01:26 ID:8QrXrM3i(1/4) AAS
値が const であるだけでなく static であって欲しいという意図なんじゃないかと想像する。
914: 2021/11/05(金)01:29 ID:zGuhJhpK(1) AAS
クラステンプレート化すればいいじゃない
template<double W, double H, double WD>
915(1): 2021/11/05(金)01:41 ID:gd3zcTPm(1/3) AAS
doubleってテンプレート引数OKになったの?
916: はちみつ餃子 ◆8X2XSCHEME 2021/11/05(金)01:48 ID:8QrXrM3i(2/4) AAS
>>915
C++20 で非型テンプレート引数の大幅な緩和があった。
917: 2021/11/05(金)02:25 ID:Xs8oV2Az(1/2) AAS
C++20では普通に使えるかもだけど、引数に名前を付ける風のトリックがあるらしい
外部リンク:www.fluentcpp.com
918(1): 2021/11/05(金)05:55 ID:caWVwyr0(1) AAS
>>911
virtual double weight() const = 0;
じゃあかんの?
919(1): 2021/11/05(金)06:25 ID:8h2e+y9J(1) AAS
>>912
引数が数値ばかりで10個とかあると確かに何を指定してるのかぱっと見わかんなくなりそう
C++なら>>918に一票だけど参照する時に ( ) が要るからこう言うケースだとC#のプロパティが欲しくなる
920(1): 2021/11/05(金)07:38 ID:gd3zcTPm(2/3) AAS
C++20で指示付き初期化が出来るようなので、もしC++20が使えるなら定数を構造体にまとめたらいいかも
外部リンク[html]:cpprefjp.github.io
921: 2021/11/05(金)08:22 ID:OHT8JXtH(1) AAS
>>911
Builderパターンとか?
面倒だったらDirectorクラスは省略しても問題なさそう。
類型的な車種ごとにBuilderを派生させてデフォルト値を決めといてもいいかと。
922(1): 2021/11/05(金)12:38 ID:gSSLx8YQ(1) AAS
>>919
参照するときに()ていうのは
a=car.weight(); ていうこと?
a=car.weight; と表記したいならoperator=をオーバーロードすればいいかと
923(1): 2021/11/05(金)13:46 ID:Xs8oV2Az(2/2) AAS
>>920
C++20で使えるのそれそれ。gccでは元々使えるけど...
924: はちみつ餃子 ◆8X2XSCHEME 2021/11/05(金)13:57 ID:8QrXrM3i(3/4) AAS
>>923
C (C99 以降) には有るからついでに C++ でも使えるようにするのは gcc 的にはたいした手間でもなかったんだろうと思う。
925(1): はちみつ餃子 ◆8X2XSCHEME 2021/11/05(金)14:01 ID:8QrXrM3i(4/4) AAS
ところで C の designated initializer では配列要素を指示することも出来るんだけど、 C++20 にはこれは入らなかったんだね。
↓ こういうの。
const char *foo[5] = {
[2]="bar"
};
926: 2021/11/05(金)14:04 ID:XqgFcDRs(1) AAS
c++17以前でも引数を構造体にまとめれば{}で区切って記述できるようになるから多少マシにはなるよね
IntelliSenseが効きにくくなるのが欠点だけど
927: 2021/11/05(金)14:10 ID:TiWO+rcp(1) AAS
>>922
君は何を言っているんだい?
928(1): 2021/11/05(金)14:27 ID:7LuUsMxr(1) AAS
そのCの記述素晴らしいよね
C++的でないのはわかるがどうせ初期化時でしか使わんのだしとっとと入れるべきだった
929: 2021/11/05(金)16:10 ID:gd3zcTPm(3/3) AAS
>>925 ラムダ式のキャプチャと競合するためと書いてるね
930(2): 2021/11/07(日)16:47 ID:qipzvPRM(1) AAS
外部リンク:ideone.com
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
#define MAX_SIZE 100
template <class T>
// template <class T, size_t C=MAX_SIZE>
class SizeLimitedAllocator {
public:
省21
931: 2021/11/07(日)17:51 ID:ISiN+sDp(1) AAS
>>928
aggregate限定だね
932: 2021/11/07(日)17:56 ID:Mdbpk+F7(1) AAS
>>930
外部リンク:en.cppreference.com
> rebind is only optional (provided by std::allocator_traits) if this allocator is a template of the form SomeAllocator<T, Args where Args is zero or more additional template type parameters.
これですかね?
カスタムアロケータ自分で定義したことないのでじゃあどうすればいいかは分かりませんが……
933: 2021/11/07(日)18:53 ID:Qwz9shRh(1) AAS
rebind_allocが悪さしてたりして
934(1): 2021/11/07(日)19:23 ID:A2QjBZsT(1) AAS
>>930
SizeLimitedAllocatorの定義にこれ追加すればいいよ
template<typename U>
struct rebind {using other = SizeLimitedAllocator<U,C>;};
935: 2021/11/08(月)00:05 ID:dWDs4ee0(1) AAS
外部リンク[h]:github.com
この辺の定義にある
定数値という型でないものがテンプレート引数に入ったため、__replace_first_argの下側の定義が使われず
上側の定義が使用されtypeも入らず
外部リンク[h]:github.com
でrebindできなくなったことが原因でした。
これを回避するためには、>>934のように
外部リンク[h]:github.com
この下の定義に当てはまるrebind<U>::otherを定義しておく必要があるようです。
定数値でなく型がテンプレート引数に追加された場合は、otherの定義は必要ありませんでした。
936: 2021/11/10(水)17:04 ID:9a0GsOuO(1) AAS
グーグルテストのASSERTの片辺に期待値をマジックナンバーじゃなくマクロ定数で指定すると赤線引いて来やがるんだけどVSだけ?
ビルドは通るしテストもできるから全く問題ないんだけどうぜー
937: 2021/11/10(水)20:17 ID:MFJzciMu(1) AAS
warningの種類ごとにon/offしたくなる
938: 2021/11/11(木)00:05 ID:QjSth2/F(1) AAS
大体のコンパイラはそういう#pragma持ってるだろ
MSVCなら#pragma warning
GCCなら#pragma GCC diagnostic
939(1): [sega] 2021/11/12(金)12:50 ID:DicJ24/v(1) AAS
改行コードとかタブコードとかが含まれた文字列を
\nとか\tとかにエスケープしてくれる関数ってある?
940: 2021/11/12(金)12:53 ID:/M/iq88E(1) AAS
速度気にしないなら正規表現で
941: 2021/11/12(金)13:28 ID:INEjO2I3(1) AAS
quote?
942: 2021/11/12(金)14:16 ID:IjXGHyKg(1) AAS
std::replaceは?
sjisだとまずいかも
943(1): 2021/11/12(金)20:51 ID:4Xte/kSq(1) AAS
文字コード周りはカオスすぎて標準も手に負えず匙投げたからライブラリ使った方がいいよ
944(2): 2021/11/12(金)23:22 ID:qmhW9zZv(1/4) AAS
>>939
C/C++の場合、1文字単位での文字列処理が得意なので、自作するのも簡単。
0x09 や 0x0a は、SJISやUtf8などの多バイト文字の中には含まれて無いから、
なおさら。
例えば、std::stringでも、新しい文字列変数dstを作って、srcの文字列
から1バイト単位で読み取って、dstに1文字ずつ末尾追加していけばいい。
945(3): 2021/11/12(金)23:28 ID:qmhW9zZv(2/4) AAS
>>944
[具体例]
MFCのCStringなら、以下のようにするだけでよい:
CString src = "元の文字列";
CString dst; // 変換後の文字列を入れる変数。
const char *ptr = (const char *)src; // CString の 0 終端文字列の先頭アドレスを取得するための変換関数を呼び出している。
while ( *ptr != 0 ) {
if ( *ptr == 0x0a ) {
dst += "\\n";
}
省8
946(1): 2021/11/12(金)23:33 ID:qmhW9zZv(3/4) AAS
>>945
[補足]
このプログラムは、1バイトずつ読み取っているが、文字符合は、このままでも、
無修正で ASCIIだけでなく、SJISやUTF8やEUCにも対応している。
後者のような符合では、例えば、SJISの"あ"の文字だと、1文字単位ではなく、
1バイトずつ処理され、2回ループが回るが、問題ない。
UTF8だと3回ループされる。
つまり、このプログラムでは、SJISの1文字は、2文字のように
UTF8の"あ"の文字は、3文字のように処理される。
しかし、それでも結果的には問題ない。
省3
947: 2021/11/12(金)23:39 ID:qmhW9zZv(4/4) AAS
>>946
[補足2]
char は、C言語が登場した時には、「文字」の意味であったが、
今は少なくとも C言語では文字の意味はほぼなく、1バイト(8BIT)の意味である。
そして、C言語でcharが1バイト(8BIT)で無い処理系は、主流ではないので無視
してよい。
Javaなどでは、charが 必ず16BITであるのとは対照的である。
ただし、Javaもサロゲートペアの文字に対しては、charは文字の一部であって
本当の1文字には対応していない。
※結局、どの言語も、1文字を固定長で扱い続けることは避けている。
948(1): 2021/11/13(土)02:30 ID:sxA0duhG(1/2) AAS
メモリ確保が多発しそうなプログラムやね
949: 2021/11/13(土)06:30 ID:x1CN7sQN(1) AAS
老害が一生懸命考えたんだろw
メモリリークしまくられるよりマシ
950: 2021/11/13(土)07:45 ID:xg91cK1y(1/2) AAS
CStringにせよbasic_stringにせよメモリ確保の多発なんて心配しなくていいよ
JavaのStringじゃないんだから
951(1): 2021/11/13(土)08:44 ID:sxA0duhG(2/2) AAS
こういう時reserveしてなくても問題ないの?
最大容量わかってるやん。
952: 2021/11/13(土)09:34 ID:GqP7nzeW(1) AAS
メモリ2倍取るのと再配置とどっちが無駄かはそれこそ環境と目的次第だろ
953: 2021/11/13(土)11:06 ID:wYZH/w0f(1) AAS
>>945
CStringA
もしくは _T("\\t")他
954: 2021/11/13(土)11:44 ID:wZp5djKL(1) AAS
vectorもそうだけど、倍々にメモリを再配置していくアルゴリズムがそこそこ効率的なので、
たいていの場合はreserveしようがしまいが有意な差は出ないよね
955(1): 2021/11/13(土)12:34 ID:GR8tTV2x(1/2) AAS
>>943
ほんそれ
std::codecvt_utf8_utf16とか黒歴史でしかない
956: 2021/11/13(土)12:36 ID:GR8tTV2x(2/2) AAS
>>944-945
良い子は真似をしないように
957: 2021/11/13(土)12:49 ID:jQtDYU1M(1) AAS
プログラミングとしてはiso2020使ってた頃と大して変わらんよね
低レベルで吸収してくれんとやってられん
958(1): 2021/11/13(土)13:24 ID:xg91cK1y(2/2) AAS
ファイル読み取りもシステムコール側が独自にバッファリングしていることが多いから
プログラマ側ががんばってバッファリングしても二度手間だったりする
959(2): ハノン ◆QZaw55cn4c 2021/11/13(土)15:53 ID:DyUYxUU0(1/3) AAS
>>955
utf32<->utf8
utf32<->utf16
で十分だと思っていますが
というか、 utf16 自体が黒歴史…
960: ハノン ◆QZaw55cn4c 2021/11/13(土)15:54 ID:DyUYxUU0(2/3) AAS
>>958
stdio.h をディするのはそこまでだ
961: 2021/11/13(土)17:16 ID:kpA91CRo(1) AAS
文字コードなんて事実上iconvが標準だろ
せいぜいicuくらい
他は一部のプラットフォーム固有の関数くらい
制御コードはISO2022でもなければ使わんし、いうてwhite spaceの類は使われてないから気にすんな
真面目にやると文字の境界見つけんのがだるいし、合成文字の扱いも微妙、異常系の仕様も要件次第になるし、Unicodeのバージョンも無限に上がりそうだけどなw
ってわけでC++とか関係ない話だからどうでもいいよ
962: 2021/11/13(土)18:02 ID:vJfZgOKN(1/3) AAS
C++ なら strstream やろ
963(1): 2021/11/13(土)18:03 ID:vJfZgOKN(2/3) AAS
>>959
utf32<->utf8
utf32<->utf16
どちらも std:: のは黒歴史
964(1): ハノン ◆QZaw55cn4c 2021/11/13(土)18:39 ID:DyUYxUU0(3/3) AAS
>>963
そうなんですか…
なぜなんですか?
965: 2021/11/13(土)19:29 ID:vJfZgOKN(3/3) AAS
>>964
知ってるくせに
外部リンク[html]:cpprefjp.github.io
外部リンク[html]:cpprefjp.github.io
外部リンク[html]:cpprefjp.github.io
外部リンク[html]:cpprefjp.github.io
966: 2021/11/13(土)21:14 ID:aIrFEHKz(1) AAS
自分はHTML5の仕様に従って変換してます!
967: 2021/11/14(日)08:24 ID:gLhea8X6(1) AAS
>>959
結合文字列があるから、結局コードポイントに必ず1文字が対応しているとは限らないし、
何使ってもUnicodeは闇じゃないか。
まあ、UTF32使えばコードポイントがぶっ壊れることは避けられるけれども。
968: 2021/11/14(日)09:14 ID:ybz8bu8o(1) AAS
この場合同じコードポイントでの変換なわけだし一文字がどうとか関係ないが。
969: 2021/11/14(日)10:38 ID:G9ajtZXw(1/4) AAS
>>948
Perl/Ruby/JSなんかで正規表現を使って置換する場合でも、
同じようなアルゴリズムを使ってるはずだから、これが
特に非効率なわけではないし、代わりになるアルゴリズムで
これよりトータルで効率の良いものも恐らく存在しない。
1.例えば、0x0aと0x09の出現回数を最初に数えれば、必要な
dstのバイト数を見積もることは可能だが、その場合は、
二回もパースが必要になるし、プログラムも分かりにくくなる。
二回パースすることによる速度低下も有る。
2.dstのサイズはsrcのサイズの2倍を越えないので、単純に
省3
970(1): 2021/11/14(日)10:52 ID:G9ajtZXw(2/4) AAS
>>951
文字列のバッファは、不足すると2倍、2倍、・・・で確保されていくので
確保される回数は、最終的な文字列のバイト数を N としたとき、大体、
log2(N) 回程度となり、バッファがコピーされるトータルのバイト数は、
b = a + a*2 + a*2^2 + a* 2^3 + ... + a* 2^k
k = log2(N) 程度
a = 文字列クラスの内部バッファの初期バイト数。
となり、大体で言えば、2N を越えない。
1 + 2 + 2^2 + 2^3 + ... + 2^k
は 2進数で考えれば、全てのビットが 1 に成っている整数で、
省3
971(1): 2021/11/14(日)10:59 ID:G9ajtZXw(3/4) AAS
>>970
1 + 2 + 2^2 + 2^3 + ... + 2^k
= Σ_{i=0}^k 2^i
= (1 - 2^{k+1}) / (1 - 2)
= 2^{k+1} - 1
である。途中、等比数列の和の公式:
等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 )
を用いた。
972: 2021/11/14(日)11:04 ID:G9ajtZXw(4/4) AAS
>>971
誤: 等比数列の和 = 初項 * ( 1 - 公比^項数) - ( 1 - 公比 )
正: 等比数列の和 = 初項 * ( 1 - 公比^項数) / ( 1 - 公比 )
973(1): 2021/11/14(日)12:08 ID:p964tW2k(1/6) AAS
俺は数年前業を煮やして自前のstringクラスを作ってしまった(´・ω・`)
・sjis/utf8/utf16/utf32対応で比較・代入などどの組み合わせでも問題なく動く
・どの文字コードでも同じハッシュ値を生成する
・char型がsjisなのかutf8なのかはdefineで決める
・テンプレートベースのformatを用意してprintfを置き換え
みたいな
974(1): 2021/11/14(日)12:57 ID:hL5WeBkj(1) AAS
>>973
保持するときのエンコードは?
975: 2021/11/14(日)12:58 ID:p964tW2k(2/6) AAS
>>974
文字コードの種類に1バイト用意して、後はそれぞれの文字コードで直接保存している
976(1): 2021/11/14(日)13:30 ID:mwYTHPjW(1) AAS
えー
コンストラクタで各種文字コードのバイト列を受け取れるようにして内部保持形式はUTF32でよくない?
977: 2021/11/14(日)13:42 ID:p964tW2k(3/6) AAS
それだと大きめのテキストファイルを開いたときなどいちいち変換が入って遅くなりそうだから…といっても実際にはどっちが効率良いのかまでは比べてないけど
異なる文字コード同士比較する時なんかはコードポイント単位で読み出して結局utf32ベースで処理するしな…
978: 2021/11/14(日)13:44 ID:E00roTgy(1) AAS
>dstのサイズはsrcのサイズの2倍を越えない
しね
979: 2021/11/14(日)13:59 ID:5aeLrxCA(1) AAS
プログラマーは3種類しかいない
文字コードが分からない一般プログラマー
文字コードを理解したと勘違いしている地雷プログラマー
そして人類が文字コードを理解するのは不可能だと悟った上でなんとか事故が起こらないように心を砕く真の専門家だ
980: 2021/11/14(日)14:17 ID:p964tW2k(4/6) AAS
>>976
あーあとは、これのstring_viewバージョンがあって、関数のパラメータをconst mystring_view& strみたいに受けると、どんな対応してる文字なら(リテラルや対応してるクラス含めて)なんでも参照として受け付けるから便利なんだよね
981: 2021/11/14(日)14:59 ID:WpZMPVn+(1) AAS
それconst&いるんか?
982: 2021/11/14(日)15:13 ID:p964tW2k(5/6) AAS
実質的にはほとんどなにも変わらないと思うけど、無駄なコピーが減る場合もあるので付けておくに越したことはないと思う
983: 2021/11/14(日)15:45 ID:p964tW2k(6/6) AAS
まぁ、でも参照もコストゼロってわけじゃないから、場合によっては遅くなることもあるか…
984: 2021/11/14(日)16:54 ID:tkHjD9h1(1) AAS
const って伝播するから嫌い
付けるのは反対ではないが
985(1): 2021/11/14(日)17:26 ID:CXUBNW9m(1/2) AAS
伝播ってどういうこと?
986: はちみつ餃子 ◆8X2XSCHEME 2021/11/14(日)17:38 ID:A4GQ1/1N(1/2) AAS
参照で受け取るときには const を付けないと右辺値を受け取れないんだよ。
&& にしたら逆に右辺値しか受け取れないし、
テンプレートにするのも面倒くさいし、
const 参照で不都合がないならまずそれを選ぶのが常道になってる。
積極的にそうする必要はなくても手癖でやるよね。
987: はちみつ餃子 ◆8X2XSCHEME 2021/11/14(日)17:44 ID:A4GQ1/1N(2/2) AAS
>>985
const 無しから const 付きの参照へは暗黙の型変換が許されるがその逆はない。
const 付きにしたらそれがずっと伝わっていくってことだ。
元のオブジェクトが const でないなら const_cast で const を剥がして書き換えるのは一応は有りなはずだが、
かなり行儀が悪いしな。
988: 2021/11/14(日)17:59 ID:CXUBNW9m(2/2) AAS
スコープ限定のconstを欲するひとがいるとは思わんかった
989: 2021/11/14(日)18:02 ID:nLCz7RQY(1/2) AAS
責任ベースのconstは有り得るのでは?
privateが在るんだから。
990: 2021/11/14(日)18:05 ID:leu9kbhs(1) AAS
というか伝播しなかったら困るのでは?
お行儀悪くconst_castしない前提なら
ある関数の引数がconstだったら、その関数が呼び出す関数もまたconstであるという保証は大切だろうし
991: 2021/11/14(日)18:45 ID:nLCz7RQY(2/2) AAS
もちろんそれは大切ですよ。
伝搬しなかったら意味ないし。
992: ハノン ◆QZaw55cn4c 2021/11/14(日)19:45 ID:5CSGBVhH(1) AAS
K&R2 にも const はありますが全然使わなかったなあ…volatile 同様キワモノだとおもっていました(爆)
993: 2021/11/14(日)22:33 ID:oUoND4t/(1) AAS
C++20からコルーチン入るけどコルーチンの返り値に関数内の変数の参照返すの問題になるかな?
hoge& test(){
hoge tmp;
for(int i=0;i<10;++i){
co_yield tmp;
}
}
//返り値は実際はgeneratorとかになるかもしれない
994: 2021/11/14(日)22:35 ID:PetPaRNq(1) AAS
yeild使えるようになるのか
995: 2021/11/15(月)01:03 ID:tPLK0GqY(1) AAS
viewは値渡しが基本だよ
996: 2021/11/15(月)06:05 ID:Rt8JG1Np(1/2) AAS
何かのリミッタが外れた感じだね
無差別にぶち込むようになった
997(4): 2021/11/15(月)06:11 ID:Rt8JG1Np(2/2) AAS
江添が逃げた理由も察しがつく
998: 2021/11/15(月)15:55 ID:Ux5WoKB6(1) AAS
更新してないよね
999: [hage] 2021/11/15(月)16:41 ID:i/3H6iLT(1/2) AAS
hage
1000: [pow(10,3);] 2021/11/15(月)16:42 ID:i/3H6iLT(2/2) AAS
10^3
1001(1): 1001 ID:Thread(1/2) AAS
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 98日 5時間 44分 33秒
1002(1): 1002 ID:Thread(2/2) AAS
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
省4
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.266s*