X

C++相談室 part163

レス数が1000を超えています。これ以上書き込みはできません。
2022/12/30(金) 23:16:31.37ID:DPUEZfMS0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part162
https://mevius.5ch.net/test/read.cgi/tech/1667194175/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/12/30(金) 23:48:59.52ID:4Hd9NmeQ0
≫1 << 乙 << endl;
3デフォルトの名無しさん (ワッチョイ 9a69-Ejmh)
垢版 |
2022/12/31(土) 09:58:55.55ID:wqRRT9ag0
皆さまあけましておめでとうございます
今年もよろしくお願いします
今日も今日とて相談がございます

基底クラスのポインタを格納できるコンテナに押し込んだ派生クラスへのポインタから、その派生クラスのインスタンスをユニークポインタで生成し、それを規定クラスのユニークポインタに押し込んで使いたいです
std::vector<Base*> BaseCnt;
Driv1 Driv1_;
Driv2 Driv2_;
Driv3 Driv3_;
BaseCnt.push_back(&Driv1_);
BaseCnt.push_back(&Driv2_);
BaseCnt.push_back(&Driv3_);
~数々の名誉ある処理を挟んで……~
std::unique_ptr<Base> BaseUni;
BaseUni=どうにかして実体をユニポで生成する関数(BaseCnt.back());
BaseUni->Update();//ここで望んでいる挙動はDriv3のオーバーライドでございます

上記の、どうにかして実体をユニポで生成する関数、が実現できなくて困っています
template<typename T>
std::unique_ptr<Base>&& theFunc(T*t)
{
return std::make_unique<T>();
}
で行けるのかなと思いましたがいけませんでした(^^)……
そもそも基底クラスに押し込んであるため、T型で受けると基底型になってしまいます(^_^)……
どうにかして派生クラスにメモリを確保し、かつそれを規定クラスのユニークポインタに押し込めないものでしょうか?

このままでは年が越せない……
どうかおしえてください
私はc++プリミティブの混乱予約型言語でございます……
2022/12/31(土) 10:30:40.33ID:KJmYA7fT0
うだうだ長文書かんとコード全体をwandboxなりideoneなりに書いてくれや
Updateにvirtualついてないとかだったら張っ倒すぞ
2022/12/31(土) 12:27:13.18ID:GJ3jFwbSM
確かに問題点が複数ある&想定する挙動が曖昧で分からないから、コメントのしようがない。

最小限の再現コードと期待する挙動をwandboxなりideoneなりに書いてからの話だな。
2022/12/31(土) 12:49:15.56ID:vu28B3si0
>>3 こんなこと?
class Base;
using Base_Ptr = std::unique_ptr <Base>;
struct Base {
virtual ~Base () = default;
virtual Base_Ptr construct () const = 0;
};
struct Driv3: Base {
virtual Base_Ptr construct () const
{
return std::make_unique <Driv3> ();
}
};
int main () {
std::vector<Base*> BaseCnt;
Driv3 Driv3_;
BaseCnt.push_back(&Driv3_);
std::unique_ptr<Base> BaseUni;
BaseUni=BaseCnt.back()->construct ();
return 0;
}
2022/12/31(土) 18:55:55.24ID:MecdUwfcM
コメントは対応するコードの前後どちらに書く?

// 別行なら前だが
int i = 0;

int i = 0; // 同じ行なら後?

同じ行に書いてたものが変更で長くなって別行に移したら前後が入れ替わるの気持ち悪くない?
2022/12/31(土) 19:51:29.83ID:SJuvalLBd
基本、同じ行
無理があるときは前の行
2022/12/31(土) 19:52:40.15ID:SJuvalLBd
エディタの都合に合わせてたら人間向けのメモでなくなる
2022/12/31(土) 19:56:33.63ID:tNW0EEuh0
grepなどによるキーワード検索がやりやすくなるよう意識したら良い
ctagsや統合開発環境みたいな高性能な検索機能がなくても探しやすいのが理想
2022/12/31(土) 20:10:39.20ID:YncayN1e0
>>7
> 同じ行に書いてたものが変更で長くなって別行に移したら前後が入れ替わるの気持ち悪くない?
修正が面倒だとは思うけど気持ち悪くはないな
2022/12/31(土) 20:52:41.08ID:0LppXV+K0
気持ち悪いつか、気になるものは後で見ても気になるから
そりゃ気持ちよく直すでしょ
2022/12/31(土) 21:28:19.88ID:Wrtrkox0d
気持ちはわかるよ
差分ツールで見たとき差分として出ちゃうからな
2022/12/31(土) 23:41:26.87ID:Lgb5NxGE0
コメントの移動だけが (一回分のコミットとして) 差分に出るのだったらちょっと嫌な感じだけど、
周辺のコードを修正した結果として行が長くなりすぎないようにコメントの位置も変えるという話なんだから
差分ツールで見たらどうせそこらへん一帯が出るわけでしょ。
その中にコメントのちょっとした移動が含まれるかどうかなんて気にするようなもんじゃないと思うけどなぁ。
2022/12/31(土) 23:56:21.90ID:thdzMSmPd
書くべきものは横着しないで書け
書かなくてよいもので油売るな
これだけのこと
2023/01/01(日) 00:07:36.95ID:xRsGwj7i0
ところで私がよく使う言語に Scheme があって Scheme ではセミコロンから改行までがコメントになるんだけど、
Scheme の (というか主な LISP 系言語の) 習慣では状況によってセミコロンの数を変えるし
フォーマッタはセミコロンの数に基づいてインデントを変える。
https://www.gnu.org/software/emacs/manual/html_node/elisp/Comment-Tips.html
便利な習慣だと思うんだけど他の言語ではこういうのを見ないなぁ。
2023/01/01(日) 00:14:48.52ID:3UYI3pmj0
何なら、本文の途中で折り返して、行末コメントにするわ
2023/01/01(日) 03:55:44.18ID:zV40glZu0
>>16
いらんわ
全然、羨ましくない
願い下げ
19デフォルトの名無しさん (ブーイモ MMb6-vTgN)
垢版 |
2023/01/01(日) 11:42:43.03ID:83NHqx7aM
コメントを同じ行に書くことはほとんどないかなあ
そもそも1行コメントで済む処理っどんなの? コメント必要なのかな?

俺は処理の塊の前に意図など含めて長文コメントを書いてる
2023/01/01(日) 14:59:08.11ID:M9T6rHgL0
行内コメントはどこまで下げるのかと言う問題が、
  foo();         // xxxとyyyを更新
  assertIm(xxx) + Im(yyy) == 0); // 変換結果は共役のはず
--------->| 40 カラム?
-------------->| 56 カラム?

オートフォーマッター任せにしたいが定説が無さげ
perltidyだとなんか隣接する行コメは64カラム目か、それを超える場合は一番長いのに合わせてくれるが
コードの長さがかなり不ぞろいなとき罪悪感みある、
 a();  // (aのコメント)
b();  // (bのコメント)
 very_long_long_long_name_function_call_to_baz(long_long_name_param, 1234567); // (←のコメント)
2023/01/01(日) 15:01:54.19ID:M9T6rHgL0
あとif文の行内コメントも悩む、
  if (a==b)
  {
  }else
2023/01/01(日) 15:03:25.53ID:ZNJrRmgOa
・コメントは41桁目から
・一行は95桁迄

が俺のマイルール
2023/01/01(日) 15:05:17.13ID:M9T6rHgL0
あとif文の行内コメントも悩む、
  if (a==b) // ここには分岐条件のコメントを書くべき?
  {       // ここにはthen節のコメントを書くべき?
    ...
  }
  else    // else節のコメントはここでええのか?
  {      // それともここか?
    ....
  }

どう書くかによってブレーススタイルやオートコードフォーマッタとの
共存具合が変わってくるので行内コメントはいろいろ問題が多いシステム、
2023/01/01(日) 15:09:39.48ID:ZNJrRmgOa
>>21
// a と b が等しいなら...
if (a==b){
// 等しい時の処理
...
// 等しくないなら...
} else {
// 等しくない時の処理
}
が俺のマイルール
※ いないと思うけどコメントの内容にはツッコミ厳禁ね
2023/01/01(日) 15:17:33.19ID:ZNJrRmgOa
>>23
ありゃ行内コメントか...

if (a==b){ // a と b が等しいなら...
... //. 等しい時の処理
} else { // 等しくないなら...
... // 等しくない時の処理
}

確かに通常のコメントと行内コメントが混在するとモヤモヤするのはある
26デフォルトの名無しさん (ワッチョイ 6301-9yt5)
垢版 |
2023/01/01(日) 17:05:55.66ID:c0wTdgdc0
>>16
よく使うって、何に使うんだよ?
2023/01/01(日) 17:43:06.94ID:xRsGwj7i0
>>26
手癖で使えるなじんだ言語ってひとつくらいはあるもんだろ。
俺はそれが Scheme だってだけで、やってることは自動でネットを巡回したりだとか
ファイルを条件別にフォルダに仕分けしたりだとかとかいった普段のちょっとした自動化とかだよ。
28デフォルトの名無しさん (ワッチョイ 9aad-TwI4)
垢版 |
2023/01/01(日) 17:48:24.72ID:OS3h3nzh0
(真理情報)grep検索しやすいのが正義
29デフォルトの名無しさん (ワッチョイ 6301-9yt5)
垢版 |
2023/01/01(日) 18:20:59.18ID:c0wTdgdc0
ニンジャ凄いな。
全部のコア使い切ってる。
30デフォルトの名無しさん (ワッチョイ 6301-9yt5)
垢版 |
2023/01/01(日) 18:29:13.35ID:c0wTdgdc0
新しいパソコンのメリットを特に感じていなかったけど、大物をビルドすると圧倒的に速いな。
31デフォルトの名無しさん (ワッチョイ 6301-9yt5)
垢版 |
2023/01/01(日) 18:29:31.45ID:c0wTdgdc0
何か間違えたのかと思ったわ。
あまりにも早すぎて。
2023/01/01(日) 19:58:13.71ID:7cm8ugfN0
>>16
/** */ や /// を普通のコメントとは区別してドキュメンテーションに使うでしょ?
c++だったらDoxygenとか
2023/01/01(日) 20:35:59.39ID:xRsGwj7i0
>>32
へー。
そういうツールを使ったことなかった。
2023/01/02(月) 15:24:57.96ID:8fX0q33xM
>>16
フォーマッタと相性悪すぎん?
Python といい見た目の違いに意味持たせるのカスでしかない
2023/01/02(月) 17:07:12.86ID:ArPslss00
PEP8
2023/01/02(月) 17:17:16.57ID:tiICTfPp0
>>34
意味によってセミコロンの個数を変えるとそれをフォーマッタが見た目 (インデント) に反映するという話なんだけど
2023/01/02(月) 17:55:39.66ID:1k7qyNCA0
自分が理解できないものは使えない奴とか言ういつもの人でしょ
スルーでいいかと
2023/01/02(月) 19:45:33.11ID:G0Rqch2XM
>>36
すまん Scheme には普通の文末にセミコロン付ける訳では無いのね、そこ知らなくて勘違いしたわ

C++ に取り入れるならセミコロン以外の記法にする訳ね
2023/01/03(火) 08:07:29.43ID:vDbC1GAT0
>>37
必要性を感じていないものをいらんというだけだ
スルーしてもらえるならこっちも助かる

いらんつーてるものをしつこくすすめてくるな
2023/01/03(火) 08:12:15.59ID:vDbC1GAT0
忘れてもらっちゃ困るのは
C++界は新しい機能に前向きだ
待ってましたという新機能にはみんな飛びつく

凝り固まろうとしてるのと違う
特にC++11以後は断じて違う
2023/01/03(火) 08:39:47.41ID:cXTWG1PB0
誰もお前に勧めてなんてないし自意識過剰すぎるだろw
2023/01/03(火) 09:59:45.56ID:vDbC1GAT0
にわか横レスには俺も何も言ってないよ
2023/01/03(火) 11:34:31.19ID:Tocwdict0
C++11でshared_ptrが導入されて、C++に対するJava・C#の優位性がひとつ消滅したよな
2023/01/03(火) 13:45:59.96ID:BllUqxS60
10年以上も前のことを何を今更って感じもするし
std::shared_ptr以前からスマートポインタは
一般的だったから事実誤認のような気もする
特にC#が登場した2000年にはスマートポインタの利用は一般的だった
Java登場の1995年当時を知る人はいるかな?
2023/01/03(火) 14:00:08.10ID:Tocwdict0
>>44
> 一般的だったから事実誤認のような気もする

C++スレに書き込む人にとってはもちろんそうだろうけど、C++やらないプログラマにとってはそうではなかった
理解が広まるのに時間がかかる
2023/01/03(火) 14:23:27.79ID:InFt2tel0
モノとしては誰でも知ってたけど、標準に入ってるかどうかってやっぱりだいぶ違うんだよな
プロダクトでの使いやすさとか
2023/01/03(火) 15:05:23.38ID:cXTWG1PB0
>>44
1995年にはまだスマポは一般的でなかったと思う
デストラクタにdelete書きまくってた記憶がある
2023/01/03(火) 16:23:49.38ID:5xlop3x40
>>44 47
c++で言うなら前身のboost::shared_ptrの初出が1998年。
その前身のcounted_ptrの最初の提案は1994年だって。(rejectされたけど)
2023/01/03(火) 19:10:25.71ID:aAIqXg3+M
標準ライブラリのみで外部依存ありませんは結構な強みになるからな
50デフォルトの名無しさん (ワッチョイ 9aad-TwI4)
垢版 |
2023/01/03(火) 20:16:21.45ID:Tocwdict0
以下の記事、プログラマ脳なら神様の定義の変化を重視するよなあ。あるか、ないかじゃなくて。


【神様はいる? いない?】古代の人々は神をどう考えたのか?(ダイヤモンド・オンライン) - Yahoo!ニュース
https://news.yahoo.co.jp/articles/621899c69768ec530aa5377fed89908dc3eef8d4
2023/01/04(水) 00:21:00.82ID:IaYf77a90
懐かしいなboost
みんな直接WG21へ提案持っていくようになってすっかり立ち位置が微妙になっちゃった
2023/01/04(水) 01:31:15.66ID:0JWM3k/l0
そうか? 言語機能に改定が必要なことならともかく
ライブラリは実績があるほうが通しやすいし、
標準に取り込まれなくても細かな便利機能がある Boost が衰退したとは感じないな。

サードパーティのライブラリを導入する手続きが面倒というのはよくある話だから
そういう面でもカバー範囲が広い Boost の出番は多いんじゃないの。
2023/01/04(水) 01:55:44.13ID:gfVJn8560
単純に必要な便利機能はあらかたC++標準の方に取り込まれてて
もうマイナーやマニアックな機能かゴミしか残ってないから使う機会なくなったわ
なんかこれ今でも便利だよってのある?
54デフォルトの名無しさん (ワッチョイ 9aad-TwI4)
垢版 |
2023/01/04(水) 02:11:04.13ID:CtSEqK7p0
>>53
他の言語ではとっくの昔に標準化されているXMLやJSONのパーサーが標準化されたら便利になると思うよ
55デフォルトの名無しさん (ワッチョイ 6301-9yt5)
垢版 |
2023/01/04(水) 02:42:57.82ID:DBMM4FaV0
>54
1.75でBoost.Jsonが入った。
56デフォルトの名無しさん (ワッチョイ 6301-9yt5)
垢版 |
2023/01/04(水) 03:00:12.42ID:DBMM4FaV0
>>53
Boost.Beast。
2023/01/04(水) 14:34:57.16ID:q6K3KMhU0
>>53
asioとか標準には入ってないんじゃない?
serializationもたまに使う
2023/01/04(水) 14:42:05.39ID:q6K3KMhU0
>>53
小物だとlexical_castは便利だけどこれも標準にないのでは?
統計検定するのにMath Libraryの分布関数もちょこちょこ使う
2023/01/04(水) 18:00:15.11ID:CtSEqK7p0
うっかり標準化して負の遺産になってしまったiostreamでの失敗の知見のうえに今のC++があるってのはわかる
2023/01/04(水) 18:07:51.27ID:q6K3KMhU0
ところでiostreamに変わるioを作って
標準に入れようという動きはないんですか?
2023/01/04(水) 18:09:17.48ID:0JWM3k/l0
さすがに入出力の書式化を標準ライブラリとして用意しないわけにもいかんからな。
良いのが出来るまで先送りとは言えないんだからそのとき出来たものを入れるのはしょうがないんじゃないの。
2023/01/04(水) 18:18:11.23ID:0JWM3k/l0
>>60
私が把握してないけかもしれないけれどストリームの基本構造を変えようという大きな動きはない。
C++20 から書式化 (オブジェクトを文字列表現にする) は std::format として切り出されて、
書式の情報は std::formatter 型で扱うのでグローバルな状態に影響を与えるマニピュレータを使う必要はなくなった。
2023/01/04(水) 18:26:24.86ID:CtSEqK7p0
「作業ディレクトリ」という概念はプロセス全体でひとつでしたっけ。これはOS依存ですかね。
スレッド処理実行中に作業ディレクトリが変わるのは許容範囲かな
2023/01/04(水) 18:40:11.15ID:q6K3KMhU0
>>62
へーstd::formatなんてのもあるんですね
ちょっと眺めてみたけどcstdioとも
boost::formantともまた違うようですね
2023/01/04(水) 18:43:31.27ID:0JWM3k/l0
std::format の設計は Rust の std::fmt::Display と似てる感じがするね。
2023/01/04(水) 23:47:37.00ID:PU4coe7B0
iostream はよくあんなもん公開する勇気が有ったな
2023/01/05(木) 00:04:17.98ID:wM/B2eC00
当時はC with Classesなんて研究をしてる人が珍しくて
やってる人のところへ見物に来る人がぞろぞろいたんだよ

禿にとって味方をつくることも大事な仕事で
先行きがまだ見えない試みも怯まず果敢に攻める必要があった

その当時の作品を今さら未来人がドヤ顔で揶揄しても
聞いてるのは当時の人じゃなく同じ未来人だぞ
おまえ自身がどんな批判に晒されるのか怖くないの?
・・・だから匿名掲示板なのか 失笑
2023/01/05(木) 00:06:22.64ID:uFuuDD5j0
いや、発表当時から微妙な反応だったよ
ユーザーが求めてたのはオブジェクト指向で、
あんな実装じゃない
2023/01/05(木) 00:11:53.94ID:wM/B2eC00
そういう手前味噌なおも鋳込みが激しいのもこの界隈だわな
おまえさんのようなシュトロハイム型のやつの受け流し方もみんな憶えてる
2023/01/05(木) 00:12:40.81ID:wM/B2eC00
- おも鋳込み
+ 思い込み
2023/01/05(木) 00:38:06.59ID:2y5++O3y0
そんなに不満なら何で自分で作らんの?
皆不満なら公開したら支持を集められるよ
2023/01/05(木) 00:45:23.91ID:Lgp3gkNr0
PowerShellのパイプに似たコレジャナイ感でしょうかね
なお、PowerShellのリダイレクトはさらなる魔改造のために温存されている模様
2023/01/05(木) 01:10:26.32ID:TNCZWrQ40
std::formatは整数が%d、浮動小数点が%f、文字列が%sのprintfに近い書式でよかったのに…
2023/01/05(木) 06:48:29.39ID:O+NRT3S+0
>>72
PowerShell のパイプって特に変じゃ無いような気がするが...
75デフォルトの名無しさん (スプッッ Sd5a-kLll)
垢版 |
2023/01/05(木) 08:19:32.24ID:ImmyD00Ud
パイプで渡すものがオブジェクトの配列なだけならまだしも、
要素数が0と1の時だけ特別な処理がかかるのは使い勝手を損ねてるだけだぞ
2023/01/05(木) 11:10:59.66ID:Cbg+aaE9a
>>68
ほんそれ
77デフォルトの名無しさん (アウアウウー Sac7-yDM8)
垢版 |
2023/01/05(木) 11:12:50.46ID:Cbg+aaE9a
>>75
便所や下水のPipeだね
2023/01/05(木) 11:14:43.82ID:l7rjlNbZa
>>75
> 要素数が0と1の時だけ特別な処理がかかる
なにそれ?
2023/01/05(木) 11:46:32.29ID:wM/B2eC00
>>68
発表当時って西暦年で言うといつだ?
2023/01/05(木) 13:10:14.84ID:QwpX4kWAM
何を今更と思ったけど iostream 叩いとけばわかってる感出るってことなんですかね
2023/01/05(木) 13:13:50.03ID:MgmPxFQm0
>>80
それはある
実用上困ってないくせに叩いてるバカ多い
2023/01/05(木) 13:20:30.85ID:EwWOYZLWM
実用上困ったことがない程度しかio使ってないのに養護するバカが他人をバカ呼ばわりして笑える
2023/01/05(木) 14:03:21.88ID:XWvG4X+rd
実用上どう困るのかを強い説得力で話すやつを見かけないな
84デフォルトの名無しさん (アウアウウー Sac7-yDM8)
垢版 |
2023/01/05(木) 14:11:12.67ID:Cbg+aaE9a
またperlerが湧いてきたな
2023/01/05(木) 14:42:05.42ID:O+NRT3S+0
>>83
そりゃ実用上は困らんよ
iostreamなんて使わずに普通にprintfとかでやるし...
2023/01/05(木) 14:48:29.85ID:wM/B2eC00
へーえ、printfならご満足なのか
2023/01/05(木) 14:52:05.98ID:2y5++O3y0
マジで不満なら作ったらどうだ? IOくらい余裕でできるやろ?
2023/01/05(木) 15:00:05.80ID:ojGp6ksg0
printf は型システム的にガバガバすぎるだろ。
書式と実引数が食い違っててもコンパイル時に検出されないこともあるし。
2023/01/05(木) 15:19:01.89ID:wM/B2eC00
Bの関数をC++スレで持ち出してドヤァ
2023/01/05(木) 17:25:17.77ID:sQ9AithNM
はちみつはいつもprintfをdisってるが、printfには捨て難い便利さがある。
2023/01/05(木) 18:01:34.63ID:sQ9AithNM
>>90
補足すれば、cout系はメンドクサイ。書くのが非効率。
2023/01/05(木) 19:16:41.23ID:KjlTe/EQ0
仕方ないじゃん
当時はいいと思っちゃったんだから
何十年前ものアイデアを今の知見で考察しても仕方がない
93デフォルトの名無しさん (ワッチョイ 5b76-kLll)
垢版 |
2023/01/05(木) 19:55:51.72ID:N/v+WbZh0
>>78
パイプに流したオブジェクトが
2つ以上なら配列
1つならオブジェクトそのまま
0個ならnull
になってパイプ先に渡る
2023/01/05(木) 20:56:47.09ID:ojGp6ksg0
>>90
書きやすさは printf のほうがよいというのはわかる。
stream の文法がうっとうしいというのは俺だって思うよ。 それが良いとは思わん。
2023/01/05(木) 21:36:43.88ID:O+NRT3S+0
>>93
どんなコード書いてるの?
PS C:\> function x {
>> param([parameter(ValueFromPipeline=$true)]$p)
>> begin { Write-Host 'BEGIN' }
>> process { Write-Host "PROCESS: $p" }
>> end { Write-Host 'END'}
>> }
PS C:\> @() | x
BEGIN
END
PS C:\> @(1) | x
BEGIN
PROCESS: 1
END
PS C:\> @(1,2) | x
BEGIN
PROCESS: 1
PROCESS: 2
END
PS C:\>
普通に動いてるけど?
2023/01/05(木) 21:40:39.42ID:Lgp3gkNr0
iostreamは開発用ログの出力方法としては最適なんだけど、それ以上ではない感じ
2023/01/05(木) 22:43:53.60ID:QdQAlRIq0
ログ出力用に<<をオーバーロードしたら
バイナリ出力は別の手段を考えることに……
namespaceでオーバーロード内容をさらに区分するとかはできるのかどうか知らんがやりたくない、、、
2023/01/05(木) 22:50:41.68ID:Lgp3gkNr0
printfだと、見たいオブジェクトの型に気にすることなくログ関数に突っ込む、という他の言語で当たり前にできることができない。
2023/01/05(木) 23:36:19.07ID:91BZqTRI0
formatのお陰でもう議論する意味なんてないんだが、

17以前は
誰かが状態を書き換えてるかもしれないからいちいち保存と復元が必要、
文字列とコードが入り乱れていて、i18n化できない&何が書かれているかひと目で分からないから
到底実用的じゃない

会社で20が使えるようになったらiostreamに戻るよ…
2023/01/05(木) 23:43:57.03ID:ojGp6ksg0
>>97
いくつかやり方はあると思うけど……。

同じストリームにログ出力用の表現とバイナリ表現の両方を出力する可能性があるなら
適当なクラスに包むだけでいいと思う。
こんな感じで書ければ十分でしょ。

Foo bar;
std::cout << binary_style(bar) << std::endl;
std::cout << log_style(bar) << std::endl;

Haskell でこんな感じで処理を切り替えるのをよく見た気がする。
だいぶん前にちょっと遊んだだけなのであまり覚えてないけど。


出力先によって表現を変えるのならストリームクラスを定義してしまえばいいと思う。
直接的な入出力はストリームバッファがやっていて、
書式化を担当するストリームがストリームバッファを所有するという構造がある。
オブジェクトの表現形式が大きく変わるとしたら出力先ごとに変えるという用途だろうから
こっちのほうが使い勝手が良い場合も多いかもしれない。
雑な例だけどこんな感じ。
https://wandbox.org/permlink/3AaOGSXLNCw2aNJv
2023/01/06(金) 00:06:44.93ID:Pn7zd4wpM
はちみつは、何かに忖度しているように感じるな。
職人は自分の腕で食っていくので忖度しないが、就職先を探すサラリーマンは忖度する。
2023/01/06(金) 00:22:08.66ID:HDVxNHRA0
前にも書いたことがあるがワイはプログラミングは完全に趣味でやってるだけなので
プログラミングについて私が配慮すべき何者かなど存在せぇへんで。
103デフォルトの名無しさん (ワッチョイ 6301-9yt5)
垢版 |
2023/01/06(金) 00:30:02.38ID:fURAHMja0
じゃあ、はちみつ職人に改名しなよ。
2023/01/06(金) 00:32:36.82ID:Pn7zd4wpM
なんか、何かにおべんちゃらしてるような感じを受ける。
2023/01/06(金) 00:41:45.62ID:HDVxNHRA0
>>103
職人でもないが、はちみつより餃子のほうが名前として大事なので
もしも職人という言葉を入れて改名するとしたら職人餃子にするわ。
2023/01/06(金) 05:35:52.57ID:0M7CqxJ+d
NGしやすくていいじゃんよ
107デフォルトの名無しさん (スプッッ Sdba-kLll)
垢版 |
2023/01/06(金) 07:56:26.71ID:vZ5ptmnXd
>>95
@(...)は長さに関わらず強制的に配列にする書き方でしょ
2023/01/06(金) 14:14:52.53ID:Zd/Zujyt0
>>107
だからどんなコード書いてるのよ?
PS C:\> 1, 2 | x
BEGIN
PROCESS: 1
PROCESS: 2
END
PS C:\> 1 | x
BEGIN
PROCESS: 1
END
PS C:\> | x
発生場所 行:1 文字:1
+ | x
+ ~
空のパイプ要素は許可されていません。
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement
@ なくても特に変な動きとは思えないけど?
2023/01/06(金) 21:07:55.59ID:tlJIs+7i0
はいそこまで
続きやりたけりゃ↓でな

PowerShell -Part 6
http://mevius.5ch.net/test/read.cgi/tech/1644744972/
2023/01/09(月) 23:53:42.00ID:ainDXdRxH
すみません拡張子についての質問ですけどここで聞いてもいいですか?

TeraPadでコードを入力し保存したらテキストドキュメントになってしまうのですが
どうやって拡張子を変えたらコマンドブロントと繋がるのでしょうか

すみません初心者なので分かりやすく教えてください
使ってるはwindows11です
111デフォルトの名無しさん (ワッチョイ 1176-1Rsz)
垢版 |
2023/01/10(火) 00:28:45.02ID:iF453DR40
explorerの設定で拡張子を表示しろ
あとコマンドプロンプトのつもりで書いたんだろうけど「繋がる」なんて状況が想像できんので何をしたいか書け
2023/01/10(火) 00:58:24.28ID:tyEc5PEMa
TeraPad は古いから、新し目の文字コードに対応していないので、サクラエディタを使え

プロは、VSCode, Windows Terminal などを使う
2023/01/10(火) 02:05:23.85ID:wl4CEVDPa
>>110
繋がるってのがよく分からないけど、バッチを作りたいなら拡張子を表示してから .bat に変更。プログラムを組みたいなら .cp p に変更だけどmakeファイルを書くつもりはないだろうから、VisualStudioを入れよう
2023/01/10(火) 02:05:51.81ID:wl4CEVDPa
.cpp ね
2023/01/10(火) 08:11:58.57ID:j5WRYhpwM
>>110
他から指摘されているけど、初心者ならc++用の総合開発環境(IDE)をまずインストールして、IDEの初心者向けガイドをweb で検索して勉強するのが一番良い。

最近のWindowsだとVisual Studio Community Editionが初心者向きかね。
2023/01/10(火) 08:39:58.49ID:R5XG+hXYd
>>110
保存するときのファイル選択ダイアログで
[ファイルの種類]がテキスト文書になってるんじゃないか?
117デフォルトの名無しさん (ワッチョイ b101-tb1I)
垢版 |
2023/01/10(火) 19:07:54.57ID:0yW4rCRf0
C言語の重力付き4目並べです、ここのコードを簡略化したいです。

int SetXpos(int player) // コマの置き場所を入力または探して盤を更新,コマの置き場所(0-6)を返す
{
int xpos = 0; // コマの置き場所
if ((choice == 2 && player == 2) || (choice == 3 && player == 1)) // コンピュータとの対戦の場合に,コンピュータの手を計算
{
xpos = ComputeXpos(player);
printf("%sの番です\n", player == 1 ? "●" : "〇");
printf("コンピュータは%dに置きます\n", xpos);
}
else // 人間の手を選択
{
while (1)
{
printf("%sの番です\n", player == 1 ? "●" : "〇");
printf("どこに置きますか? 0-6の数字を半角で入力してください: ");
scanf_s("%d", &xpos);
if ((0 <= xpos && xpos < XMAX) && (num[xpos] < YMAX)) // 置ける場所かどうか判定
break;
printf("%dには置けません!\n", xpos);
}
}
board[xpos][num[xpos]++] = player;// コマをxpos列に置き,xpos列のコマ数を1増やす
return xpos;
}
2023/01/10(火) 19:13:34.86ID:cUqvmTMn0
スレタイが読めないのかよ
2023/01/10(火) 22:47:40.35ID:g+dbPOkMa
>>110
書いたコードをコンパイルしないとコマンドプロンプトには表示できないよ
その辺は入門書かサイトに書いてあると思う
あと繰り返す様で悪いがVisual Stdioを使うのが楽で良い
120デフォルトの名無しさん (ワッチョイ ab02-AyIk)
垢版 |
2023/01/11(水) 18:38:42.97ID:867Mv3q20
C++、Javaがペラペラなら生きていける。
121デフォルトの名無しさん (ワッチョイ 999c-RNTY)
垢版 |
2023/01/11(水) 20:16:16.63ID:tEiwqSvB0
今後はWebフロントエンドの技術もできないと生きていけないよ
2023/01/11(水) 21:38:40.44ID:pdu3v6T80
職探しがよっぽど大変なのね
2023/01/11(水) 21:58:12.26ID:dMqhutWk0
この先生きのこれるかな?
2023/01/12(木) 14:41:54.35ID:74cXnlqp0
>>123
キノコれるよ
だって先生だもん
2023/01/12(木) 14:47:05.06ID:OEyZMQ5cd
エリンギ舞茸ぶなしめじ
126デフォルトの名無しさん (ワッチョイ b101-tb1I)
垢版 |
2023/01/13(金) 06:37:30.78ID:CqT5d+dn0
@ if ((choice == 2 && player == 2) || (choice == 3 && player == 1))
A if (0 <= xpos && xpos < XMAX && num[xpos] < YMAX)
B board[xpos][num[xpos]++] = player;

C for (x = 0, y = ypos, n = 0; x < XMAX; x++)
D for (x = xpos, y = 0, n = 0; y <= ypos; y++)
E for (x = 0, y = ypos - xpos, n = 0; y < YMAX; x++, y++)
F for (x = xpos - ypos, y = 0, n = 0; x < XMAX; x++, y++)
G for (x = 0, y = xpos + ypos, n = 0; y >= 0; x++, y--)
H for (x = xpos + ypos - YMAX + 1, y = YMAX - 1, n = 0; x < XMAX; x++, y--)
の各条件文内でどーゆー計算、アルゴリズムがされてるか教えてくださる人いますか??
2023/01/13(金) 07:14:01.38ID:Y56iKvHG0
宿題ならまず自分で考えてからどうしても分からない所だけ聞きに来い
2023/01/13(金) 08:41:01.94ID:hjGlttN/d
宿題スレ行ったら?
129デフォルトの名無しさん (ワッチョイ b101-tb1I)
垢版 |
2023/01/13(金) 09:13:11.98ID:CqT5d+dn0
例えば@だと、&&が論理積、||が論理和ということだと思うんですけど、演算子が分かってもその条件文内で何が行われているかとかが分からないので知りたい状態なんです。。
130デフォルトの名無しさん (アウアウウー Sa85-DH5p)
垢版 |
2023/01/13(金) 09:44:58.05ID:NX/X2xhta
https://mevius.5ch.net/test/read.cgi/tech/1672409791/117
https://mevius.5ch.net/test/read.cgi/tech/1656984270/777
マルチ死ね
131デフォルトの名無しさん (ワッチョイ 93ad-Or7w)
垢版 |
2023/01/13(金) 11:24:51.74ID:6wgE5XmR0
boostの存在意義ってことでいうと、マルチスレッドの並列ソートboost::sort::block_indirect_sort()が使えるのでLinuxなどは有益
Windowsの場合はVC++にconcurrency::parallel_buffered_sort()があるので使わないけど
132デフォルトの名無しさん (スプッッ Sdf3-1Rsz)
垢版 |
2023/01/13(金) 11:48:47.80ID:ZURbuhIed
>>130
追加
https://mevius.5ch.net/test/read.cgi/tech/1671585518/90
2023/01/13(金) 16:10:50.14ID:ftt2O/+X0
>>129
演算子の意味がわかっているなら分からない箇所なんてないでしょ。
そのような演算が必要になる意図のレベルで知りたいということなら式単体があっても読み取れない。
2023/01/13(金) 17:16:42.47ID:DejIUh+t0
>126が宿題なら授業で演算子の評価順とか短絡評価とかやっているだろ。
ここで質問する前に授業ノートぐらい確認するなり先生に質問するなりしろよ。
2023/01/13(金) 18:59:56.28ID:NgheavAf0
払った授業料のためにも教師に聞いとけって
2023/01/13(金) 19:05:47.85ID:+0WWfi2gd
おまいら
ただのコピペだってのに
親切だな
2023/01/13(金) 19:38:21.71ID:4yurTHZ1d
マルチ警察は基本アホだから
2023/01/14(土) 17:02:55.96ID:oDbFkQuTa
普通に単にソートしたい場合はどんなコードになる?
方言なしで
2023/01/14(土) 17:03:39.93ID:euxRDNh80
std::sortを使う
2023/01/15(日) 09:58:07.55ID:/n5l5Pop0
同じく

質問の意図がわからんな
2023/01/15(日) 18:50:51.76ID:IyvDeUGt0
質問なのですがintやdoubleといった単純な型のグローバル変数の初期化タイミングは
グローバルなオブジェクトの初期化タイミングより前であることが保証される?

多分 .dataセクションの初期化はグローバルなオブジェクトの初期化リストの実行より前だと思うんだけど
(そうでなければコンストラクタからC言語のライブラリを安心して呼べないということになる
規格的にそうなん?
2023/01/15(日) 19:52:54.05ID:1ER4Wl/40
>>141
静的初期化と動的初期化に大別されている。
初期化子が定数 (定数式) のものは静的初期化で、
そうではないものが動的初期化。
静的初期化は動的初期化より先であることは言語仕様で保証される。
2023/01/16(月) 08:14:19.28ID:X/jbWDD/M
>>141
記憶が確かなら、c++の関数スコープのstatic変数は呼び出し時に初期化されることが保証されているので、初期化順を細かく決める必要がある場合は関数のstatic変数を使う。
2023/01/16(月) 23:24:41.20ID:J3mmTfbR0
>>142
レス㌧クスだいたいわかりた
この場合のconstexprの扱いがわからん……
ビルド時に定数に展開できたら静的初期化可能な範疇に含まれ得る気がするが
定数に展開で来なかったらどうするんじゃ、という気もする、

>>143
ガチで初期化順序を確実にしたい場合はシングルトンにすることを提唱する。
InterlockerCompareExchange()的なインターロック系の関数を使えばスレッドセーフにできる
(初期化済フラグがfalseならnewに進む、というのをアトミックにやる
関数スコープのstatic変数も似たような実装ではないかと予想、
2023/01/16(月) 23:26:34.64ID:J3mmTfbR0
訂正orz
×: (初期化済フラグがfalseならnewに進む、というのをアトミックにやる
○: (初期化済フラグがfalseならtrueにする、というのをアトミックにやって、false→trueに変化したときだけnewする
2023/01/16(月) 23:33:23.86ID:J3mmTfbR0
とオモタがよく考えたら初期化済フラグがfalseならtrueに変化してからポインタpにnewされるまでの間に
別のスレッドが割り込んできてpを使おうとしたら破綻するからpを獲得できるまでスピンロック的に回ることが必要やったorz
ワイの答えはこれや……!
147デフォルトの名無しさん (ワッチョイ caad-f6s+)
垢版 |
2023/01/18(水) 09:55:18.36ID:1kekdbbc0
今さらだけどさ、以下Perlソースコードみたいに初期化以外の場所で複数の変数代入を一行で記述できたら楽だよね。
($a, $b) = (1, 2);
2023/01/18(水) 10:18:29.33ID:kAps0iiP0
>>144
c++11からブロックスコープを持つstatic変数初期化はスレッドセーフだから、手動でやる必要ないんじゃない?
2023/01/18(水) 12:33:33.72ID:953Yg8XVM
>>147
それ楽なん?
2023/01/18(水) 12:45:50.93ID:f+Qa9vK4M
パターンマッチングとか単一化が欲しいという話じゃないの?
2023/01/18(水) 12:49:04.55ID:aansOABgM
複数のことやってんだから複数行で書け
それかそんなにまとまり強いならラップしろ
2023/01/18(水) 12:57:11.05ID:953Yg8XVM
俺もPerl使ってた頃に初期化で書いたことはあるけど、正直初期化以外での使い道ない気がする

rustのパターマッチは欲しい気がする
2023/01/18(水) 19:31:01.29ID:x7mTRTnwa
>>147
Perl でできるかは忘れたけどこれで交換できるのは便利
($a, $b) = ($b, $a);
2023/01/18(水) 19:47:26.33ID:ZIWa3HiO0
int a, b;
tie(a, b) = tuple(1, 2);
tie(a, b) = tuple(b, a);
一応できなくはない。交換はswap(a, b)でいいけどね
2023/01/19(木) 20:52:51.98ID:Np6xvJtm0
つauto [a, b] = tuple(1, 2)
2023/01/19(木) 20:59:17.18ID:MTxEyC+IM
書記か以外って話なんだが……
2023/01/19(木) 21:22:03.00ID:4HhHC5J20
解決方法を探しているんじゃなくて、言語仕様の変更提案なんだけど
改めてPerlだと以下のような感じ
use strict;
my ($a, $b) = ('AAA', 'BBB');
($a, $b) = ('YYY', 'ZZZ');
2023/01/19(木) 22:28:47.56ID:j0bW1DQy0
>>157
誰得?何得?
2023/01/19(木) 22:42:23.23ID:SyYOdr8r0
戻り値が1個だけ
どれを戻り値にするかで迷う

この辺はC++の欠点だと思う
2023/01/19(木) 23:07:21.11ID:j0bW1DQy0
>>159
構造体で戻せばいいですよ、KR2 から構造体の実体というかコピーが返ってきますから、それこそ3個でも4個でもお好きに
2023/01/19(木) 23:30:55.46ID:SyYOdr8r0
>>160
アホ
2023/01/19(木) 23:36:31.49ID:4HhHC5J20
複数個の変数に対する初期化のワンライナー記述(本当は初期化なので代入ではないが)が許されるなら、再初期化もワンライナー記述できていいと思うんだ
2023/01/19(木) 23:47:19.80ID:Np6xvJtm0
rvoが働くんだからタプルでも返せばいいのでは?
2023/01/20(金) 06:46:04.32ID:2AltcjPFa
>>160
このためだけに構造体定義したりするとかアホの極みだろ...
2023/01/20(金) 07:13:16.62ID:24yH8jzyd
つtuple
2023/01/20(金) 13:36:18.44ID:yONvkjD90
C++の新しい規格で複数個戻せるっての見た事あるが、気のせいか。
2023/01/20(金) 14:39:16.65ID:7GHMGQ2oM
うーん、やっぱり初期化以外での使い道がわからん
2023/01/20(金) 14:46:45.60ID:FDJF8fJ70
>>166
それは >>155 で言及 (?) されている構造化束縛 (structured bindings) のことでしょ。
返却値の数はあくまでもひとつ。
そのひとつを分割して初期値にすることが出来るのであって複数の返却値を返せるわけではない。
2023/01/20(金) 15:19:11.41ID:MVRwt7H80
戻り値の型推論の規則が厳しいせいでtupleも微妙に使いづらい
2023/01/20(金) 16:25:40.34ID:g6yuQGRiM
(x, y) = (x+y, y-x)
とか
2023/01/20(金) 16:26:57.09ID:yONvkjD90
>>168
修行いたします。mOm
2023/01/20(金) 16:50:23.92ID:FDJF8fJ70
std::tie や std::tuple ってそんなに長い名前でもないし、
C++ のややこしい文法をもっとややこしくしてまで
専用の分割代入の構文が欲しいかな?
2023/01/20(金) 17:54:27.63ID:o1hw1lmid
いらんよな
2023/01/20(金) 18:14:48.86ID:5b5Mr70bd
欠点なのは間違いない
2023/01/20(金) 18:15:46.20ID:5b5Mr70bd
C++は欠点が非常に多い
2023/01/20(金) 18:20:37.41ID:yyzNyqnf0
構造体のメンバ変数の再初期化を一行ですませたい需要、どうかな
2023/01/20(金) 18:21:31.76ID:FDJF8fJ70
それはそう。
2023/01/20(金) 18:22:22.62ID:FDJF8fJ70
C++ に欠点が多いのなんてイマサラな話だろ。
2023/01/20(金) 18:29:58.45ID:MjTZXIi3d
はちみつも欠点が多い
2023/01/20(金) 19:33:42.78ID:/4tVg7x40
要らないなぁ。

>>176
c++ならコンストラクタを定義するのが定石じゃない?
使い捨ての構造体ならtupleだし。
2023/01/20(金) 20:55:20.44ID:HgRp3cSY0
再初期化ってのがまず無いかな
2023/01/20(金) 21:12:53.47ID:bX3yX62I0
代入なら普通にあるね
2023/01/20(金) 21:59:52.24ID:vRsHomcy0
>>164
単に名前付きタプルが欲しくてもない、というか名前付きタプルは限りなく構造体に近いというだけですよ
新しいものに飛びつく前に K&R2 以来の伝統の重みを評価するべきでしょう、型推論を併用すれば記述量も抑えることができますよ
https://marycore.jp/prog/cpp/anonymous-struct-tuple/
2023/01/20(金) 22:14:16.78ID:bK8iHZlj0
>>183
で、初期化じゃなくて代入はできるの?
2023/01/21(土) 00:47:37.77ID:SJ/UeQbF0
>>176
どう書きたいのかいまいち分からん
2023/01/21(土) 10:30:12.76ID:PxhUXXTz0
>>184
今は >>159 の「複数の引数を返したい」要望に応える手段の話でしょ?
勝手に話題を広げないでね (^^)
2023/01/21(土) 10:33:35.82ID:ITn943ohd
tieって答え出てるのに気がついてないのかね
2023/01/21(土) 12:44:01.44ID:p4hNMN+0d
使いにくすぎて使われない
2023/01/21(土) 13:11:10.71ID:Wi64nLVza
>>186
元々の話は>>147
2023/01/21(土) 14:45:55.24ID:4IvYDHHD0
HOGE構造体インスタンス hogeのメンバfooとbarだけを再設定したい時に、hogeというインスタンス文字列を何度も書かずに済むような仕組みあればいいなあ
HOGE hoge = {0};
do_something(hoge);
hoge.[foo, bar] = [1, 2];
2023/01/21(土) 15:22:29.46ID:G9LOOV8U0
そういうメソッドを用意するんだよ
2023/01/21(土) 15:42:11.09ID:jQCz8FAl0
ClassName::enumElementという書き方で列挙体の要素を直接持ってこれるクラスを見かけたんですが
どうやってやってるんですか?
定義見てもよくわかりませんでした
2023/01/21(土) 15:48:28.56ID:AnImjWZM0
>>192
enum class と enum が別物だってのは知ってる?
2023/01/21(土) 15:51:00.78ID:5FsD11Dw0
よくわからんがこれのことならenumは外のスコープに漏洩するから出来る
嫌ならenum classにする

class Foo{

public:

 enum{HOGE, FUGA,};

};


int main(){

 std::cout << Foo::HOGE;
}
2023/01/21(土) 15:52:32.72ID:SJ/UeQbF0
>>192
何を書いているのかいまいち分からん
struct ClassName {
enum {
enumElement
};
};
int main () {
std::cout << ClassName::enumElement << '\n';
return 0;
}
2023/01/21(土) 20:19:12.82ID:jQCz8FAl0
説明がへたくそですみません
ClassName::EnumName::elementと書かないといけないところを、
途中のEnumNameを省略して使えるようになってます

>>193
普通のenumでした
2023/01/21(土) 20:30:34.45ID:2W6/mmpkM
普通のenumならEnumName::つかないよ
トップレベルに置いたenumもEnumName::つかないでしょ
2023/01/21(土) 20:43:48.05ID:AnImjWZM0
>>196
だとしたら enum の列挙子のスコープはその列挙型のスコープと同じになるってだけ。
C のコードを持ってきて C++ でエラーにならないように配慮したんだと思う。
2023/01/21(土) 20:44:29.11ID:AnImjWZM0
>>198
C の列挙子は C++ と違ってファイルスコープなので C で仕様に適合するものが C++ ではそうなない場合もあるけど……。
たとえばこういうのは C では通るが C++ ではエラー。

#include <stdio.h>

int main(void) {
struct foo { enum bar { baz } qux; };
int n = baz;
printf("%d\n", n);
}
2023/01/21(土) 22:18:57.09ID:SJ/UeQbF0
>>196
enumとenum classの違いは分かってるんだよね?

#include <iostream>
using namespace std;
struct ClassName {
enum enumElement {element};
enum class enumclassElement {element};
};
int main () {
cout << ClassName::element << '\n'
<< static_cast <int> (ClassName::enumclassElement::element) << '\n';
return 0;
}
2023/01/21(土) 22:54:59.54ID:jQCz8FAl0
ああなるほど、何もしなくてもC形式のenumなら列挙名省略できるんですね
危険といわれている理由が分かりました

>>200
理解できてなかった😭
2023/01/22(日) 17:51:51.29ID:mu8Nl5mu0
pythonのdecimalで2^256倍精度浮動小数点数の最大値を計算してみた。
https://ideone.com/aCP13Y

mpmathで検算もした。(桁数と先頭から千桁程度まで)

これらはC++だとどういうプログラムになるの?
メモリの容量から全桁の出力や検算は無理だと分かるが、できれば検算して戴きたい。
2023/01/22(日) 18:33:56.85ID:vg7X6MkGM
IEEE 754で規格化されてる
2023/01/22(日) 18:53:45.43ID:mu8Nl5mu0
>>203
IEEE754準拠での値で計算してみた。
pythonのdecimalのlogでも検算したので多分合っていると思うが、
C++のプログラムだとどのように計算するのかな?という素朴な疑問です。
ideoneのc++だけでできる?
GMPあたりの任意精度パッケージとか必要になるのかな?
205デフォルトの名無しさん (ワッチョイ 4376-gzmJ)
垢版 |
2023/01/22(日) 19:56:25.38ID:6lZDc9UV0
C++標準ライブラリにはないから外部ライブラリに頼ることになる

ideoneがそれ用のライブラリを持ってるか知らんから頑張って探すしかない
2023/01/22(日) 20:32:22.10ID:9f7YJXTs0
>>204
Boost Multiprecision Libraryあたりからお手軽かね。
他にあったっけ?
2023/01/22(日) 20:43:06.21ID:mu8Nl5mu0
参考にします。どうもありがとう。
2023/01/23(月) 02:24:27.76ID:6OKqnjyz0
C++って最初のバージョンはC言語で開発されましたか?
どこかその話のソースありませんか?
2023/01/23(月) 07:10:57.25ID:HN6zkKZyd
cfrontはC++をCに翻訳するトランスレータ
というのはソースにならんか?
2023/01/23(月) 08:01:54.02ID:eLWdsBBpM
>>208
「C++の設計と進化」を読め。
2023/01/23(月) 08:27:15.10ID:ntFDJsM90
C言語がC++から派生したというのは本当の話ですか?
2023/01/23(月) 09:40:42.62ID:K1n6gQar0
>>211
あなたがウソである証拠を示せばいいだけ。他者に証拠を求めてはいけない。
2023/01/23(月) 10:00:24.86ID:6gVuxkoXF
polymorphic_allocatorなんでコピーでresource伝播してくれないんだ・・・
2023/01/23(月) 13:17:00.05ID:WcsuDU3H0
>>211
C が始まったとき (1972 年) に C++ は無い。
C++ の前身である C with Classes の歴史の始まりは 1979 年で、そのときは
C のプリプロセッサとして書かれていたしあくまでも C の拡張と見なされていた。

後に C は C++ からかなり多くを取り入れることになるし
現在進行形で取り入れてもいるが、それを「派生」とは普通は呼ばない。

普通は呼ばないがそこらへんは言葉の定義の問題なので「派生」という言葉の
定義によっては無理すれば派生と呼べなくもないかもね。
2023/01/23(月) 14:21:27.16ID:6OKqnjyz0
>>209
>>210
CFrontなんてあったのですか
ヒントをありがとうございますた
2023/01/26(木) 06:18:10.77ID:nnR+UHRw0
名前付き引数標準化への動向って今どうなん
標準化はしないから各自勝手にやってねって感じ?
2023/01/26(木) 07:48:33.46ID:XZjGtAvJ0
class A{
public:
 void operator () () {...}
};

class B : public A{
 void func(){
  ここでオペレータ()を呼びたいとき、(*this)()としたら呼べますが、this→()では呼べませんでした。
  なぜでしょうか?
 }
};
2023/01/26(木) 08:02:56.89ID:HqVXg6xF6
>>217
オペレータが左右にとるのは引数でthis->だけだと型が違うから?
2023/01/26(木) 08:03:37.78ID:fdXxt+2fM
>>217
メソッド名でないから。

確認していないけど this->operator()() かと。
2023/01/26(木) 09:02:29.12ID:UDXsjb/60
メソッド
2023/01/26(木) 11:28:53.15ID:Y60o/Mze0
× メソッド
〇 メンバ関数
2023/01/26(木) 11:34:13.17ID:EgU8zvdT0
さてはDelphiやってたな
2023/01/26(木) 12:10:18.58ID:2OqTfEEK0
>>219様のやり方でできました皆様ありがとうございます
2023/01/26(木) 12:11:12.58ID:2OqTfEEK0
すみませんもう一個質問させてください。

template<class T> class A{
public:
 void f(){…}
};

template<class T> class B : public A<T>{
public:
 void g(){f();}
};

というコードがあったとき、g 内の f が undeclared identifier だというエラーが出ますよね?
T が不明だからそうなるのだと説明されてるのを見たのですが、T はコンパイル時には確定してるのになぜダメなのでしょうか。
2023/01/26(木) 12:18:25.89ID:epYCai+9d
template<>class A<void>{};
のようにf()のない特殊化をされる
可能性があるってことさ
2023/01/26(木) 12:30:19.94ID:eBsKw41eM
>>224
void g(){A<T>::f();}
かね。理由は知らん。
2023/01/26(木) 13:28:25.80ID:epYCai+9d
SFINAEに使う技
2023/01/26(木) 14:00:57.20ID:+VNq3wn00
>>226
*this→fとするにしてもA<T>::f()とするにしても長いなあと思ってしまいます
しかたがないので、Bはテンプレートじゃなくても良いように設計し直します
2023/01/26(木) 14:08:41.08ID:UQ2YAYq30
this->f で済むだろうに、設計を変えるほどのことなのか。
2023/01/26(木) 14:16:44.11ID:WpjBlsOj0
>>226
それでは>>225のケースでコンパイルできない
void g(){typename f();}
では?
2023/01/26(木) 14:17:00.65ID:WpjBlsOj0
>>226
それでは>>225のケースでコンパイルできない
void g(){typename f();}
では?
232デフォルトの名無しさん (ワッチョイ 4376-YIrE)
垢版 |
2023/01/26(木) 20:20:42.59ID:yE3XErdV0
すでに出てるけどA<T>が何者か確定してないので、
(B<int>とかの具体的な型が決まる時ではなく)テンプレート宣言時にエラーになる。

template<class T> class B : public A<T>{
using A<T>::f;
public:
void g(){f();}
};
のように親クラスA<T>にメンバーfがいることを宣言してやればテンプレート宣言自体は通る。
2023/01/26(木) 22:25:04.25ID:WpjBlsOj0
>>232
>>231
2023/01/26(木) 23:06:43.67ID:RzvFLRxY0
>>226,232も
>>225のケースで通るよな?
2023/01/26(木) 23:24:47.70ID:WpjBlsOj0
>>234
わりっ! 通る
勘違いしておった
2023/01/26(木) 23:24:56.86ID:WpjBlsOj0
>>234
わりっ! 通る
勘違いしておった
2023/01/27(金) 08:40:23.26ID:m0DNDaLC0
テンプレート引数の取得ってどうやるんでしたっけ?

template<int N = 100> class A{
 ...
};

class B : public A<>{
 ここから N (=100) が見えなくて困ってます。
};
2023/01/27(金) 08:43:39.83ID:dyzf+7Sd0
Aの中にstatic const int nankanokosuu = N;とか定義しておく
2023/01/27(金) 08:49:13.97ID:zx6ru0te0
>>237
class B : public A<>{
template <template<int> class T, int N> int func(T<N>*) { return N; }
public:
void test()
{
cout << func(this);
}
};
2023/01/27(金) 10:58:57.46ID:IAqgV/bpM
>>238
templateって結局
template構文書くより
C言語で直で書いた方が
短くて性能も良いパターンが多い
2023/01/27(金) 12:06:29.37ID:RdqQfVtbd
性能やリソースと引き換えに楽をする為のものだから
2023/01/27(金) 12:26:38.33ID:5C1cxDcZM
>>240
std::vectorユーザーが直書きとか不可能だろ。
2023/01/27(金) 12:32:39.32ID:RdqQfVtbd
丸々作る必要なんか無いんだよ
2023/01/27(金) 12:35:25.48ID:RdqQfVtbd
小規模組み込みならそもそもnewやdeleteが使えない環境もある
Cより便利な記述が出来るからC++を使うというだけ
2023/01/27(金) 12:52:45.15ID:jcVBWYEq0
>>240
>>237をC言語で直で書いたらどうなるの?
2023/01/27(金) 13:48:07.44ID:a+0fKe/I0
>>240-241 テンプレートで性能やリソースを引き換えにすることなんか無いだろ。
・・・コンパイラの処理時間やメモリ消費の話ならあると思うけど、そういう話?
247デフォルトの名無しさん (スププ Sd1f-qKKb)
垢版 |
2023/01/27(金) 13:51:05.37ID:mIJqx29Ld
マジレスすると C++ のテンプレで頑張るより
Nim 使った方が楽だし時間の節約になるよ
2023/01/27(金) 14:14:37.74ID:RdqQfVtbd
>>246
組み込みのチープな環境のプログラムを組んで見ればわかるよ
2023/01/27(金) 14:40:15.09ID:7yNCo9mI0
>>240
ヘボなんだね
2023/01/27(金) 14:50:32.81ID:MqPTrKVr0
コードサイズは確かに増えるだろうが、性能は本当に測ったんか?
2023/01/27(金) 16:10:15.39ID:k7iFif1Jd
チープな環境ではコードサイズが増えるのは致命的
2023/01/27(金) 16:17:02.37ID:a+0fKe/I0
>>248
「組み込みのチープな環境」で組んでたことあるけど、心当たり無いよ。
コードサイズだって手書きなりマクロなりでも必要量は同じになるだろうし。
何か例でも挙げてみてもらえる?
2023/01/27(金) 16:29:51.65ID:B8oMym/70
>>246
テンプレート自体が実行性能の足を引っ張るってことはないが
個々の場面でより性能よく書けるはずのときに汎用部品で済ましてしまうってことはあるんじゃない?

そういうときでも個々の箇所をいじるよりは特殊化を足すだけで済むほうが楽だと思うが。
2023/01/27(金) 16:34:12.21ID:k7iFif1Jd
同じ結果になるように書けばそりゃ同じだろう
テンプレートで楽をすればコードは(一般的には)増える

memcpyで済む物が
型別にコードが発生したり

そういう所を気にすると結局楽が出来ない
2023/01/27(金) 16:37:07.22ID:k7iFif1Jd
>>253
全て特殊化したら楽が出来ない
手間が増えるだけ
2023/01/27(金) 16:40:41.26ID:k7iFif1Jd
10種類のテンプレート引数で使うコードは
基本的には10個のバイナリが生成される

10種類手で書けば
当然コードの共通化を(人間が)考える
2023/01/27(金) 17:11:02.52ID:B8oMym/70
>>255
必要なとき、効果があるときというのは当然の前提やが。
早すぎる最適化は諸悪の根源。 雑に書いて動くようになってから必要に応じてチューニングするもんやで。
2023/01/27(金) 17:18:26.40ID:k7iFif1Jd
>>257
リッチな環境前提の発想
初めから考えないといけないチープな環境もある
2023/01/27(金) 17:22:03.06ID:6glVv8Ll0
Embedded C++やってろ
2023/01/27(金) 17:22:16.96ID:7yNCo9mI0
非力なハードで無理目なことをギリ勝負でやるときはアセンブラだろ
2023/01/27(金) 17:22:48.21ID:k7iFif1Jd
実際PC用コードの多くは組み込みでは全く使えず
ほとんどゼロからの開発になる
2023/01/27(金) 17:24:10.47ID:k7iFif1Jd
>>260
もちろん必要ならアセンブラも使うが
CやC++による最適化が先
2023/01/27(金) 17:24:25.29ID:6ZIN/roZ0
そういう環境ってそもそも標準ライブラリ揃ってなかったりしない?このスレで扱う必要ある?
2023/01/27(金) 17:25:27.76ID:k7iFif1Jd
>>263
標準ライブラリのスレではないから
2023/01/27(金) 17:32:21.49ID:k7iFif1Jd
ぬるま湯環境しか知らないはちみつ
もう少し視野を広げた方が良いかと
2023/01/27(金) 17:50:48.85ID:7yNCo9mI0
なんかやたらマウント取りたがるな
2023/01/27(金) 17:55:50.00ID:6ZIN/roZ0
学校でC++03教えてそう(笑)
2023/01/27(金) 18:01:40.26ID:B8oMym/70
ワイは Z80 時代を生きたおじさんやぞ。
いまどきチープな組み込みでも最初からそんなカリカリにチューニングするのはそんなにないやろ。
無いとは言わんけど C++ の利用例としては例外的やわ。
2023/01/27(金) 18:16:51.47ID:tKRPgB5dd
カリカリチューンとぬるま湯コーディング
はちみつの頭の中はどっちかしか存在しないのかよ
2023/01/27(金) 18:24:03.96ID:7yNCo9mI0
人のことを小馬鹿にするだけなやつ出てけよ
プログラム技術の話の邪魔だ
2023/01/27(金) 18:25:43.08ID:ESaqgTdPd
>>249が書いても説得力ゼロ
私は>>240でもないんだけど
2023/01/27(金) 18:28:51.80ID:7yNCo9mI0
は? 俺は技術の話をしている
途中で根拠も挙げずに変なことを言うやつにチクリとやったが
貴様と違いそれだけじゃねえんだよボケ
2023/01/27(金) 18:30:54.17ID:cYktn2Sdd
根拠あるじゃん
2023/01/27(金) 18:31:53.95ID:cYktn2Sdd
おれがいくつか書いた
2023/01/27(金) 18:32:25.20ID:7yNCo9mI0
どこにだよ
しどろもどろな返事だなスカタン
2023/01/27(金) 18:33:01.59ID:cYktn2Sdd
日本語読めない人かな?
2023/01/27(金) 18:38:13.74ID:7yNCo9mI0
ないものは示せないもんな
せいぜいそんな言い訳にもなってないことを勝手にぬかしてろ
俺はこれから夕飯作らにゃならんし害虫が出てくのを待つ意味でもしばらく落ちる
2023/01/27(金) 19:53:44.64ID:B8oMym/70
>>269
文脈見ろ。 それは >>265 に対して言ってんだぞ。
2023/01/27(金) 19:59:17.27ID:RxpK1TrS0
10種類とかで肥大するのはテンプレートなのにデカい関数作るからやろ
共通化できる部分は型に依存しない箇所だからテンプレートだろうと外に出せる
280デフォルトの名無しさん (ワッチョイ 6301-H6v1)
垢版 |
2023/01/27(金) 22:01:21.69ID:GkVPt6s00
>>270
それお前やろ
2023/01/27(金) 22:06:41.58ID:rBkTgp9F0
www
2023/01/27(金) 22:15:36.78ID:y5pwToDP0
孤独のグルメじゃないけど「こういうのでいいんだよ」が最適解なこと多いよな、C/C++
2023/01/27(金) 22:37:05.53ID:kTII8Zcn0
あまりゴチャゴチャさせずにシンプルイズベストよな
2023/01/27(金) 22:40:45.09ID:Tnyv3fMqM
C++20 のビューとやらを使ってみてるんだがデバッガで見づらすぎるのどうにかならん?
2023/01/27(金) 23:34:33.68ID:qVpyYaSyM
>>237
template<int N = 100> class A{
 static int nnn{N};
};
とすると、
A<123>::nnn が 123 になるはず。
static を付けない場合は、インタンスオブジェクトに対して取得できる。
2023/01/28(土) 15:20:49.48ID:x4SDzju+0
これは>>239が面白いな
2023/01/28(土) 15:29:40.57ID:ys7yM/+j0
>>286
ありがとう
誰も反応しなくてつまらんかった
2023/01/28(土) 15:40:35.35ID:x4SDzju+0
>>238
constexprの方が良いのかな?
static constexpr int nankanokosuu = N

>>285
constかconstexprかが必要
それはさておき初期化の位置に使っている中括弧 {N} はなに?
289デフォルトの名無しさん (ワッチョイ db76-xF8Z)
垢版 |
2023/01/28(土) 16:15:40.82ID:gfTDhobA0
単に初期化で使ってるだけでしょ
今回はintであることが明白だから=でも()でも{}でも初期化できるけど

この手のコンパイル時に決まるやつはstatic constexpr一択だね
array<T, nankanokosuu> a;みたいに他のテンプレート引数に使える
2023/01/28(土) 16:18:27.56ID:TUmaQinN0
constexprにするとコンパイル時に解決出来ない項目は弾かれてしまうからconstのままでいい
知らないなら余計な修正は加えるな
2023/01/28(土) 16:50:45.80ID:x4SDzju+0
>>290
>>237のケースではtemplate引数のNを受けるのだから
コンパイル時に決まっているのでは?
コンパイル時に決まっていることが含意された
constexprの方が良いと思うけど?
2023/01/28(土) 17:08:38.28ID:1oumyOI/M
>>288
>それはさておき初期化の位置に使っている中括弧 {N} はなに?
C++11位から導入された初期化の一種。
a{N}は、a = N とほぼ同じだが、縮小変換をしないということや、
「どんな場所でも必ず使える」特徴があると言われており、Stroustrup氏
は、= よりも {} を推奨している。
また、{} による初期化は「直接初期化」と関係が深く、= による初期化は
「代入初期化」と関係が深い。
2023/01/28(土) 22:18:12.18ID:x4SDzju+0
>>292
なるほどC++11以降なのね
「縮小変換」「直接初期化」「代入初期化」がよく分からんが
2023/01/28(土) 23:35:50.70ID:JY7EfERdM
>>293
「直接初期化(direct initialization)」とも関係しているが、
{}による初期化は、「一様初期化 (uniform initialization)」
で検索すると出て来やすい。
なお、ネットでdirect initializationを検索しても間違った定義が出てくるかも知れない。
2023/01/29(日) 00:27:43.05ID:2zmXfTjk0
>>294
なるほど「直接初期化」と{}による初期化(= [一様初期化])は分かった
[一様初期化] https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html
[直接初期化] https://learn.microsoft.com/ja-jp/cpp/cpp/initializers?view=msvc-170
「縮小変換」と「代入初期化」が分からん
「代入初期化」は=による初期化のことを言ってるのかな?
2023/01/29(日) 12:04:49.28ID:l1ZINGQtd
C++17のcopy elisionでルール変わったね
2023/01/29(日) 13:42:04.03ID:uP7zelejM
>>295
正しい定義かどうかは分からないが、一応、
「直接初期化」「コピー初期化」については、英語版の en.cppreference.com
をそれぞれ
「direct initialization」「copy initialization」
で検索すると「パターン」一覧が出てくるみたいだ。
ただし、一覧については「全てのパターン」かは定かではない。
例えば、direct initialization については、一覧には、new T(XXX) しか出てないが、
new T{XXX} でも良いハズ。
298デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)
垢版 |
2023/01/29(日) 13:47:49.42ID:uP7zelejM
>>297
https://en.cppreference.com/w/cpp/language/direct_initialization

T object ( arg );
T object ( arg1, arg2, ... ); (1)

T object { arg }; (2) (since C++11)

T ( other )
T ( arg1, arg2, ... ) (3)

static_cast< T >( other ) (4)
new T(args, ...) (5)
Class::Class() : member(args, ...) { ... } (6)
[arg](){ ... } (7) (since C++11)

[説明]
* (5)は、() しか出てないが、{} でも可能 :
new T(args, ...) (5)
new T{args, ...} (5')

* (3) も、() しか出てないが、{} でも可能で恐らくother でなくてもいい筈だ(定かではない) :
T ( other )
T ( arg )
T ( arg1, arg2, ... ) (3)
T { other }
T { arg }
T { arg1, arg2, ... } (3’)
2023/01/29(日) 13:56:42.30ID:uP7zelejM
>>295
>「縮小変換」と「代入初期化」が分からん
>「代入初期化」は=による初期化のことを言ってるのかな?
縮小変換は、検索すると出てくる。
「代入初期化」という言葉は、俺の記憶違いだったらしく、「コピー初期化」
が正しかったようだ。難しい。
2023/01/29(日) 14:05:48.45ID:uP7zelejM
ここが分かり易いかな:
「Is it direct-initialization or copy-initialization?」
https://stackoverflow.com/questions/46634869/is-it-direct-initialization-or-copy-initialization
2023/01/29(日) 20:57:42.75ID:2zmXfTjk0
>>299,300
なるほど「縮小変換をしない」とは
例えば以下でエラーになるってことね
int a {1.0};
「コピー初期化」ってのはコピーコンストラクタを呼ぶ初期化
あるいはコピーコンストラクタ自体のことで良いのかな?
2023/01/29(日) 23:00:33.52ID:JRnzhQFiM
>>301
>「コピー初期化」ってのはコピーコンストラクタを呼ぶ初期化
>あるいはコピーコンストラクタ自体のことで良いのかな?
個人的には、
CPerson::CPerson( CPerson const &rPeson )
の形式のコンストラクタがコピーコンストラクタで、
それを使う初期化がコピー初期化、と思って今まで生きてきたが、
それだと、「直接初期化」の対比の意味のものとは違っているように思える。
どこかで、言葉の混乱が起きているかも。
分からない。
2023/01/29(日) 23:11:23.60ID:JRnzhQFiM
>>302
一部の例外を除いては、「コピー初期化」とは、= が書いてある初期化で、
「直接初期化」とは、= が書いて無い初期化、だといわれている。
但し、沢山例外があって、
T x = T(a);
などは、直接初期化なんだそうだ。
また、return a などは、コピー初期化、なんだそうだ。
記憶に頼っているので間違っているかも知れない。
2023/01/29(日) 23:20:25.89ID:ppqTPlns0
コピコンか代入か明示するためのexplicitよ
2023/01/30(月) 01:17:26.91ID:kRDQpz8S0
>>302
コンストラクタはどれも直接初期化に使えるコンストラクタだけど
一定の形式を満たすものはコピー初期化の文脈「でも」使えるってだけ。

>>303
> T x = T(a);
> などは、直接初期化なんだそうだ。

これについて形式的にはあくまでもコピー初期化の一種ということになる。
https://timsong-cpp.github.io/cppwp/n4659/dcl.init#15
その上でコピーの省略が起きて結果的には直接初期化と同じ挙動になる。
https://timsong-cpp.github.io/cppwp/n4659/class.copy.elision#1
2023/01/30(月) 16:11:51.36ID:S2+yDPxmM
記憶に頼って書くけど、
1. 1つの引数を持つコンストラクタは、explicit修飾することが推奨されている。
2. explicit指定が無いと、そのつもりは無い「ひょんな場所」で勝手に変換コンストラクタとして
 利用されてしまうことがある。特に関数に引数を渡す場合に起き易いらしい。
3. CPerson::CPerson( CPerson &rPerson ) は、同じ型を単純にコピーする
 コンストラクタであるから、そもそも型の変換はしないので変換コンストラクタでなく、
 「コピー・コンストラクタ」と言われる。
4. つまり、CPerson::CPerson( AAA &rAAA ) のような場合に
2023/01/30(月) 16:18:21.06ID:S2+yDPxmM
>>306
[誤送信してしまった。スマソ]
4. つまり、CPerson::CPerson( AAA const &rAAA ) や CPerson::CPerson( int &rX )
 のような場合に explicit 指定することが推奨されていたと思う。

T x = T(a);

の場合、「C++のからくり」のような昔の解説書だと、最適化に任されているのではなく、
特別処理されているようなニュアンス(?)で、T x(a) と同じだと書いてあった。
もし、特別処理されてないと考えた場合、= の部分だけに着目すれば、T::T( T const &rX ) という
コピーコンストラクタの呼び出しと意味論的には考えて考えられなくも無い。
そうするとそこは「変換コンストラクタ」ではなく「コピーコンストラクタ」が使われることになる。
コピーコンストラクタはいくら使っても速度が遅くなる以外は劣化やデータの変化が無いため
無害と言えば無害。なので、explicit が付いていてもいなくても余り関係が無いような気がする。
2023/01/30(月) 16:24:16.09ID:S2+yDPxmM
>>307
[補足]
void f(T x);
に対して、
U a;
f(a);
と書くと、実引数aが仮引数xに渡される時の動作は、「コピー(?)初期化」と考えられて
いる。もしかしたら言葉は正しく無いかもしれないが、少なくとも「直接初期化」には
分類されないということ。
そしてexplicitが付いて無いコンストラクタは、このような初期化に対しては用いられ
ないことが保証されると書いてあったと思う。
2023/01/30(月) 16:25:22.84ID:S2+yDPxmM
>>308
[訂正]
誤: そしてexplicitが付いて無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
正: そしてexplicitが付いている無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
2023/01/30(月) 16:26:12.39ID:S2+yDPxmM
>>309
[再訂正]
誤: そしてexplicitが付いている無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
正: そしてexplicitが付いているコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
2023/01/30(月) 16:50:51.20ID:S2+yDPxmM
>>304
explicit指定の主な役割は、変換コンストラクタにexplicit修飾しておくことで
「変換コンストラクタが知らず知らずのうちに勝手に使われてしまう事」
を防げる、ということだったと思う。
2023/01/30(月) 16:53:41.85ID:BI3s5DYMd
regexやthreadのexplicitが邪魔
2023/01/30(月) 17:25:41.99ID:kRDQpz8S0
>>306
explicit を付けることは推奨されているわけじゃない。
推奨している人もいるけど普通は必要に応じて使い分けるよ。
明らかに変換を意味しないようなコンストラクタになっちゃうこともあるから気を付けろという程度の話。

たとえば vector は size_t を受け取るコンストラクタがある (指定サイズ分の大きさになる) がそれには当然 explicit が付いてる。
整数が vector に変換されるのは明らかにおかしいから。
char* から string への変換みたいな自然な変換では困らないし、あるほうが便利。

>>307
> 特別処理されているようなニュアンス

かつてはその場合はコピーの省略が許される (しなくてもよい) という仕様だった。 (今の仕様だとコピーの省略が必須。)
コピーコンストラクタは必ずしもコピーをするだけではなくなんらかの副作用を引き起こしても良いので
コピーの省略の有無によってプログラムの意味が変わってしまう。
プログラムの意味を変えない範囲で処理系が行う通常の「最適化」とは異なるという意味では特別扱いだ。
2023/01/30(月) 17:35:07.72ID:c/LsY66H0
難しいなぁ。。。
ubuntu の g++って 11.1以降だから、c++23だったのね。
すご って思いました。
2023/01/30(月) 19:37:46.73ID:BI3s5DYMd
C++2bはまだドラフトだよ
2023/01/30(月) 20:58:31.18ID:rMqdSurOM
>>313
>たとえば vector は size_t を受け取るコンストラクタがある (指定サイズ分の大きさになる) がそれには当然 explicit が付いてる。
>整数が vector に変換されるのは明らかにおかしいから。
>char* から string への変換みたいな自然な変換では困らないし、あるほうが便利。
なるほど。そうだったのか。
勉強になりました。
2023/02/02(木) 23:34:11.97ID:Ce1dvKO2a
C++やるとどんな言語も使えるとか言うけどNode.jsも数時間あれば使いこなせるの?
あれは言語じゃないでしょって言われそうだがjavascriptともhtmlとも違くて別言語に思えるんだけど
2023/02/02(木) 23:52:01.04ID:zSdJjx9q0
誰が言ってるの?

こっちでやるべきだと思うぞ
https://mevius.5ch.net/test/read.cgi/tech/1427572389/
2023/02/03(金) 00:10:02.14ID:GSbNqAeQ0
C++出来ます‼ってのはC言語上がりのなんちゃってチャソも含まれるから一概には言えない
2023/02/03(金) 00:27:17.07ID:cvg0vFRY0
>>317
C++ を使っていれば低レイヤの事情やシステム全体の関連を知る機会があるし、
言語処理系がどう実装されるのか (低レイヤの視線から見てどう動くのか) を知っていれば
常識的な言語デザインの感覚がわかる。 (言語仕様を類推しやすい。)
C++ を使いこなしている状況からなら色々と理解しやすいという効果がないとは言えない。

ただ、あくまでも C++ を使いこなせるようになる過程で言語自体以外にも身につくことがあるという部分が効いてくるので
C++ の言語仕様の知識はそれほど役に立つわけではないし、さすがに数時間で Node.js を使いこなせるということはない。
2023/02/03(金) 00:44:48.46ID:7WbTLk8Ha
quoraとか知恵袋とかブログで「Cの次はC++をやればオブジェクト指向身について更にCから派生した言語が主流だからどんな言語も直ぐ理解できる」みたいなの多いよ
だからこのスレの人達ならNode.jsも余裕なのかなって

>>320
学ぶ過程の色んな経験が生きるって事か。そりゃそうだよね
2023/02/03(金) 01:31:41.47ID:cvg0vFRY0
>>321
JavaScript は C 風の外観を持ってこそいるけど動的型、かつ、プロトタイプベースであるという点で
根本的に異なるメカニズムなわけでこういうのを「C から派生」と呼んでよいのかどうか……。
2023/02/03(金) 07:32:32.82ID:gaR1XNY40
よく使う言語と比べて在るもの無いもの違うわけで
ちゃんと理解しようとしたらそれなりに時間がかかるでしょ
気軽に使いこなすとか言葉にしてると怖いおじさんに怒られるぞ
2023/02/03(金) 08:03:03.43ID:HPBiMoRp0
そもそも理解しやすいと使いこなせるは別の概念やろ
2023/02/03(金) 09:08:55.43ID:b6b2xU8/0
vector<int>& a = c, b = c;
としたときに、bがcの参照になりませんでした。
&が後ろにかかるからかと思って
vector<int> &a = c, &b = c;
としても結果が変わりませんでした。
vector<int> &a = c;
vector<int> &b = c;
とすればやっと期待通りの動作になりました。
参照の宣言と初期化は複数をカンマで区切って一行で書くことは不可能なのでしょうか?
2023/02/03(金) 09:24:27.07ID:GSbNqAeQ0
え?コンパイラなに使ったの?
> vector<int> &a = c, &b = c;
> としても結果が変わりませんでした。
処理系ぶっ壊れてんのかな
2023/02/03(金) 12:28:10.97ID:31rfnruOM
c言語スレで質問したのですが
スレ違いとのことでしたので
改めて質問致します。

c言語の標準入出力ストリームの
本当に基本的なことなんですが
わからずに困っています。
教えてください。

std::ofstream stream;

ostream << "ABCEFG";

この入力した文字列の"ABCEFG"を
右側3文字を削除して"ABC"にするには
どうすれば良いのでしょうか?
2023/02/03(金) 12:36:10.39ID:l5lsJ9Ru0
カーソルをEのところに持ってきてDeleteキーを3回押す
またはカーソルをGの右の"の上に移動してBSキーを3回押す
2023/02/03(金) 13:21:17.85ID:cQeyOYIBM
>>327
質問の意味が分かりにくい。
それだと入力ではなく出力になっている。
出力したものを取り消すのは基本的に難しい。
2023/02/03(金) 13:24:04.52ID:cQeyOYIBM
>>329
[補足]
std::string str = "文字列";
の場合、
str.substr(開始位置, 取り出す長さ);
で部分文字列を作れるので、
std::string str = "ABCEFG";
の場合、
std::string str2 = str.substr(0, 3);
で str2 に "ABC" が入る。
331デフォルトの名無しさん (ラクッペペ MM4f-zLlH)
垢版 |
2023/02/04(土) 10:43:22.05ID:amDpu8JYM
>>330
回答ありがとうございます。

あれから自分でも調べて
seekp()でファイル内位置を移動するなど
試してみたのですがうまくいきませんでした。
(修正の方向はあっていると思うのですが・・)
やはり>>330さんの言う通り、テキストの削除は難しくする
何かわかりませんがそういう思想があるみたいに感じました。

そこで自分も細かい編集は別に改めて行って
結果をまとめてstreamに出力する方法に切り替えました。
結果はOK、どうもありがとうございました。

tstring_t str = _T("ABCDEFG");
str.erase(str.size() - 3);
stream << str;
2023/02/04(土) 11:10:24.50ID:e1OBQ9Uv0
>>331
それは環境依存の機能だと思う
UNIXだとmmapとか?
333デフォルトの名無しさん (アウアウウー Sa93-fxZT)
垢版 |
2023/02/04(土) 11:41:36.65ID:9C/WLP1pa
>331
seekp seekg
tellp tellg
読み込み用と書き出し用でポインタが二つあるので
自分で思ってるのと違う場所になってるのかも
方向性はあってるはず
間違ってたらすまん子
2023/02/04(土) 14:37:50.00ID:cBqi3lSD0
>結果をまとめてstreamに出力する
これで済むなら、これこそが正道
必要のない出力をして後から切り詰めるなんて愚の骨頂
そうしなきゃならない理由があるならしょうがないけど
2023/02/04(土) 16:23:00.83ID:12Q26erYd
>>331
テキストじゃなくてファイルの削除でしょ
そういう細かい言い間違いが多いから伝わりにくい文章になってると思う
ファイルに出力する前にメモリー上で編集済ますのは当たり前でファイルアクセスにはメモリよりも時間がかかるから
そういった基本を知ってたほうがいいプログラムを作れるよ
2023/02/04(土) 17:43:09.03ID:amDpu8JYM
>>335
いやファイルじゃなくてテキストですよ
右側3文字を削除って書いてるじゃないですか
何かの病気・・?
2023/02/04(土) 17:45:16.88ID:NGTrSsWja
アホの謎の上から目線
2023/02/04(土) 19:15:57.04ID:EmptyAuWd
>>336
ひょっとしてファイル上に出力した状態をテキストと呼んでるのか

メモリ上かファイル上かの区別でそんな呼び方はしない
思想とかじゃなくてメモリとファイルにはそういう性質があるってだけ
早とちりの激しい人のようだな
2023/02/04(土) 19:36:14.65ID:YYLIzwcR0
お前も人に言い間違い云々とか言う前にファイルの削除とか書くなよ...
せめてファイルのテキストから削除とか書かないと意味わからんだろ
340デフォルトの名無しさん (ラクッペペ MM4f-zLlH)
垢版 |
2023/02/04(土) 19:47:05.93ID:amDpu8JYM
>>338
いや全然違うよ、もっと基礎的な話で
C言語の標準入出力ストリームでのテキスト出力の話をしているの。
(C++の文字列クラス std::stringとはまた別)

>>327
ostream << "ABCEFG";
はテキストの書き込み処理だけど、
これをやっても内部のバッファに書き込まれるだけで
HDDファイルなどの真の書き込み先には書き込まれないの。

//ostream << std::fflush;
仮に上の関数を呼ぶことで初めてHDDファイルなどに書き込まれるの。

んで、入力されてまだフラッシュされていない文字列"ABCEFG"を
右側3文字を削除して"ABC"にするには
どうすれば良いのでしょうか?
ってのが私の質問なんです。
OK?
2023/02/04(土) 20:05:08.56ID:NNW9UvjL0
std::printってなんすか?鬱陶しいstream要らなくなりますか??
2023/02/04(土) 20:22:02.19ID:Uc49lFdn0
>>340
std::flushは呼び出し後にバッファがフラッシュされることを保証するだけで、書き込みをするタイミングは未規定(pstreamの勝手)
ostreamはoperator<<が呼ばれたそばから全部書き出してもいいし、バッファを半分ずつとか書き出してもいいしそれはostreamの自由
「入力されてまだフラッシュされていない」なんていう状態はostreamが教える義理はないし真っ当な方法では外からは観測できないしするべきでもない
ましてそれを弄くろうなんて考えるのがカプセル化を無視した間違った考え方だ
2023/02/04(土) 20:26:28.53ID:b1h/gALG0
なんだろね。std::formatだけでは効率が悪かったのかな?
2023/02/04(土) 20:26:47.52ID:KFFsFRScM
>>340
C++のSTLには、ファイルではないstreamの中に、そういう機能を持つものがあり、
atoi()の代わりに用いる例が出ていた。
それは入力と出力が可能なstreamで、文字列を出力しておいて、整数型として
入力することが出来る。
それが出来るということは、語尾を削除することも出来そう。
2023/02/04(土) 20:59:53.67ID:KFFsFRScM
全く確認できてないが、。
stringstring s;
s << "ABCDEF";
string s2;
s >> setw(3) >> s2;
で s2 に "ABC" が読み込めるかもしれない。
誰か確認して候。
2023/02/04(土) 21:06:47.02ID:e1OBQ9Uv0
>>345
-stringstring s;
+stringstream s;
で読める
2023/02/04(土) 21:10:37.97ID:KFFsFRScM
>>345
[追加]
(2)
std::ofstream ostream;
ostream << setw(3) << "ABCEFG";

(3) C++ 20 以降限定になるが、
std::format() を使う。
2023/02/04(土) 21:44:35.26ID:J5X2r1Ng0
>>340
>んで、入力されてまだフラッシュされていない文字列"ABCEFG"を
>右側3文字を削除して"ABC"にするには
>どうすれば良いのでしょうか?

"ABC"しか入力(ストリームに対する出力)されないようにするのが筋じゃねえの?
何がしたいのか
349デフォルトの名無しさん (アウアウエー Sabf-FmQs)
垢版 |
2023/02/04(土) 21:50:32.61ID:b6Tm4pTJa
そういう感じの質問こそAIに聞くと的確な答が返ってきそう
2023/02/04(土) 21:51:53.73ID:yysysFOo0
ストリームの出力を後からいじれたらそれはストリームじゃない
ただのバッファだ
2023/02/04(土) 22:20:06.17ID:dPBsul5J0
JavaはStringBufferInputStreamとかいうのがあったけどdeprecatedされてるね
2023/02/04(土) 22:39:15.87ID:KFFsFRScM
>>346
そう、stringstreamのつもりだった。
書き間違えた。
353デフォルトの名無しさん (ワイーワ2 FFbf-+IHm)
垢版 |
2023/02/05(日) 20:22:13.30ID:KKxK2YdEF
>>340
どうでもいいけどostreamはC++だぞ
2023/02/05(日) 22:02:55.86ID:leiLOsKWM
>>353
レスにはostreamの定義なんて
書いてないんだから、
そりゃどうとでもとれるでしょ
定義がどうなんて
どうでもいい話だから
無視してるだけだよ💩
2023/02/05(日) 22:15:41.89ID:vWrwcA+50
↑ 流石にこれはなにかの病気を疑わざるを得ないな
2023/02/05(日) 23:11:05.45ID:ub5/0hy90
おかしいな、C言語の<<には左シフトの意味しかないはずだが
2023/02/05(日) 23:16:38.70ID:jwd7GZbHM
そもそも、C++のSTLにstd::ostreamがある。
2023/02/06(月) 11:10:20.13ID:MSBukcfKM
>>327
stdin から ABCDEF を入力して、stdout にABC を出力するらしい例。
なお、実際には全く確認してない。

[方法1]
// 文字列変数 a の段階で3文字に切り詰められ、ABC だけが入ってくるらしい。
string a;
cin >> setw(3) >> a;
cout << a;


[方法2]
// 文字列変数 a には、ABCDEF が入るが、出力は最初の 3 文字になるらしい。
string a;
cin >> a;
cout << setw(3) << a;
2023/02/06(月) 13:24:21.21ID:KoRl3hvD0
とりあえず変数名をostreamにするのはやめなよ
2023/02/07(火) 12:29:25.49ID:UPy+Lbp7d
>>340
だから自前のバッファで操作してから書き込めばいいじゃんって話
ストリー厶の意味がわかってないんじゃない
サンプル例題ならともかくもっと実用的なアプリを使うようになったら当然そうなるしそんなとこほじくってるよりもメモリ上で操作すれば簡単だって話
2023/02/07(火) 13:30:35.63ID:3xIDowU30
ABCEFGのDが抜けてるのが気になって夜も眠れない
2023/02/07(火) 15:26:01.77ID:zqUp3ndL0
いつもの人かな?自由研究楽しそうだねー!
2023/02/07(火) 19:29:46.00ID:EcDeonqz0
聞いてるのも答えてるのもいつもの天才くんだろ
お人形遊びなら他所でやってね
2023/02/07(火) 20:46:11.42ID:gvW0HmgtM
この言語、constメンバ関数じゃなくてmutableメンバ関数だったらよかったのにと思いました。
あとnoexceptから普通に例外飛ばせるのなんとかしてください。
2023/02/08(水) 00:16:04.31ID:XAt49H4z0
try/catchが重いのもなんとかしてほしい
2023/02/08(水) 12:51:56.02ID:dBOwscE40
>>365
今は try はそんなに重くない。
2023/02/08(水) 14:01:54.37ID:ZMdgsCGCM
>>366
tryを使う場合、その関数の冒頭で、exception handler(←名前は忘れました)の
アドレスを fs:[xxx] 見たいな場所に退避したり、新しいアドレスを入れたりする
プロローグコードが挿入されるので、例外が全く発生しない場合でも、
少し遅くなる。
2023/02/08(水) 14:04:21.50ID:9Chuoarh0
重いつーより設計の悪さが残念
C++11でC++98より「マシ」になったけど
まだまだ垢抜けてない
2023/02/08(水) 14:31:26.00ID:sdVGBQKo0
そうか?
他の言語触るほど良く出来てるなと感心するけど
2023/02/08(水) 15:04:01.92ID:xSLFVKqx0
>>367 それは昔のコンパイラの話でしょ。現行だというなら具体的なコンパイラを挙げてね。
2023/02/08(水) 17:48:16.42ID:JNAb9Hi4d
x86-64は速い
x86-32は遅い
2023/02/08(水) 19:21:58.71ID:ny58eQb8M
>>370
テストしたのは数カ月前だが、使ったコンパイラは VS の大分古いバージョンだった。
だから現状どうなってるかと言われれば分からない。
2023/02/08(水) 19:41:50.12ID:ny58eQb8M
>>372
[補足]
その時にネットで検索したら、(確か)IBMのコンパイラだけは、
例外処理を行なう関数でも、追加プロローグが必要なくて、例外が発生しない
ときには全くオーバーヘッドが無い、ということだった。

VC++だと、例外処理を使う関数には以下の様なプロローグとエピローグが追加されると
思う。記憶に頼っているので大体こんな感じだった、という程度で、本当は
間違っているかも知れない。
push fs:[xxxx]
mov fs:[xxxx],その関数の例外ハンドラのアドレス
・・・
pop fs:[xxxx]
2023/02/08(水) 19:45:44.31ID:ny58eQb8M
>>367
誤: アドレスを fs:[xxx] 見たいな場所に退避したり、新しいアドレスを入れたりする
 プロローグコードが挿入されるので、
正: fs:[xxx]の中身をスタックに保存した後、fs:[xxx]に新しい例外ハンドラの
 アドレスを入れるプロローグコードが挿入されるので
2023/02/08(水) 19:53:05.57ID://IGlelw0
3レスも使って具体的な情報ゼロの無能乙
2023/02/08(水) 20:11:13.99ID:0CKFfiVb0
その程度のコードが気になるほど小さな処理を例外で囲むのはおよし
377デフォルトの名無しさん (ワッチョイ 0f02-9sAx)
垢版 |
2023/02/08(水) 21:14:42.08ID:TiunzV3b0
std::string_viewじゃダメ?
2023/02/08(水) 23:14:10.46ID:91RYCz8E0
実験もせずに聞くのもアレですが
 std::array<short, 100> x;
に対して
 *(unsigned long long*)&(x[0]) = 1ULL << 63;
とかやってもアライメント的に問題は無いの?
2023/02/08(水) 23:43:16.66ID:91RYCz8E0
問題ありそうなのでこんな感じにしたわ;;;
const static int NECONV = (sizeof(uint64_t) - 1) / sizeof(short) + 1;
union LargeInt {
  short m_small[NECONV];
  uint64_t m_large;
};
static void writeLargeInt(const uint64_t x, std::array<short, NE>& arr) {
  LargeInt u;
  u.m_large = x;
  for (int i = 0; i < NECONV; i++) {
    arr[i] = u.m_small[i];
  }
}
2023/02/09(木) 00:00:46.36ID:vSPJO8mm0
エンディアンでググれ
2023/02/09(木) 00:46:46.54ID:zt0qN6wf0
>>379
アラインというか、言語仕様上の保証という意味では最後に書き込んだ供用体メンバ意外から読むのは未定義という解釈が一般的だよ。
未定義と直接に書いてあるところもないんだけど出来ると書いてあるところもないのでこういう場合は未定義と解される。
(ただしスタンダードレイアウトで初期シーケンスが共通している箇所については OK 。)
m_large に書き込んだなら m_small として読むべきではない。

大抵の処理系では拡張として OK にしているけど細かい制約は場合によるから問題があるかないかは
処理系の都合をきちんと検証しないとわからん。

特にハードウェア寄りの仕方のない状況を除けば避けれるものなら避けたほうがよくはある。
2023/02/09(木) 08:04:31.16ID:nokdLSLo0
>エンディアンでググれ
えっ

>言語仕様上の保証という意味では最後に書き込んだ供用体メンバ意外から読むのは未定義
えっ;;;

LARGE_INTEGER共用体 (winnt.h)が使える環境でMicrosoft社製コンパイラでビルドする場合は未定義でないものとする、、、
LONGLONGとDWORDとLONG間でしか保証されないとか言われたら知らん、、、
2023/02/09(木) 08:22:03.41ID:3hUU93Bbr
>>382
未定義って言われたことに対して特定の処理系の仕様を挙げて何がしたいの?
2023/02/09(木) 08:27:19.15ID:6bPfV7hH0
>>379
union定義しなくても
temp >>= (sizeof(short)*CHAR_BIT);
でループ回せばよくね
2023/02/09(木) 12:07:03.43ID:A8pViFCvd
未定義な環境なんかないんだから
C++の規格的に未定義とかどうでもいいじゃん
どうせ特定の環境でしか動かさないコードだろうし
2023/02/09(木) 12:18:07.59ID:sPkxw56hd
#ifで環境とエンディアンで切ってしまえ
2023/02/09(木) 14:57:32.77ID:UhaInviD0
>>385
未定義な「環境」?
2023/02/09(木) 18:23:51.05ID:fimyrrlV0
特定の環境を想定してるのに、それを書かずに環境依存の質問するってほとんど釣りだよな
2023/02/09(木) 20:52:22.51ID:Fa1ce0CQ0
>>387
俺も思った
パワーワードだねw
2023/02/09(木) 21:21:46.36ID:/jyJY61Z0
おまいら読解力ゼロかよ
2023/02/09(木) 21:25:28.79ID:Fa1ce0CQ0
自分の意見主張を伝えるのは自分の責任
伝わらないのを人のせいにしたり人格攻撃したからって伝わりはしない
無駄で愚かな行為だ
2023/02/09(木) 21:29:41.32ID:/jyJY61Z0
ばか
2023/02/10(金) 12:00:14.43ID:rXRs96IF0
CHAR_BITってC++でもレガシーじゃないの?
2023/02/10(金) 12:35:42.19ID:ntA0RsMN0
「レガシーである」の定義が不明。
2023/02/10(金) 12:57:47.33ID:rXRs96IF0
例えばnumeric_limits<double>::infinity()を使うべきところでHUGE_VALを使うと
このジジイは・・・てなるようなこと

CHAR_BITを使うとこのジジイは・・・ってなる人は何使ってるのかって
2023/02/10(金) 13:11:57.08ID:ntA0RsMN0
numeric_limits<unsigned char>::digits なんだろうけど、圧倒的に記述が煩雑で
CHAR_BIT のほうが書きやすく読みやすいいから、「このジジイは・・・」と思う人が居ても
使えるところでは気にせず使えばいいかと。
2023/02/10(金) 13:27:44.87ID:ETMiF/8h0
#if で切り分けるのに使う定数はマクロで定義されていないといけないんで使いどころはある。
2023/02/10(金) 14:22:36.26ID:rXRs96IF0
>>396
numeric_limits<unsigned char>::digitsか・・・何かやだな
1バイトのビット数は実行環境そのものが持つ特性なので
unsigned charと特定の型識別子を書きたくない

>>397
if constexprというのもあるね
2023/02/10(金) 14:41:42.45ID:ETMiF/8h0
>>398
if constexpr は文を書けるところじゃないと使えないんで定義 (宣言) を切り替えるようなことができない。
この手の切り替えは割とごそっと切り替えることになると思うのでマクロは要るよ。
2023/02/12(日) 14:56:19.98ID:wUCNDItd0
template <class T , unsigned int pos , unsigned int len = 1>
struct bit_mask{
static constexpr T mask = ~( ~static_cast<T>(0) << (len) ) << pos;
// その他の処理
}

特定のビットをマスクする処理がしたくて↑のようなテンプレートクラスを作成したのだけど
warning: left operand of shift expression '(-1 << 1)' is negative [-fpermissive]
の警告が出てしまう

この警告が符号あり整数型を左シフトしてはいけないというのは分かるので、Tが必ず符号なし整数型であることを明示したいのだけどどうしたらいいだろう?
特殊化すると符号なしのバイト幅毎に処理を描かないといけなくなるし、もっと簡便なほうほうがあったりするのでしょうか?
2023/02/12(日) 14:59:59.76ID:b/cm1PRG0
>>400
std::is_unsigned
2023/02/12(日) 16:21:40.75ID:JClhsLo90
>>400 ((static_cast<T>(1) << len) - 1) << pos じゃダメかな?
2023/02/12(日) 16:47:42.70ID:37/dTLGh0
>>402
オーバーフローする
404デフォルトの名無しさん (ワッチョイ eb01-QMhD)
垢版 |
2023/02/12(日) 17:18:17.77ID:mwZX9mma0
Tをunsignedにするんだよね?
ぐぐったらstd::make_unsignedとかいうのがあった
2023/02/12(日) 17:33:12.94ID:bx1Kk0PX0
Tがunsignedの場合だけ許可したいならrequires std::is_unsigned_v<T>
C++17以下でコンセプト使えないならstd::enable_ifでも使おう

無理矢理signedにして問題握り潰せって奴だらけで震える
2023/02/12(日) 18:15:39.19ID:JClhsLo90
>>403 そこは >400 でも同じなのでは?
407デフォルトの名無しさん (ワッチョイ 3b7d-zpWe)
垢版 |
2023/02/13(月) 03:17:46.41ID:cPd3izqQ0
この手の警告/エラーはテンプレートを実装しただけでは出なくて、
テンプレートの実体化をした時にテンプレート実装部に警告/エラーが出るからややこしいんだよな

unsignedしか受け付けない前提で書いたコードをsignedで実体化するからこうなる

黙って内部でunsignedにするか
(using U=std::make_unsigned_t<T>; で全部U型で演算する)
signedをそもそも受け付けないか
(>>405 みたいにrequiresで受け付けるTを制限する)
の2択
408デフォルトの名無しさん (ワッチョイ eb01-QMhD)
垢版 |
2023/02/13(月) 06:42:50.66ID:Z5uQ91Hr0
そもそも「符号なしであることを明示」とか書いてるけど
俺が試した限り符号ありで実体化しないと出ないんだよな>>400の警告は
409デフォルトの名無しさん (スフッ Sdaa-AGaU)
垢版 |
2023/02/13(月) 10:38:37.81ID:vihtyFuzd
C++素人です
すみませんが、どなたか教えてください

こんなテンプレート関数があったとして、const を消す方法はないですか
const付いてても付いてなくても int* とか char* だけを判別したいので
毎回,余分にconst 判定入れるのだるいです

std::remove_const_t<T> とか試しても上手くいかないのでググってみたら、最上位じゃないので出来ないうんたらとか書いてあって...
最上位じゃないconstを外す方法があれば教えてください...

template<typename T>
auto function(T, t) {

  if constexpr (std::is_same_v<T, int*> || std::is_same_v<T, const int*>) {
   ...
  }
  else if constexpr (std::is_same_v<T, char*> || std::is_same_v<T, const char*>) {
   ...
  }
  ...以下、同パターン
}
410デフォルトの名無しさん (ワッチョイ eb01-QMhD)
垢版 |
2023/02/13(月) 10:50:31.38ID:Z5uQ91Hr0
std::is_same_v<std::remove_const_t<std::remove_pointer_t<T>>, int>
2023/02/13(月) 10:52:33.56ID:/W47z0NL0
>>409
>std::remove_const_t<T> とか試しても上手くいかないので
std::remove_const<T>でできるけども?
2023/02/13(月) 10:56:46.31ID:FEO/Fb/70
constexprなんだからどうやっても外せないだろ
2023/02/13(月) 11:05:28.80ID:FEO/Fb/70
いや、出来るか
2023/02/13(月) 11:14:03.33ID:FEO/Fb/70
コンパイラバージョンの違いかな
remove_const<T> //C++11
remove_const_t<T> //C++14
415デフォルトの名無しさん (ワッチョイ eb01-QMhD)
垢版 |
2023/02/13(月) 11:27:21.16ID:Z5uQ91Hr0
template <class T>
using remove_const_t = typename remove_const<T>::type;

typenameと::typeを省略するためのただのエイリアスやで
2023/02/13(月) 11:33:32.46ID:FEO/Fb/70
remove_const_tがコンパイラ通らなければremove_const<T>::typeと書けば良いと
2023/02/13(月) 13:02:27.22ID:B+Tt2JJW0
GCCもVCもデフォでC++14だかんな
418409 (スフッ Sdaa-AGaU)
垢版 |
2023/02/13(月) 13:15:51.58ID:vihtyFuzd
>>410
ありがとうございます
上手くconst int* は拾えましたが、それだとただのint も拾ってしまいました
ポインタ のみ拾いたいです

環境書いてなかったです
VisualStudio のVC++で、設定はC++最新版です
2023/02/13(月) 13:32:25.61ID:FEO/Fb/70
少しは自分で考えたらどうなの?
2023/02/13(月) 13:41:00.86ID:FEO/Fb/70
!std::is_same_v<std::remove_const_t<std::remove_pointer_t<T>>,std::remove_const_t<T>>
421418 (スフッ Sdaa-AGaU)
垢版 |
2023/02/13(月) 14:00:14.31ID:vihtyFuzd
>>420
すごいです、出来ました
ありがとうございました!
自分は馬鹿すぎてこんなの思いつけないですが….勉強続けます、感謝
2023/02/13(月) 14:16:09.00ID:FEO/Fb/70
考えたら出来るようになる
ガムバレ
2023/02/13(月) 14:55:08.76ID:TwATZYDk0
何がどう「出来ました」なのかよくわからないけど、 >409 を見る限りは
auto function(const int*), auto function(const char*) のオーバーロードで分けたほうがマシな
ものに見えるな。
2023/02/13(月) 17:23:27.09ID:v/vixYv70
そこまでして本当にテンプレートが必要か?って考える必要があると思うわw
殆どがテンプレートなんて必要ないだろw
425デフォルトの名無しさん (スッップ Sdaa-zpWe)
垢版 |
2023/02/13(月) 18:18:43.60ID:vSfDWYC1d
関数外にテンプレート1つ置いてしまった方がシンプルになるがね
constを消すではなくなるが

template<class T, class TTarget>
constexpr bool pointer_or_constpointer_v =
std::is_same_v<T, TTarget*> ||
std::is_same_v<T, const TTarget*>;

template<class T>
auto func(T t){
if constexpr(pointer_or_constpointer_v<T, int>){
...
}
}
2023/02/15(水) 13:51:43.45ID:vrVppx/z6
困っています.助けてください.

まず作りたいものを以下に記します.

クラスObjのオブジェクトが構築されると,
そのオブジェクト内でクラスObjのオブジェクトが0~2個生成される.
(生成されるオブジェクトの個数は一様乱数で決定される)
結果的に木構造のようなデータ構造になる.

クラスObjのオブジェクトはシリアルナンバと自分を作ったオブジェクト(親)へのポインタを持っている.

クラスObjは自分を作った親をたどることで,どのようにして(どのオブジェクトを親として)生成されたかを知ることができる.


で,作ってみたものを以下に張り付けておきます.

https://wandbox.org/permlink/lXq19mN1URMQhyh5

上記のプログラムで発生している問題を以下に記述します.

起点となるクラスObjのオブジェクトobjが生成された時点では,
各オブジェクトは自分自身を生成してくれた親オブジェクトへのポインタを正しく保持しているようなのですが,その後,メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがあるようです.

なにがいけないのか,どうすれば意図した通りに動いてくれるのかご教授くださると助かります.

よろしくお願いいたします.
2023/02/15(水) 14:37:38.33ID:u0VdKeZj0
>>426
警告が出ているのになぜ直さない? それがすべてじゃないの?
2023/02/15(水) 16:15:28.85ID:vrVppx/z6
>>427
>>>426
>警告が出ているのになぜ直さない? それがすべてじゃないの?

メンバ関数rootsの型をvoidにして、return文をコメントアウトすれば警告は消えます。
しかし発生している問題は解決しません‥

ご指摘の件は本質的問題ではないように思われます。

引き続きご教授をお願いいたします
2023/02/15(水) 17:54:06.96ID:jBF4rRuI0
55行目にchildObj.reserve(2);を入れろ
また、人にコードを示すなら本質的に関連のない警告が出ない状態のコードをまず貼れ
2023/02/15(水) 18:19:34.79ID:M3Yzq8DS0
警告警察うざい
警告を消す為にバグを仕込むヤツを何度も見てきた
2023/02/15(水) 18:20:49.58ID:M3Yzq8DS0
警告が出るかどうかは環境による
C++のルールに従っているなら警告は無視
2023/02/15(水) 18:29:25.36ID:QsOS31DQ0
>>428
そっちじゃないよ
戻り値型はそのままでよくて、elseの場合に値を返せてないから返す
あと42行目のイテレータループの終了条件の書き方も違う、!=を使え
2023/02/15(水) 19:15:06.12ID:bwjUnWHEM
>>426
バグを調査するときの重要な考え方として「バグが確実に再現する条件/確実に発生しない条件を明確化する」というのがある。

この場合も、まずはバグ「メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがある」の条件を明確化するために「訳の分からないアドレスはどの変数に入っているのか」「訳の分からないアドレスはどういうバケツリレーで渡されているのか」「訳の分からないアドレスは最初にどこにあるのか」あたりを明確化するのがよろしいかと。

そもそも>>426で「メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがある」は再現するの?
2023/02/15(水) 19:33:01.86ID:QsOS31DQ0
ああemplace_backしたときにchildObjが再確保されてparentが古いObjを指したままになってるのか
だから>>429が正解ですね
2023/02/15(水) 19:57:27.07ID:LxP0k8m20
謎の上から目線で質問するやし多くね
436デフォルトの名無しさん (スッップ Sdaa-zpWe)
垢版 |
2023/02/15(水) 20:25:17.26ID:sKFuDIvBd
>>426
> control reaches end of non-void function
voidじゃない関数がreturnせずに終わってる

この表現なら理解できるか?
2023/02/15(水) 20:43:32.06ID:aDsLy0wQ0
こんなプログラム見ていると頭痛くなるw
2023/02/15(水) 21:25:47.83ID:SA6Um8/R0
>>430
ほんこれ
2023/02/15(水) 22:04:10.79ID:3ATKFMkE0
>>437
>こんなプログラム見ていると頭痛くなるw

誠に申し訳ない。
なんせ、近くにメンターがいないので自力でなんとかせにゃならんのです。

既にいくつか助言をいただいているので、もう少し頑張ってみます。

ゆるゆる見守ってくださると嬉しいです。
引き続きよろしくお願いいたします。
440デフォルトの名無しさん (ワッチョイ ff9c-nJVz)
垢版 |
2023/02/15(水) 22:07:21.36ID:k8KlMP7i0
なんでこんなに偉そうなの
2023/02/15(水) 22:10:23.23ID:3ATKFMkE0
>>431

環境はvisual studio pro 2019で、皆様のご助言を仰ぐためにwandboxに貼りました。

警告に関しては、あまり気にせずコーディングしています‥
よくない癖、ですよね(汗)
2023/02/15(水) 22:13:56.75ID:3ATKFMkE0
>>429
>>434

明日以降に試してみます。
まずはreserveを調べるところから。
ポンコツ過ぎで申し訳ないです。
2023/02/15(水) 22:14:34.95ID:eQXhj1Qw0
>>430
> 警告警察うざい
未だにこんなやつが要るんだな...

> 警告を消す為にバグを仕込むヤツを何度も見てきた
それはお前の周りのレベルが低すぎるだけじゃね?w
2023/02/15(水) 22:18:19.81ID:3ATKFMkE0
>>433

どうやら、再現性はあるようですが、私のスキルではどのような状況でバケツリレーが辿れなくなるのか、到底できないのです。

よいアイデアがあればご教示くださると大喜びします。
2023/02/15(水) 22:35:45.35ID:3Nk0h2mJ0
警告は潰さなければならない

警告が出たら検討しなければならない
今回の様に思いっ切りバグを示していることがあるから

検討した結果無視していいと判断しても、警告自体は消さなければならない
そのままじゃ次のビルドでまた出て、どんどん溜まって「これ検討したんだっけ??」ってなるから
この警告消しは#pragma warningでいい
2023/02/15(水) 22:42:19.58ID:YqKefIHG0
警告消すのにバグ仕込むスキルの人なら機能追加してもバグ仕込むだろ
2023/02/15(水) 23:06:20.39ID:Xq18TORR0
ここは20年前のままで安心した。久しぶりにC++読んだけど、普通に読めたわ。
どうでもよい会話をして、ろくに進まない感じ流石です。
2023/02/16(木) 00:34:35.79ID:G6Y1BfCz0
じゃあまた20年後な
2023/02/16(木) 00:46:09.85ID:N10j/iiy0
https://jp.quora.com/%E9%96%8B%E7%99%BA%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%81%A6-%E4%B8%8A%E5%8F%B8%E3%81%AB%E8%81%9E%E3%81%8F%E3%81%A8-%E3%81%A1%E3%82%83%E3%82%93%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92
まさにこれじゃん
2023/02/16(木) 02:31:44.69ID:PGUS078z0
>>444
問題が発生したら乱数のシードをそのとき使った値で固定する
そしてデバッガの使い方を覚える
https://learn.microsoft.com/ja-jp/visualstudio/debugger/getting-started-with-the-debugger-cpp?view=vs-2022
2023/02/16(木) 07:13:21.97ID:kLJI764s0
> この警告消しは#pragma warningでいい

警告警察の主張の本質がこれ
2023/02/16(木) 07:57:43.18ID:ZOPwX+PA0
www
2023/02/16(木) 08:05:05.35ID:u8Mt8J3eM
>>443
こういうやつが居るから、管理側は「勝手に警告を無視できないRustにしよう」と言い始めるんだよねぇ。
実際、コードの精査の難しい大規模プロジェクトとかだと、無能が成果を出せないという意味で効果的だし。
2023/02/16(木) 08:13:16.28ID:ZOPwX+PA0
設計がまともかどうか判断出来ない無能が警告を気にする
2023/02/16(木) 08:15:20.48ID:LB1U3BvE0
>>451
> 検討した結果無視していいと判断
を無視する無能
2023/02/16(木) 08:17:32.72ID:ZOPwX+PA0
アホが検討した結果など無意味
2023/02/16(木) 08:20:22.98ID:LB1U3BvE0
>>456
それは
> 警告を消す為にバグを仕込むヤツを何度も見てきた
みたいな職場の話だろw
2023/02/16(木) 08:20:39.33ID:u8Mt8J3eM
>>444
まずは>>450

あと「訳分からないアドレス」というレベルなら生ポインタは使わない方がいいので、すべてshared_ptrに置き替える。
というか、他人の古いライブラリを使わざるを得ない状況でもなければ、生ポインタは禁止にすべき。
2023/02/16(木) 08:24:11.83ID:ZOPwX+PA0
別の環境に移植して警告が何千個も出て来たら
わざわざ全部消すの?
アホじゃね?
2023/02/16(木) 08:28:56.23ID:ZOPwX+PA0
「検討しました」は解析ツールのコメントに残す物
わざわざコードを変えて消す物じゃない
2023/02/16(木) 10:01:01.26ID:LB1U3BvE0
>>459
消すだろ
てか、何も見ずに警告無視するのかよw
2023/02/16(木) 10:03:35.75ID:G6Y1BfCz0
メモリがわからないままC++してもいずれ破綻するのは目に見えてるからな…
shared_ptrを使えば再確保によるポインタの無効化は回避できるかもしれんけど、
そしたら今度は循環参照にはまりそう
2023/02/16(木) 11:32:34.13ID:u/aa82YP0
>>445
>>446

まさにコレでした。

皆様の叡智に脱帽です。
感謝します。

C++って便利だけど難しい局面がすぐ横にある感じでスリリングですね。
そう感じるのは慣れないうちだけなのかもしれませんが。
2023/02/16(木) 11:42:26.72ID:u/aa82YP0
>>458

>あと「訳分からないアドレス」というレベルなら生ポインタは使わない方がいいので、すべてshared_ptrに置き替える。

もともとC言語を触っていたので生ポの方が好きなんです。
でも、スマポに統一すべし、という意見には賛成なので、その様に直すつもりではおりますが、
 enable_shared_from_thisを継承せよ
とか、一方で
 コンストラクタ内でshared_from_this()は使うな
とか、色々クリアせねばならない問題もあり、解決には相当な勉強が必要そうで、時間がかかる見込みです。
2023/02/16(木) 12:24:54.96ID:zXNtK8a2d
自分の頭で考えることを放棄してるやつほど
偉そうにしてるやつの言うがままに洗脳されやすい
2023/02/16(木) 12:25:33.04ID:OOEMlbNYM
>>464
スマートポインタ&参照を使わないならcで十分な気がするなぁ。

むしろcにスマートポインタと参照だけでも追加してほしい。
2023/02/16(木) 12:43:03.84ID:u/aa82YP0
>>466

C++って何だかカッコいいじゃないですか。
noexceptとかC言語な人には無縁なキーワードが盛り沢山だし、いかにもアタマ良さそうな雰囲気がたまらんのです。

C言語でできることはC++でもできるようになりたいな、とゆるゆる独学している次第です。
2023/02/16(木) 13:36:26.42ID:juZ9Em/90
人が書いた部分で警告大量に出るから無視してるんだが
お前ら一人で書いてんのか?
2023/02/16(木) 13:38:12.19ID:kLJI764s0
一番大事なものをちゃんと持ってるな
応援するぜ
2023/02/16(木) 13:39:41.99ID:kLJI764s0
>>468
大量に出る警告には何か原因がありそうなので
それをまず調べる
2023/02/16(木) 13:54:28.24ID:G6Y1BfCz0
>>464
そもそもコンストラクタで子供のインスタンスを作らないほうがいいんじゃね?
2023/02/16(木) 14:00:08.48ID:UCNi870E0
何のために警告出させてんだよ
端からガン無視する気なら、コンパイルオプションで警告止めちゃえよ
473デフォルトの名無しさん (ワントンキン MMfa-EB70)
垢版 |
2023/02/16(木) 14:05:54.88ID:gmYGasSwM
まさにコレでしたって結局どう直したの?
2023/02/16(木) 14:30:11.87ID:G6Y1BfCz0
あとchildObjから削除しないなら、ポインタを辿って探索せんでも、
シーケンシャルナンバーでランダムアクセスすればいいじゃんねぇ
2023/02/16(木) 14:32:02.54ID:G6Y1BfCz0
ああ、インスタンスデータなんか…すまん忘れてくれw
2023/02/16(木) 15:58:03.67ID:INPRljPt0
>>466
「だけでも」っていってもそれに連なる諸々の概念がひっついてるから部分的にやるのは難しいんだよな。

C++ のスマートポインタはクラスとして実装されてるから C++ の型システム抜きに
スマートポインタだけ C に移植ってわけにはいかないし、
参照の振る舞いを説明するには値カテゴリを増やして場合分けしなきゃならんし。
2023/02/16(木) 16:08:00.45ID:u/aa82YP0
ええと、最終的にはファイルから与えたデータに基づいて木構造を構成し、その木構造でナニかしようということを目論んでまして、そうなるとコンストラクタ内で子供のインスタンスを作ればいいんじゃないか、と考えた次第です。

データをあるオブジェクトに喰わせたら、勝手に木構造が出来上がるようにしたかったのです。

で、そのプロトタイプを作る段階でつまづいていた次第です。

とりあえず、皆様のご助言で動くようになったものについては明日以降にw
andboxに貼ります。

引き続きご指導をお願いいたします。
478デフォルトの名無しさん (アウアウウー Sa4f-STvZ)
垢版 |
2023/02/16(木) 16:40:39.41ID:5AcA3bi5a
>>463

>C++って便利だけど難しい局面がすぐ横にある感じでスリリングですね。
>そう感じるのは慣れないうちだけなのかもしれませんが

君は C++ を使ってはいけないレベルと言わざるを得ない
2023/02/16(木) 17:06:59.28ID:hcbjKjsO0
std::mapのinsert()すると、std::vectorみたいにキーや値のメモリ再配置って起きる?
2023/02/16(木) 17:34:19.19ID:of28AX7H0
>>476
メモリ管理だけコンパイラ側でやるなら、クラスその他諸々は無くても大丈夫じゃない?
2023/02/16(木) 17:44:16.85ID:hcbjKjsO0
>>480
回答どもです!そのようですね。
海外のサイトで調べたら、mapの場合はinsertしても
それ以前に挿入した要素のメモリは移動しないようですね。
482デフォルトの名無しさん (スッップ Sdaa-zpWe)
垢版 |
2023/02/16(木) 17:51:19.65ID:OTlvZlbDd
最終的にはメモリ領域の所有権に行き着くはずだが
Cでどうやって所有権の貸し出し/譲渡を表現するんだよ

所有者が複数になる場合もあるんだぞ
2023/02/16(木) 18:34:49.77ID:RFcoGR7kM
>>479
C++はmapはB木を赤黒木で実現しているから、アルゴリズム的には、既存の
ノードのアドレス自体は変えずに、ノードのつなぎ方だけを変えるはず。
ソースを見ないと分からないが。
2023/02/16(木) 18:42:26.35ID:LB1U3BvE0
>>482
shared_ptr 相当をコンパイラーが実装するだけでしょ?
2023/02/16(木) 18:43:11.20ID:9Qy/VbOQa
>>482
CでできないならC++でできない
対偶はC++でできるならCでできる
2023/02/16(木) 18:43:28.33ID:G6Y1BfCz0
>>477
まあ、子供をいくつか作るぐらいなら問題はないかな

ちなみに自分はコンストラクタであまりややこしいことはしないようにしてる
もし大きな処理の結果をもとにインスタンスを初期化したいときは、
全部コンストラクタでやるんじゃなくて、その処理だけを前もって実行してる
2023/02/16(木) 18:46:08.39ID:kdIqPIYR0
std::mapのinsert、emplace、eraseは内部要素へのイテレータを無効化しないことが保証されてる(当然eraseで消した要素そのものは除く)
なおstd::unordered_mapの同名関数はrehashingが起きてイテレータが無効になることがある
2023/02/16(木) 18:59:23.43ID:G6Y1BfCz0
>>484
メモリの解放だけじゃなくてデストラクタも欲しくない?
ファイルを閉じたりしてほしい
2023/02/16(木) 19:08:57.32ID:UWxnAkIX0
>>488
関数のデストラクタ(returnするときに必ず呼ぶ処理)が欲しくなることはあるね
2023/02/16(木) 19:35:21.87ID:LB1U3BvE0
>>488-489
そういうのを検討してるみたい
https://news.ycombinator.com/item?id=22866311
2023/02/16(木) 19:56:28.04ID:G6Y1BfCz0
>>490
deferいいね
いわゆるfinallyみたいなもんかな
今でもやろうと思えば__cyg_profile_func_exitやdetourがあるけど環境依存で重くてめんどいね
2023/02/16(木) 20:41:32.26ID:J+JHFBNF0
数年前にawsの仕事したとき
g++のバージョンが古くて
unique_ptrを使ってたコードを泣きながら
生ポにしたことがある
2023/02/16(木) 20:57:10.46ID:dWYqZniE0
バカかw
自分でクラスを作ればいいだろ
スマポなんてめちゃ簡単な仕組みだぞ
2023/02/16(木) 20:58:28.56ID:INPRljPt0
>>493
右辺値参照の仕組みがないと上手いこと表現できないよ。
2023/02/16(木) 21:02:17.61ID:dWYqZniE0
そこはリファレンスカウンタを使ったトラディショナルな方法でやるのよ
速度は少し遅くなるけど
2023/02/16(木) 21:12:06.74ID:kdIqPIYR0
古いコンパイラで無理やり動かすなら#define unique_ptr auto_ptrという手も…
2023/02/16(木) 21:12:18.96ID:INPRljPt0
すでに std::unique_ptr で正しく動いているコードであるという前提があるなら
たしかにそれでも致命的な矛盾は起きなさそうに思えるな。
2023/02/16(木) 21:50:41.49ID:RFs7/Qh+F
g++なんだから新しいバージョンのをビルドすれば良いじゃん?
2023/02/16(木) 23:12:23.80ID:ZOPwX+PA0
>>461
消す為の変更で再評価
アホらし

何も見ずに?
そんなこと誰か書いたか?
2023/02/16(木) 23:27:28.78ID:UWxnAkIX0
warningだらけだとバグに繋がる重要なwarningを見逃す可能性があるから、可能な限り消した方が良いと思う
どうでもいいやつはコンパイルオプションで消しても良いし
2023/02/16(木) 23:46:07.27ID:LB1U3BvE0
>>499
元々は警告無しで移植で警告になったんだろ?
何千個あろうが見直すのは当たり前だし、いずれにせよ評価は必要
まさか警告出まくってるのに評価無しでOkとかしてるんか?
2023/02/16(木) 23:59:12.84ID:juZ9Em/90
「C/C++ warning一万個全部消してみた」
てタイトルで動画アップして欲しい
2023/02/17(金) 00:31:24.08ID:SMzkkCfo0
ピコーン!全ての警告を無効にすれば良いニダ!
2023/02/17(金) 06:19:19.83ID:KJxAAApA0
>>502
警告が1万種類あるなら大変だけどたいてい種類は限られるだろ
ほんとにコード書いてるのか?
2023/02/17(金) 06:22:34.59ID:t3uhpImP0
「符号付きと符号なしの比較がされました」
分かっとるわ!
2023/02/17(金) 06:27:23.48ID:L7ElXWdV0
それはオーバーフロー起きないかちゃんと確認しないとダメだろ
C++使っててそこルーズなの信じられんわ
2023/02/17(金) 06:31:19.84ID:t3uhpImP0
文字列の長さの比較がintの上限に達することはないし負になることもないのよ
2023/02/17(金) 06:47:57.06ID:L7ElXWdV0
だったら本当にそうであることを確認しないといけないし、そんなものにsignedの変数使ってるのがおかしいかもしれない
その値は本当に文字列の長さか?途中でエラーが起きたら-1とかが入ってる可能性はないのか?
そういう危険なバグの兆候を知らせるためにまともなコンパイラは警告するんだよ
2023/02/17(金) 06:49:33.54ID:L7ElXWdV0
一応言っとくと自分が言ってるのはプロダクトコードの話で
本人がその場でしか使わない書き捨てのオモチャなら勝手にすればいいと思う
2023/02/17(金) 06:55:47.58ID:YltW73tNa
>>505
わかってたら直せよw
そもそもそんな警告が大量に出るほうがおかしいし
2023/02/17(金) 07:09:21.56ID:t3uhpImP0
delphiから移植された関数の殆どが文字数をintで返す仕様でな
それ一々符号なしに変換するのが面倒でな
2023/02/17(金) 07:13:48.65ID:iM8Xviia0
使ってないパラメーターがあります
使ってない関数があります

警告が出ないようにわざわざ使う
ただのアホ
2023/02/17(金) 07:15:49.11ID:L7ElXWdV0
ほとんどなのね
「全部が必ず」正の値を返すことが保証されてるんじゃなければますますチェックコードが必要だな
実にバグが出やすそうな所に見えるね
2023/02/17(金) 07:17:50.92ID:L7ElXWdV0
>>512
使う必要がないなら消せよ
なんかの理由でどうしても残すなら[[maybe_unused]]付けろよ
アホはお前
2023/02/17(金) 07:27:16.44ID:fvM55ACEd
新入り「使ってないから消しました
古株「ちょ・・・おま(汗
2023/02/17(金) 07:30:03.02ID:iM8Xviia0
>>514
ド素人ですか?
2023/02/17(金) 07:32:46.94ID:L7ElXWdV0
え?コンパイラが警告出した変数や関数だろ?使ってないローカル変数や非公開関数なんだろ?
それを消して挙動が変わるってことは何か恐ろしいメモリ破壊系バグが顕在化したってことだ
新人君お手柄やね
2023/02/17(金) 07:50:26.17ID:iM8Xviia0
ド素人丸出しwww
警告警察の中身はこんなレベルのアホ
2023/02/17(金) 07:53:51.79ID:L7ElXWdV0
そうか
お前みたいな自称ド玄人が人命やインフラに関わるコードを書いてないことを願うわ
2023/02/17(金) 08:01:10.11ID:iM8Xviia0
ソフトの品質をコンパイラの警告に頼る方がヤバいと思うよ
2023/02/17(金) 08:14:39.58ID:xqCJita0d
カーエレって割とそんな感じよ
2023/02/17(金) 08:26:51.29ID:CXQijN6cd
コンパイラの警告さえ対処しない奴が品質を語るな
2023/02/17(金) 08:36:18.04ID:iM8Xviia0
コンパイラの警告の数でソフトの品質を語るアホ
2023/02/17(金) 09:18:35.55ID:DsIzGE7Qd
シートベルトしてるだけで安全運転だと思ってる奴はヤバい←正しい
だからシートベルトしなくていい←絶対運転しちゃいけないアホ
2023/02/17(金) 09:52:37.27ID:YLDwb/gm6
>>477

一応の完成版を以下に貼りました。
https://wandbox.org/permlink/lXq19mN1URMQhyh5

生ポをスマポへ変えるのは一旦棚上げしています。
ありがとうございました。
2023/02/17(金) 10:11:56.50ID:sv7zAam40
何も変わってなくね?と思ったら>>426とリンク同じだった

wandboxは共有済みのソースを後から編集できないので
更新するにはもう一回共有して新しくpermalinkを生成する必要がありますよん
2023/02/17(金) 12:12:37.95ID:A4U2N4R7d
対処はしてるぞ
内容を読んだうえでの決定なんだから
2023/02/17(金) 12:16:56.46ID:CMo6McFXd
>>524
シートベルトは法律で決まってる

警告を消すのがルールで決まってる職場なら
警告かルールいずれかを消せ
そうじゃないならどうでもいい

ソフトの品質を担保するなら
警告の中身を見ずに単に隠すのが一番悪い

また
全ての警告を無条件で検証しろというなら
全ての演算も無条件で検証しろ
C++の演算はオーバーフローする可能性があるんだから

無意味な警告は出す方が悪い
コンパイラの設定で無効にしろ
コードを変えて隠す物じゃない
2023/02/17(金) 12:17:47.03ID:CMo6McFXd
コードの検証ならちゃんとした検証ツールを使え
2023/02/17(金) 14:00:35.55ID:YLDwb/gm6
>>526

申し訳ないです。正しくは以下のURLです。
https://wandbox.org/permlink/uHOVPDqphdPBAPQe

ご指摘、ありがとうございました。
531デフォルトの名無しさん (スッップ Sdaa-zpWe)
垢版 |
2023/02/17(金) 18:18:23.14ID:VB0sml4Xd
>>530
流し読んだ感じだけど

1.
void roots( unsigned );
> // 自らがどのようにして生まれたかを調べるメソッド
> // 第 serialNo 番のインスタンスを探索する.

自分の親を探索するのか指定serialNoが子供にいるのかどっちだよ
あと検索なのでメンバを上書きしないはず。関数自体をconstにするべき

2.
engineは親のengineを参照すればいいのでわざわざ引数で受け取る必要はない
コンストラクタは親を受け取るのとengineを受け取る2種類用意したほうがいいんじゃない?

3.
numberフィールドはいらん(名前もchildCountに変えるべきだが)
childObj.size()を見ればいい
getter関数作ったほうがいい

4.
isLeafフィールドもchildObj().size()==0見れば判断できる
532デフォルトの名無しさん (ワントンキン MMfa-EB70)
垢版 |
2023/02/17(金) 18:50:34.09ID:HTK/9d/ZM
もう解決してんだからアドバイス気取りでがんばって蛇足を加えんでもいいよ
2023/02/17(金) 21:00:18.60ID:RlPt61in0
>>531

そこで図々しいお願いですが、そのように改造してくださると私にとって大いに勉強になります。
一肌脱いではいただけませんでしょうか?

生ポをスマポに直すのすら頭を抱えているヘタレなので、ここに棲まう先輩方のご鞭撻を是非に賜りたいです。
2023/02/17(金) 21:26:59.48ID:L7ElXWdV0
>>528
分かってんじゃん
C++の整数演算は無条件で全て検証が必要だよ
おっしゃる通りオーバーフローするかもしれないし、それが大きなセキュリティ問題につながった例もたくさんあるからね
特にナイーブにsigned/unsigned間比較や縮小変換をしてる所は危険だし、それを知らせてくれるコンパイラ警告は実に有用なものだ

もちろんプロダクトコードの話ね
2023/02/17(金) 22:01:30.31ID:wDoqrfUd0
縮小変換が警告されるかどうかと問題が起きないようにロジック組んであるかどうかは別問題だね
2023/02/17(金) 22:05:57.15ID:L7ElXWdV0
それはそう
コンパイラが知らせてくれるのは一番基本的な所だけだからな
逆に言えばそれすら対処してないようじゃ0点
537デフォルトの名無しさん (スッップ Sdaa-zpWe)
垢版 |
2023/02/17(金) 22:14:14.63ID:VB0sml4Xd
>>533
丸投げすんな自分でやれ
2023/02/17(金) 22:17:56.86ID:wDoqrfUd0
>>536
何がそれはそうなの?
2023/02/17(金) 22:41:19.78ID:iM8Xviia0
>>534
警告に惑わされずに全部見ろ

>>536
警告を隠すのと問題が無いことを確認するのをごちゃ混ぜにするアホ
2023/02/17(金) 22:44:01.98ID:KJxAAApA0
>>512
> 警告が出ないようにわざわざ使う
えっ、そんなレベルなのw
そりゃそんな職場なら
> 警告を消す為にバグを仕込むヤツを何度も見てきた
とかもあるんだろうな...
なんか可哀想になってきたわ
2023/02/17(金) 22:46:57.97ID:mQelUUv/0
>>467

> std::unordered_mapの同名関数はrehashingが起きてイテレータが無効になることがある

その場合でもvalue側のメモリは固定でしょうか?
2023/02/17(金) 22:48:24.15ID:mQelUUv/0
失礼、↑は>>487の間違い
2023/02/17(金) 22:54:29.06ID:iM8Xviia0
>>540
警告を消すためにわざわざ使うマクロを知らんのか
2023/02/17(金) 22:56:59.77ID:iM8Xviia0
◯◯のコンパイラや◯◯のチェックツールで警告が出るから直しとけ
って言われたら何の疑問も持たずに直すの?
◯◯はバグの元だから直せって言われたら
何の疑問も持たずに直すの?
思考停止?
2023/02/17(金) 23:43:41.95ID:KJxAAApA0
>>543
なんのマクロのことを言ってるのか知らんけどそんなの処理系によって違うだろ
最近の流れは>>514のような属性指定
2023/02/17(金) 23:45:03.57ID:BuPJ3Mmy0
ぶっちゃけテストしてるなら警告放置でもいいけど、
テストするような人は警告にも対処するからな
2023/02/17(金) 23:48:24.98ID:KJxAAApA0
>>544
指摘されてるんだからなぜその指摘が出てるのか調べて直すなり警告抑止するなりするだろ
なぜなんの疑問も持たずにとか出てくるのか不思議だけど君の職場ではそうなんだろうねw
2023/02/17(金) 23:53:50.54ID:wDoqrfUd0
見も知らん第三者にwell-formedなコードにケチつけられたら
言いなりにしろと押しつけてくるやつ、自分の姿をビデオでも鏡でもいいから見てみたら?
2023/02/18(土) 00:40:30.23ID:U7F6huSe0
多分「直す」を「何も考えずに警告抑止なりキャストなりで握り潰す」の意味で言ってるから噛み合ってないんだと思う
警告無視マンセー君以外はもちろんバグがないか確認した上で範囲チェックやクランプや(問題ないことを確認して)キャストなどを加えてプログラムを改良する意味で言ってる
2023/02/18(土) 02:15:58.71ID:AZBhix5KM
>>541
value のアドレスは変更になるが、valueが構造多やクラスで、中にポインタが
有るような場合は、そのポインタの値は変更されない。
2023/02/18(土) 02:21:04.46ID:AZBhix5KM
>>550
間違いました。unorderd_map の rehashingについて、こう有ります:
https://cplusplus.com/reference/unordered_map/unordered_map/rehash/
>Iterator validity
>If a rehash happens, all iterators are invalidated, but references and pointers to individual elements remain valid.
>If no actual rehash happens, no changes.

なので、iteratorは無効化されるが、個々の要素への参照やポインタは有効なまま残ります。
2023/02/18(土) 03:03:49.37ID:AZBhix5KM
>>551
ソース読まないとはっきりしないけど、恐らく、イテレーターが指している
オブジェクトのポインタを取得すると以前と同じ値になっている。
しかし、イテレーターには ++ で直後の要素に移動する機能が有る。
恐らくその機能が正しく働かない場合があるということらしい。
ゴミレスでごめん。
2023/02/18(土) 06:19:29.80ID:hapPzQ8z0
>>549
いろんな方法で検証は当然行う
コードを変えてわざわざ警告を隠す作業はしない
2023/02/18(土) 06:45:26.64ID:hapPzQ8z0
キャストして警告を隠す事がプログラムの改良だと思ってるアホとは会話しても無駄だな
2023/02/18(土) 06:50:44.99ID:FqZBdMS3d
>>548
それだと多分うっとりしておしまいになるやつ
2023/02/18(土) 07:23:37.23ID:/Gi8XN260
ナルシストか
そうだろうな
2023/02/18(土) 07:58:59.69ID:c4QxGie20
> キャストして警告を隠す事がプログラムの改良だと思ってるアホ
>>554 のことだなw
2023/02/18(土) 09:42:41.72ID:U7F6huSe0
まだ直すと隠すの区別ついてないアホのためによくある例書いとくね

std::vector<Foo> foos = /* なんか入ってる */
for(int i = 0; i < GetLegacyLength(); ++i){
 Hoge* item = GetLegacyItem(i);
 if (i < foos.size()) // WARNING: signedとunsigned比較してんぞ
 { hoge(foos[i], item); }
 else
 { fuga(item); }
}
アホの隠し方(1):脳死でif文のiかfoos.size()をキャストして隠蔽
アホの隠し方(2):脳死でiの型をsize_tに変更、そしてi < GetLegacyLength()でまた同じ警告が出て激怒「コンパイラの警告なんて無意味だ!」

正しい直し方:
なぜ長さを返すのに戻り値型がintなのか、GetLegacyLength()のマニュアルを見て仕様を確認する。
するとある条件でエラー値として-1を返すことがあると判明したので、
forループの前にGetLegacyLength()を取得するようにして、負の場合のエラー処理を追加した。

/*略*/
int len = GetLegacyLength();
if (len < 0) { /* エラー処理 */ }
else {
 for(size_t i = 0; i < static_cast<size_t>(len); ++i) { //lenは0以上と確認済みなので安全にキャストできる
/*略*/
2023/02/18(土) 09:55:17.94ID:q7/8BBWI0
>>558
そもそもforの条件判定の部分で関数を呼ぶのは間違いだ
2023/02/18(土) 10:01:12.90ID:U7F6huSe0
そこは間違いコード例だから意図的にそうしたんだけど
元がfor(int i = 0, len = GetLegacyLength(); i < len; ++i)だとしても話の本旨には関係ないよね?
お前が警告無視する時みたいに脳死で食いつくからそうなる
2023/02/18(土) 10:30:22.39ID:Cp9I+Lmgd
警告を無視するのと握りつぶすのを混同しとるな
2023/02/18(土) 11:02:45.42ID:c4QxGie20
>>559
それこそ脳死だろw
ループ毎に異なる値を返すかも知れないぞ
(もちろんそんな設計する奴は漏れ無くアホだが)
ちゃんと仕様なりソースを確認しろ
2023/02/18(土) 12:30:58.62ID:XNyuFiWW0
>>551,552
いえいえ、わざわざ調べてもらってありがとうございます!
vectorのメモリ再配置によるアボート障害が発生したので、ハッシュのときも
同様のことがないか気になっていました。
とりあえずハッシュの場合はアボートすることはなさそうですね。
2023/02/18(土) 12:34:06.96ID:/Gi8XN260
>>562
そういうおまえさん自身は
GetLegacyLengthとやらの仕様なりソースを確認しているのか?
2023/02/18(土) 12:47:29.66ID:jI/cauq9d
>>558
BOOL GetMessage のことですね判ります
2023/02/18(土) 12:49:33.03ID:c4QxGie20
>>564
自分が改修する立場ならな
当たり前だろ
もうそのレスがアホすぎる
2023/02/18(土) 13:05:02.97ID:/Gi8XN260
>>566
確認してないんだな?
じゃあ一般論としてあんな変なコードをいつも書いているのか?
話の本旨に関係ないのにわざわざあんな書き方するのは日常の勢いか?
2023/02/18(土) 13:09:54.02ID:/Gi8XN260
なんかおまえさんの話し方なのか口癖なのかわからんが鼻につくんだよ
well-formedなコードに対する警告をどうするかなんて
おまえさんが感情的に喚いたからって誰も考えは変えないぞ
技術的な議論で誰も分かったと言って来ない現実を
おまえさんはDQN口調でどうかしようとしているようだが恥を知れ
2023/02/18(土) 13:12:16.36ID:WT5oC+Bfd
諭されて反論できなくなったから重箱の隅突き始めたよ
ダッサ
2023/02/18(土) 13:17:40.85ID:/Gi8XN260
あのforに違和感を覚えないセンスのやつに
上から目線でご高説いただいても
自分はああはなりたくないと思うだけだからな
2023/02/18(土) 13:22:48.24ID:ldhLkjQ5d
そうだな
悪い例として出されたコード例に向かって粗探ししてハイセンス気取るような恥ずかしいアホにはなりたくないものだ
2023/02/18(土) 13:24:53.20ID:U7F6huSe0
ああいうダメコードを見つけ出すヒントとしてコンパイラ警告は使えるんだよっていう例を出したつもりだったんだけど難しかった?
2023/02/18(土) 13:28:32.75ID:/Gi8XN260
たまーに実在するからな、ああいうfor書くやつ
そういう手合いの言い訳はどいつが言っても同じ雑音でしかない
2023/02/18(土) 13:38:53.64ID:c4QxGie20
>>567
> 確認してないんだな?
> じゃあ一般論としてあんな変なコードをいつも書いているのか?
たった2行でよくこんなアホさが滲み出る文章書けるもんだな...
1行目もアホだと思うが2行目は脈絡もないのに「じゃあ」とかアホすぎる
こういう奴があの手のクソコードを書くんだろうなw
2023/02/18(土) 13:40:46.05ID:U67S6hSRd
警告警察アンチ君がfor文警察になってしまった
2023/02/18(土) 13:44:53.99ID:/Gi8XN260
>>574
頭冷やせよ
特定の関数の仕様が理由でなくて
あんなコード書いたのかと言っている

おまえさんこそあの手のクソコードとやらはどれのことで
それをなぜ俺が書いていることになったのか説明できるか?
2023/02/18(土) 13:45:46.69ID:8+fxePVqd
>おまえさんの
ごめん無理
2023/02/18(土) 13:58:29.96ID:5mGZNzlM0
低能警察に糞コードで反駁しようとしたら
収集がつかなくなったでござるの巻

警告を回避するためのコード変更がそんなに嫌ならコンパイラのオプションで警告を出さなくしたら良い……
2023/02/18(土) 14:07:37.26ID:/Gi8XN260
警告どころかコンパイラのバグを回避することだってある
むろん思い切り処理系に依存する内容となるが嫌とか好きとか言ってらんない
必要が出ればやるだけで感情の入る余地はない

どっかの思い上がった坊やの俺様節が五月蠅いだけ
黙ってくれれば俺にそれ以上の望みはない
2023/02/18(土) 14:12:09.71ID:5mGZNzlM0
警告をOFFにしたら警告を回避しようとしてバグを仕込んでしまう事故は確実に防げる
ていうか本質論としてはそもそも警告に頼らねばプログラミングもできない程度の低能はそもそもプログラミングをすべきではないという話、
これは反駁のしようが無い
2023/02/18(土) 14:13:36.72ID:c4QxGie20
>>576
> あんなコード書いたのかと言っている
そもそもあのコード書いたの俺じゃないことぐらい
>>562 > (もちろんそんな設計する奴は漏れ無くアホだが)
って書いてる見たらわかるだろ...

> それをなぜ俺が書いていることになったのか説明できるか?
誰もお前が書いたなんて書いてないけど頭大丈夫か?
脳死で
> for(int i = 0, len = GetLegacyLength(); i < len; ++i)
みたいな修正したらバグるかもよって話だぞ
2023/02/18(土) 14:15:48.28ID:/Gi8XN260
はいはい「俺じゃない」のね
IDコロコロする人とは話にならないな
2023/02/18(土) 14:32:47.85ID:U7F6huSe0
なんかすまんな
何気なく書いたダメコードのそれっぽいfor文がこんなにキチガイの琴線を刺激するとは思わなかった
2023/02/18(土) 14:35:25.61ID:/Gi8XN260
559の指摘にあの返事だからな
うわー香ばしいと思ったのよ
2023/02/18(土) 14:36:45.33ID:U7F6huSe0
黙れキチガイ
2023/02/18(土) 14:47:19.84ID:5mGZNzlM0
↑うんこ
2023/02/18(土) 14:52:57.45ID:aA0Lr1WO0
>>583
すまんと思うならもうROMっててくれ
これに返信も不要だからな
2023/02/18(土) 15:00:31.81ID:AfjXtSgB0
forやwhileの条件でstring::sizeを呼んでるけどダメ?
2023/02/18(土) 15:01:44.62ID:q7/8BBWI0
>>588
意図したものならまぁいいけど、後々のことも考えると普通は禁止
2023/02/18(土) 15:12:52.01ID:5mGZNzlM0
ループ内で変更しないstd::stringのstd::string::size()なら
コンパイラが頑張ってギリ括り出し最適化をしてくれるかもしれんがコンパイラに優しくない……

ていうか以降値が変化しないことがわかっているメンバ変数やグローバル変数は
intやsize_tみたいな単純型ならさっさとローカル変数にコピーした方がメモリからのロード命令削減のために良い
実体(メンバ変数やグローバル変数)と同じ値を保持するローカル変数(エイリアス)があったら混乱するというのは
そんな関数が(担当者の脳のキャパに比べて)デカすぐる……
2023/02/18(土) 15:14:50.51ID:c4QxGie20
>>582
IDコロコロ?
ちょっと回線切って頭冷やせw
2023/02/18(土) 15:26:22.78ID:/Gi8XN260
だから他人に指図すんな
警告をどうしようが回線をどうしようが
おまえさんに言われる筋合いはない

依頼心の強い甘ったれ野郎か?
2023/02/18(土) 15:32:46.92ID:3QwlbD5xd
依頼心の塊はこんなゴミ溜めでイキリ倒さないと自分を保てないお前さんの方だろ
for文警察出来て楽しかったでちゅか?
2023/02/18(土) 15:37:11.41ID:/Gi8XN260
こんなゴミ溜めでイキリ倒さないと自分を保てない → 依頼心が強い
全くつながらなくて説得力ないね
子供言葉にお似合いのしょーもない言い返しだなw
2023/02/18(土) 15:46:04.40ID:DOhL3WBHd
j「コンパイラの警告は全てゴミだから無視するべき、なぜなら>>558のfor文がダサいから」なんて主張をしてる奴への罵倒になぜ論理性が求められるのか分からない
バカアホマヌケ依頼心野郎で充分だろお前もそうなんだし
2023/02/18(土) 15:55:18.34ID:/Gi8XN260
へー、この流れをそう読んでいたのか
我ながらひどく買い被りすぎてたもんだ
そりゃー話になるわけないよな
2023/02/18(土) 15:58:59.97ID:/Gi8XN260
警告は内容によっては無視する場合があると言ったのを
全て無視すると改変してまで言い返さないと気が済まないのか
子供言葉にry
2023/02/18(土) 16:00:51.47ID:hE3AXWNH0
そのうち惰性で内容を吟味せずに無視するようになりそうなので
がんばって警告は消してくスタイル
2023/02/18(土) 16:02:45.49ID:/Gi8XN260
無視してたらコンパイラのバージョンが上がって警告しなくなったやつもあるな
2023/02/18(土) 16:04:23.86ID:kbl+yJpad
なるほど558は警告を無視する場合な訳ね、理由はfor文がダサいからw
やっぱこのチンパンジーオモロイわ
何か言い返してくるだろうけど、畜生の鳴き声に論理性なんて求めないから本能剥き出してくれていいよ
かわいいね
2023/02/18(土) 16:05:46.49ID:c4QxGie20
>>592
IDコロコロに触れられず顔真っ赤w
2023/02/18(土) 16:13:38.69ID:/Gi8XN260
for文の話で脳死が出てくる自己紹介な人だから
for文についての指摘が警告の話に短絡してしまったわけか
治してあげんの面倒臭いから放置するぜ
2023/02/18(土) 16:20:07.00ID:QwP9/dM9d
凄い、>>602が何一つ意味が分からない
本当に猿がランダムな日本語もどき書いてたんだな感動した
2023/02/18(土) 16:31:14.25ID:/Gi8XN260
忘れてるかも知れんがここは全世界から閲覧かのうな掲示板だよ
おまえさんの発言見てんの俺だけじゃないからね
第三者にクスクスされる文面には気をつけたら?
2023/02/18(土) 16:43:35.96ID:xVxS8guk0
自覚あったのに驚き。
2023/02/18(土) 16:47:29.84ID:c4QxGie20
顔真っ赤な人はクスクスどころかドン引きされてるみたいだけどねw
2023/02/18(土) 17:27:32.13ID:GQ7TKK8Hr
小杉の煽りが下手すぎてつまらん
2023/02/18(土) 22:16:29.02ID:tx6k3oAyM
>>563
unorderd_map のテストプログラムを作り、デバッガのステップ実行で、
ソースを調査することを進めます。デバッガを併用すると、単純にテキスト
エディタでソースを眺めるより楽です。
わざとrehashされる条件を作っておいて、*it が返すポインタが変化してないことを
確認したりもしてみてください。
2023/02/18(土) 22:20:44.13ID:tx6k3oAyM
>>608
誤: ソースを調査することを進めます。
正: ソースを調査することを薦めます。
誤: わざとrehashされる条件を作っておいて、*it が返すポインタが変化してないことを
正: わざとrehashされる条件を作っておいて、&*it が返すポインタが変化してないことを

unorderd_map<K,V>::iterator it に対して *it が V 型、&*it が V* 型ですね、確か。
2023/02/19(日) 01:04:05.04ID:j1lo6n64d
警告警察
goto警察
例外警察
いろいろいるね
2023/02/19(日) 02:44:27.50ID:XBUFkCxR0
本題から逸れた細かいことばかり言う人って他人から相談されなくなるよね
とりあえず本題に触れてあげたほうがいいと思う
2023/02/20(月) 10:46:49.72ID:4EtRnxBTr
>>607
小杉?
613デフォルトの名無しさん (アウアウエー Sa13-o4eO)
垢版 |
2023/02/20(月) 21:38:28.53ID:bUrAUmQja
>>610
じじい世代はここで
西部警察
がでてくる
2023/02/20(月) 23:51:57.53ID:7qph/rf50
>>610
警察警察もじきにあらわれるでしょう
2023/02/21(火) 06:19:53.28ID:lGumlqGfd
>>613
なんで?
2023/02/23(木) 12:36:30.12ID:v5/05dNG0
>>613
セーブ警察(定期的に保存しない者を取り締まる人)ですね
2023/02/25(土) 09:42:29.51ID:EkXmct6Y0
>>616
西部警察が東部を取り締まるみたいなロジック何それ……
2023/02/25(土) 10:26:54.98ID:+hyOJw/l0
まともなエディタなら自動セーブ機能くらいあるだろ
メモ帳で開発してんの?
2023/02/25(土) 10:42:44.98ID:FxeL/Fyd0
池袋駅は東口に西武デパートあるから問題ない
そして西口に東武
2023/02/25(土) 12:32:14.92ID:EkXmct6Y0
質問なのですが<random>の疑似乱数クラス(いっぱいある)って共通の基底クラスとかインターフェースとか無
いの?

乱数のseedをプログラムの中で1回だけ与えて初期化した疑似乱数オブジェクトを
関数foo()に渡したりして使いまわしたいのだけどfoo()は特定の疑似乱数クラスに依存させたくないという場合、
foo()を疑似乱数クラスTを受け取るテンプレートで実装するとか自作のインターフェースで疑似乱数クラスをwrapする以外に他無し?

それともそもそもそういうことはすべきではない(関数の中で都度乱数のseedをプログラムの中で1回だけ与えて初期化した疑似乱数オブジェクトを作れ
と神はお命じなのやろうか……
2023/02/25(土) 12:35:52.57ID:EkXmct6Y0
訂正orz、
誤: 自作のインターフェースで疑似乱数クラスをwrapする
正: 自作のインターフェースで疑似乱数クラスとDistributionクラスをセットでwrapする

<random>はテンプレート全振りすぎてオブジェクト指向的でない
ヤヴァイ……
2023/02/25(土) 12:52:10.86ID:k1cc/WLc0
>>621
そもそも何がしたいのか
seedの異なるものが同時に必要ならそうするしかない
2023/02/25(土) 13:02:15.45ID:sAnrfOr80
>>620
>関数foo()に渡したりして使いまわしたいのだけど
>foo()は特定の疑似乱数クラスに依存させたくないという場合、
foo()を関数テンプレートにし疑似乱数クラスをテンプレート引数とする
じゃだめなの?
2023/02/25(土) 13:06:02.14ID:EkXmct6Y0
>foo()を関数テンプレートにし疑似乱数クラスをテンプレート引数とする
>じゃだめなの?
通常はそれでも良いが
foo()が1万行ある関数だったとしてヘッダファイルに書くのかっていうか、
なんで疑似乱数を使うことと、書き方がテンプレートに制限されてしまうことが相関されねばならないのか
疑問に思わないのかそうか、、、
2023/02/25(土) 13:19:38.23ID:EkXmct6Y0
んまー現実解としてはどうせstd::mt19937をstd::random_deviceで初期化するような使い方しかしないのだろうから
using rand_t = std::random_device;
using psrand_t = std::mt19937;
class FooTest : public ::testing::Test {
protected:
 psrand_t m_psrand;
public:
 FooTest() : m_psrand(rand_t()()) { }
};
ぐらいで過度の抽象化はやめておいた方が良いのかもしれん……
(別名にする、程度にしておけば疑似乱数クラスの選択とDistributionクラスの選択を分離できる
2023/02/25(土) 13:21:23.18ID:a4UZTu4a0
標準ライブラリのテンプレートもみんなヘッダに書いてるんだしいらない疑問だと思うが……
使ったことは無いけど、気にするならC++20モジュールとして書いてみるといいかもしれない
2023/02/25(土) 13:25:58.19ID:sAnrfOr80
>>624
疑似乱数クラスは限定されているので
俺ならfooの実装はcppに書いて明示的インスタンス化をする
2023/02/25(土) 15:15:43.98ID:0MW4CaX30
>>620
result_typeが違うと、乱数のサイズが変わって、それに処理も合わせないといけないからな
素直にラップすればいいんじゃね
2023/02/25(土) 19:34:51.11ID:pcyV0/Fb0
>>619
近い将来西武デパートがなくなる可能性もあるので
コンピュータ技術同様、未来永劫変わらないものなんてないんだ
2023/02/26(日) 06:44:53.09ID:wlYkLcj5M
>>620
randomてoperator()持っていなかったっけ?
std::functionに入れるとなんか問題あったっけ?
2023/02/26(日) 07:48:51.16ID:Gr0Cvu5K0
>>620
ないけど_enjineがつくやつは使い方が統一されているから
普通にテンプレート引数にするだけでいい
テンプレートに渡せるクラスを限定したいならconceptという手がある
2023/02/26(日) 07:49:07.86ID:Gr0Cvu5K0
_engine
2023/02/27(月) 00:29:36.28ID:gYXyoIsy0
_eringi
634デフォルトの名無しさん (アウアウエー Sa02-mjxs)
垢版 |
2023/02/27(月) 17:17:04.08ID:3MgFEhuya
サンプラザ中野が亡くなったのはびっくり
635デフォルトの名無しさん (アウアウウー Sa39-EsFZ)
垢版 |
2023/02/27(月) 18:32:42.37ID:uiaf09PPa
>>634
どこ情報?
636デフォルトの名無しさん (ワッチョイ 9501-ZYAP)
垢版 |
2023/02/28(火) 06:11:10.06ID:gPlIR4bB0
会議で「テレメトリーの結果、オートコレクトをオフにしているユーザーさんが多い、どうしたら良いか」ということを話し合った。
「小文字にする方法」を解説するページを作っておけば儲かるぞ。
2023/02/28(火) 07:28:04.38ID:K4SOyNvXd
どこの誤爆だろう
2023/02/28(火) 07:34:53.09ID:3dbS5K+md
くんさんついてない方の事では?
2023/02/28(火) 14:17:12.73ID:8Tfx2t07F
https://youtu.be/OC1PvKjgREo
C++沼へようこそ
2023/02/28(火) 15:20:52.24ID:dNNgH11Kd
g++のu8クソ過ぎワロタ
2023/03/04(土) 12:36:42.18ID:Rl7ZOdOT0
stdexceptの各例外の使い分けがわかりません
まず
・エラーは「実行時エラー (runtime error) 」と「論理エラー (logic error) 」との2つに大別される。
とのことでinvalid_argumentはlogic_errorの派生クラスみたいなのですが
foo()に不正な引数が渡る状況はたいてい呼び出し元bar()の実行時エラーなわけじゃん?

しかしそれだと論理エラーの出る幕が一切なくなるので、
foo()視点でfoo()に不正な引数が渡る状況は論理エラーである、とみなす立場が考えられるますが、
しかしfoo()が投げた例外を補足する箇所はfoo()の外なわけで、そんなローカル視点知ったことか、となるわけじゃん?

もうstdexceptのうちでユザープログラムから投げるのはruntime_error(<適当なメッセージ>)だけで良い?
2023/03/04(土) 13:04:37.77ID:Rl7ZOdOT0
だいたい自己解決しましたサーセン、
1. cassertにおけるassert()条件に書くような、設計上絶対起こり得ないやつ(起きたらバグ)はlogic_error
2. 上記以外(設計上起き得ないことを保証しかねる不整合)はruntime_error

で、さらに細分化可能な場合(明らかに派生クラスにあてはまるやつ)は派生クラスにする
例外を補足する個所では、logic_error& eかruntime_error& eで捕捉する(そうすれば派生クラスも捕捉できうる
でFA?
2023/03/04(土) 13:33:21.64ID:MZ+gWi90M
ソケットプログラミングがマジ解らん。
コネクトするコード書いてもエラー起こすし、バインドしてみたらエラー返してきてどうしようもないし
どうすればインだー。
2023/03/04(土) 14:05:40.41ID:XDSJ2ABs0
throw EINVL;
2023/03/04(土) 18:37:32.42ID:gLC7WXhtd
>>643
もしかしてWindows?
2023/03/04(土) 18:55:56.69ID:x4fRAuLN0
>>643
まずはサンプルを動かすところから始めよう
647デフォルトの名無しさん (ワッチョイ 8b89-Wv9y)
垢版 |
2023/03/04(土) 19:13:48.29ID:no85xIV40
解決する気があるなら書いたコードと返ってくるエラーぐらい貼ろうぜ
648デフォルトの名無しさん (ワッチョイ 1305-5I03)
垢版 |
2023/03/04(土) 20:37:57.16ID:2zCyTihi0
このスレ見て久しぶりにC++やったら今まで丸暗記してたことが
他の言語にも適用できる感じ理解できてしまったわ
649デフォルトの名無しさん (スププ Sd33-MJlW)
垢版 |
2023/03/05(日) 12:17:19.55ID:tgZ89GxTd
>>643
馬鹿には無理
2023/03/05(日) 14:10:43.43ID:V5cM5Nk90
>>642
分類としてはそんな感じでいいと思うけど、型でcatchし分けるのはお勧めしない。
2023/03/06(月) 21:47:32.00ID:iiB2MEh2M
>>645 そうです。コネクトしてメッセージ出るまでできました。
>>464 いえすさー

サンプルのサーバーも自分で書かされた結果。
サーバーがアクセプトするまでクライアントは何してもほぼ無駄という事でした。
2023/03/06(月) 22:52:55.64ID:K6iDrUwm0
最後の「ばインだー」はバインドとかけてるのか?いや、まさかな…
653デフォルトの名無しさん (スププ Sd33-MJlW)
垢版 |
2023/03/07(火) 12:11:28.12ID:f9Hon4H6d
W32APIにfork入れなかったのは嫌がらせか
2023/03/07(火) 12:49:30.34ID:gZ1LpnCS0
Cygwinを使うとか?
2023/03/07(火) 12:51:18.28ID:5oG+IrWl0
fork自体あまり良い設計ではないから、マネしなかったのは良いことだと思うよ
2023/03/07(火) 14:18:28.28ID:YRf34T/Q0
NTの構造上、forkをWin32サブシステムに入れる筋合いはどこにもないからな
2023/03/07(火) 19:14:40.99ID:OIq1O0Ib0
Unixの構造上ならどう筋合いがあるんじゃ……
親プロセスから子プロセスになんか引き継ぎたいとき便利(そういうのが多いときコピーオンライトで高速化も可能)だというのはわかるが
そもそも親プロセスから子プロセスに引き継がれるべき情報ってそんなに重大で大容量なのがなんかあるっけ、、、
2023/03/07(火) 19:35:58.81ID:nDfu8VY70
代わりにspawnがあるからでしょ
2023/03/07(火) 20:12:06.52ID:yBXOBLOe0
そもそもプロセスって並列処理のためのもので、並列処理って同じ仕事する奴をたくさん用意するものなんだからforkは自然な設計
現代のPCやデバイスと噛み合ってないのはその通り
660デフォルトの名無しさん (スップ Sd73-Wv9y)
垢版 |
2023/03/07(火) 20:19:21.43ID:hnN7reTEd
俺の使い方だとshellのビルトインコマンドをパイプで繋げるときと、PS1に色々仕込むぐらいしか恩恵ないかな
Windows(cygwin)でパイプ使いまくるとクソ重い

他はネットワークサーバーでaccept→forkのサンプルコードをよく見る
2023/03/08(水) 06:43:43.40ID:D4+z1pfo0
>>657
筋合いって、それはunixだからだろ
windowsならwslでやればいい
2023/03/08(水) 07:31:55.78ID:I9WABGt0a
何を言ってるんだお前は
2023/03/08(水) 07:38:01.65ID:D4+z1pfo0
何か間違ったこと言ったか?
2023/03/08(水) 07:49:03.77ID:H+IAPgT9M
天然か
2023/03/08(水) 07:52:01.79ID:D4+z1pfo0
何も言えんヘタレか
つまらんぞ
2023/03/08(水) 10:54:15.94ID:/Tvc5S700
forkはそのままではメモリ共有できないので並列処理の定石とは言い難い
2023/03/08(水) 15:41:08.30ID:hz03AXgUM
if (auto result = Hoge())
{

}
else
{

}

て書いたときelseブロックでもresult参照できるのめっちゃ違和感あるんですけど、こうなってる理由ってどこかに書いてありますか?
2023/03/08(水) 16:00:38.16ID:D4+z1pfo0
違和感? 何で?
ブレースは必須じゃねえだろ

if (auto result = Hoge()) ; else /* ここでresultが使えるのおかしいか? */ ;

{
else /* これはできないわけで、elseはifの続きだぞ */
}
669デフォルトの名無しさん (ワッチョイ 119c-8Eq5)
垢版 |
2023/03/08(水) 16:22:00.73ID:ytiNTw1F0
try で宣言した変数を catch や finally で参照できるようにして欲しいと思ったことが 5億回はある
2023/03/08(水) 16:26:12.41ID:sNgBrAzK0
>>669
出来たとしても catch したときには解体済み (または構築していない) なはずなのでだめぽ。
671デフォルトの名無しさん (ワッチョイ 119c-8Eq5)
垢版 |
2023/03/08(水) 16:36:24.71ID:ytiNTw1F0
うん、ダメな理由は分かる

でもみんな try に書いてた変数を catch や finally で必要になってから外出しした経験あるよね
2023/03/08(水) 16:38:09.65ID:sNgBrAzK0
>>667
C with Classes が C++ になる頃にそこに宣言を書けることにした話はD&E に言及がある。
Algol68 の真似をしたつもりだったが
実は設計者の勘違いで Algol68 にそんな仕様はなかったということも書かれている。

スコープのことまでは書かれていなかったが、
たぶんそれも当時の設計者の脳内 Algol68 ではそうだったってだけなんだろう。
まあ else も if 文の一部なので自然に考えれば全体がスコープになるほうが
理屈に合うように思えるし、私は疑問に感じたことは無かったな。
2023/03/08(水) 18:30:22.29ID:lmBqNRkPM
>>672
ありがとうございます。

ifでの宣言は初期化とテストが一緒にされるわけで、テストに失敗した結果実行されるelseブロックでそれが使えることがちょっと納得できませんでした。

言われてみれば、中身がnullptrとは限らないし、エラーハンドリングとかで使ってるんですかね
2023/03/08(水) 22:20:58.55ID:tb9BYlUU0
それよか
int outlierCnt;    // ←これのスコープのが問題
do {
  outlierCnt = 0;
  for (int j = 0; j < n; j++) {
    if (...) {
      outlierCnt++;
    }
  }
} while (outlierCnt > 0);

// ループを出たらoutlierCntは用済み
2023/03/08(水) 22:35:27.94ID:vNfcyURF0
見えてほしい範囲とか見えてほしくない範囲があんならブロック使って任意にスコープ作ればいいんでは
2023/03/08(水) 23:51:23.50ID:tb9BYlUU0
>>675
bool bUniqueList;    // ← constにできない
{
  bUniqueList = true;
  std::set<T> dupChk;
  foreach (auto it = vec.begin(); it != vec.end(); it++) {
    auto result = dupChk.insert(*it);
    if (!result.second) {
      bUniqueList = false;
      break;
    }
  }   
}

if (bUniqueList) { ... }
2023/03/09(木) 00:39:11.87ID:3j1Ekj6a0
>>676
const bool bUniqueList
{
[&]
{
bool bUniqueList = true;
std::set<T> dupChk;
for (auto it = vec.begin(); it != vec.end(); it++) {
auto result = dupChk.insert(*it);
if (!result.second) {
bUniqueList = false;
break;
}
}
return bUniqueList;
} ()
};

if (bUniqueList) { /* ... */ }
2023/03/09(木) 06:47:29.67ID:Kr9kVNlI0
do while が一番パフォーマンス的に有利なんだから
もう少し使いやすくしてほしかったなあ
2023/03/09(木) 06:51:51.75ID:Kr9kVNlI0
>>677
行数増えてんじゃん
2023/03/09(木) 14:14:05.11ID:lc0skjdva
// みんなこうやってんの
{
int outlierCnt;    // ←これのスコープのが問題
do {
  outlierCnt = 0;
  for (int j = 0; j < n; j++) {
    if (...) {
      outlierCnt++;
    }
  }
} while (outlierCnt > 0);
}
2023/03/09(木) 15:04:30.56ID:80vOWs2Ed
for (A;B;C){

} while (D);

こんなのがあれば万能
2023/03/09(木) 15:15:47.17ID:AnxNC5rK0
for (A;B;C){

if(!D) break;
}

解決した
2023/03/09(木) 15:41:20.30ID:80vOWs2Ed
>>682
論理逆だし行も増えるし
2023/03/09(木) 15:46:07.32ID:AnxNC5rK0
>>683
Dの横の一文字が見えない?
2023/03/09(木) 17:40:38.10ID:zXViYC6t0
ループの条件が2箇所になってるのは
構造化プログラミングのパラダイムからは外れる形だね

俺は教条主義者ではないが、あんまり気が乗らない
2023/03/09(木) 17:45:05.69ID:80vOWs2Ed
>>684
見やすさの観点から論理は非常に重要
2023/03/09(木) 17:47:03.73ID:80vOWs2Ed
見やすさや行数を無視するなら
for、while、do while なんかいらない
gotoで良い
2023/03/09(木) 17:51:18.91ID:zXViYC6t0
えー<algorithm>だろ、C++的には
2023/03/09(木) 18:07:24.33ID:Uk52+MzN0
doとかいう貴重な2文字キーワードをこんなとこで無駄遣いしてるのは正直ダサい
2023/03/09(木) 18:41:24.17ID:80vOWs2Ed
{
A
if(!B)goto L0002;
{
}
C
if (D) goto L0001;
L0002:;
}
2023/03/09(木) 19:54:06.46ID:maTPLFSP0
>>681
do {} while (!D) は,ループの事後条件として,Dが条件として成立することを保証している。
(until D として欲しかったが)

for (a;b;c) {} while (D) じゃ,ループの事後条件として何が成立してるのかわからないので
こんなコードは却下だな
2023/03/09(木) 20:02:25.15ID:maTPLFSP0
逆に, B | D が成立してほしいなら
A; do { C } while (!(B|D)) と書くべき
2023/03/09(木) 20:06:14.82ID:pAfi+zPk0
こんなので

dowhile(int cnt; cnt > 0)
{
cnt=0
cnt++;
}
2023/03/09(木) 20:11:30.40ID:maTPLFSP0
for (int cnt=0; cnt>0;) {
cnt++
}
でいいんじゃないの?
2023/03/09(木) 20:22:51.74ID:kUujduR60
do{}while(){}
セミコロン最後に付けるならスコープでいいよな
2023/03/09(木) 20:24:42.25ID:kUujduR60
do{}for(){}
とかなぜないのか
2023/03/09(木) 20:27:29.69ID:maTPLFSP0
ループ終了条件を,ループ制御変数以外で書きたいということ?
別に書いてもいいけど,わかりにくと思うんだ
for (int i=0; i<0 || D ; ++i) { … }
で良いんでは?
2023/03/09(木) 20:28:43.40ID:kUujduR60
do(int i=0){}for(i<n;i++);
こんな感じか
2023/03/09(木) 20:32:17.74ID:maTPLFSP0
for を前に書こうが、後ろに書こうが,for ループを抜けた時は,
for ループの終了条件が成立しているので,前に書いたら良い
2023/03/09(木) 20:35:31.74ID:maTPLFSP0
for (A; B||D; C,D) { … } じゃダメなの?
2023/03/09(木) 21:57:49.10ID:Kr9kVNlI0
>>691
頭悪いって言われない?
2023/03/09(木) 22:20:20.74ID:fJ6NWa1S0
アスペのこだわり大会かよ
2023/03/10(金) 23:18:44.72ID:hCUBJoIo0
>>680
なるほどforeachではなくてforなのですね
わかりました
2023/03/11(土) 03:20:25.02ID:gMabCRDUM
inline 指定子って前方宣言と定義の少なくとも一方に付ければ良いんですかね?
普通は inline 関数を宣言と定義分けて書くことはあまりしないと思いますが
2023/03/11(土) 20:44:27.01ID:+PZMhSrI0
宣言にはつけなくね?
2023/03/12(日) 12:26:00.35ID:/+cwNiL3d
メンバ関数の定義にinlineは普通にやる
2023/03/15(水) 13:16:39.32ID:T1RUme5O0
inlineの元々の意味はもう存在感なくなってきてるな
今はODRに違反するものを通して貰ったり
namespaceのアレとかで使う
2023/03/15(水) 13:44:43.53ID:yzqSYUc10
本来の意味では、コンパイラ依存になっちゃうけどalways_inlineとか__forceinlineっていうのがあったりするな
これもちゃんと規格化した方が良いよね
2023/03/15(水) 15:22:25.13ID:T1RUme5O0
[[force_inline]]か
2023/03/15(水) 20:13:46.16ID:3bZGOkgE0
モジュールだとinlineは元の意味になる、forceではないけど
2023/03/18(土) 00:24:08.81ID:AshFX+nM0
enum class Fooの項目数を取得するにはどうすれば良いですの?
昔ながらに
enum class Foo { A = 0, B, C, D, E, NELEMS };
みたいに要素数NELEMSを定義しないと駄目?
2023/03/18(土) 00:34:08.94ID:4yjyip5Y0
はい
2023/03/18(土) 08:22:34.90ID:X2nJJgpEM
いいえ
できますし実際にライブラリもあります

https://github.com/Neargye/magic_enum
2023/03/18(土) 09:34:19.12ID:AshFX+nM0
ファッ?!
2023/03/18(土) 09:37:45.79ID:XgD5JQEe0
>>711
現在の言語仕様の範囲内でやるならそれがたぶん一番に簡単な方法。

magic_enum を活用するのもいいけど処理系の拡張を利用しているのでもしもメンテが
滞ることがあったら処理系の変化について行けなくて破綻するかも? (余計な心配かも?)
要素数を数えるためだけに導入するならちょっと大げさという感じがする。

将来の C++ にリフレクション系の機能を追加しようとする提案はある。
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4818.pdf
試験的に GCC に追加したブランチもあって、
オンラインコンパイラで試せるところがあったはずなんだがどこだったか思い出せない。 すまぬ……。
2023/03/18(土) 10:54:33.77ID:bCJ0RWMx0
どうやってんのかと思ったらゴリ押しで草
2023/03/19(日) 02:53:52.21ID:aov6FzNY0
std::vectorを初期化せず要素数を変更する方法が存在しないそうですが、どうにかなりませんか?
2023/03/19(日) 07:02:58.28ID:/XQ3/AVL0
>>717
初期化しないことを指定するフラグをメンバ変数に追加し、resize(n,c)の二番目の引数でそのフラグを立てたインスタンスcを渡す。
コピーコンストラクタが呼び出されるので、渡されてきたインスタンスcの該当フラグを見て、初期化するかどうか判定して分岐させる。
2023/03/19(日) 09:21:23.84ID:6gmOWdI+0
>>717
vector が要素のデフォルトコンストラクタを呼ぶことは保証されるが
デフォルトコンストラクタが初期化しないようにしておけば初期化されない。
https://wandbox.org/permlink/8SepeggcI18hio7W
2023/03/19(日) 10:57:57.35ID:6gmOWdI+0
>>711
列挙型を定義するときには要素の数は分かっているのだから要素数を書いた定義も書いておけば十分かもしれない。

#include <type_traits>

// プライマリテンプレート (実際にはこれが使われたらエラー)
template <class T>
class enum_count {
template <class U>
class helper : public std::integral_constant<bool, false> {};
static_assert(helper<T>::value, "expected known enum.");
};
// 列挙型を定義
enum class Foo {A, B, C, D, E};
// 列挙型 Foo の要素数が 5 であることは分かっているので 5 で定義しておく
template <> class enum_count<Foo> : public std::integral_constant<std::size_t, 5> {};

int main(void) {
// 列挙型の要素数をカウントしたかのように見える
static_assert(enum_count<Foo>::value == 5);
}

列挙型の定義と要素数の定義を同時にするようなマクロでも作っておけばなおよいと思う。
Boost にそんな感じのライブラリがあった気がするが使ったことが無いのでよく知らない。
2023/03/19(日) 12:15:12.56ID:+MpLv2UeM
>>717
vectorが連続した領域を確保するので仕方ないかと。

vector のreserveで十分な領域を予約する
vectorにインスタンスじゃなくてsmart pointerを格納する
vectorじゃなくてlistかdequeを使う

クラスを弄くれるなら、move constructorでどうにかならんかね?
2023/03/19(日) 14:31:05.87ID:qEtAe03H0
>>717
どんな要素?クラス?
2023/03/19(日) 15:04:28.20ID:5NoJOqaP0
>>720
レス㌧クスしかし……
enum class FooはFoo::AとかFoo::Bとかいう形でしか使われないのだから個数を返す専用のテンプレートの特ちゅ化を行うよりは
Fooという名前のを何らかの手段でwrapしてやってcountメンバを持たせる方が自然なような、
enum class Foo0 { A = 0, B, C, D, E };
だとして現状class Foo : public Foo0 { ... }みたいなことは書けないから、手段としては次の2つ……
(1) クラスれwrap
struct Foo {
  enum { A, B, C, D, E }; // 古き良きenum、
  static size_t count() { return 5; }
};
(2) namespaceでwrap
namespace Foo {
  enum { A, B, C, D, E }; // 古き良きenum、
  inline size_t count() { return 5; }
};

規格委員会が斜め上の行動に出なければこういう方向性が自然に感じる……
2023/03/19(日) 15:13:02.52ID:5NoJOqaP0
>>717
std::vector<T>をとったら初期化が来る ほんとに早いわ
初期化さえ無かったなら チューリングマシンは楽しいとこ
初期化はきらいだった 私
夢ばかりみていたのよ 私
でもデフォルトコンストラクタとコピコンと代入演算しだけでも
まじめにしておけば
今頃私はかっこいいC++er
初期化はしないよりも しておいたほうがいいわ
2023/03/19(日) 15:17:35.62ID:5NoJOqaP0
初期化はしないよりも しておいたほうがいいわ
2023/03/19(日) 15:18:07.23ID:bKnYO/UZ0
必要があれば初期化するし
必要なければ余計なことはしない

判断できましぇ~んなアホにはなりたくない
2023/03/19(日) 15:25:40.86ID:5NoJOqaP0
>>726
初期化は必要だっつの;;;;
で、std::vector<T>を取るのが高速化されたとしても
要素使用時に初期化が必要なのだから時間短縮にならないという

ていうか通常は(大概のクラスは)初期化時間とかstd::vector<T>が運悪くOSにsbrk()してしまうケースに比べればゴミみがいなもんじゃろ……

という辺りの事情を考えたことも無い>>726、、、
2023/03/19(日) 16:19:34.73ID:5NoJOqaP0
いやすまん>>720について:
>>720の処置にすると使うコードの字面上はFoo::AやFoo::Bがそのまま使えるが、中身が古いenumなので
 Foo x;
 x=2;    // 禁止されない
 int y = x; // キャストを忘れても何も言われない
という問題があったorz
(他にも列挙子の型がint以外にできないとか
やっぱ現状はenum classを活かしつつ>>720にするか、enum classの定義ごとマクロでwrapするしかないのかも|||。n_
2023/03/19(日) 16:35:25.46ID:bKnYO/UZ0
>>727
うん、vectorでは必要だね
そんくらい判断してるよ

マウント取りたさに目がくらんで頓珍漢こくな
2023/03/19(日) 16:37:36.01ID:5NoJOqaP0
>>729
別に……
std::vector<T>の要素がC言語レベルの構造体なら初期化は後回し(最初の代入時)でいい……
2023/03/19(日) 16:41:22.65ID:5NoJOqaP0
なんにせよ未初期化(メモリ内容不定)というのはチューリングマシンのプログラミングモデルでは絶対悪
であることは街行く人100人に聞いたら100人全員がそう答えるので
マウントをとろうとして無駄にあがいているかさもなくば無知なのは>>729の方ででケテーイ……
2023/03/19(日) 16:47:15.92ID:bKnYO/UZ0
捏造データ使うやつの相手はしとれん
俺はどっかの大臣みたいに寛大ではない
2023/03/19(日) 16:51:34.77ID:5NoJOqaP0
どこが捏造データなのかkwsk、
街行く人を引き合いに出したのは統計の結果という誤解を与えたのかもしれんが
チューリングマシンのプログラミングモデルにおいて、初期化を行わないまま次のステップに進めない(やったら動作が不定になる)のは
覆りようが無い真実、、、
2023/03/19(日) 16:55:07.81ID:bKnYO/UZ0
循環バッファ作るときの配列なんかいちいちゼロクリアせんだろ
学校で習いたての未消化の知識で思い込んでんなよ

アホくせ
俺は夕飯の買い物に行くぜ
2023/03/19(日) 17:00:25.55ID:5NoJOqaP0
>>734
そりゃーその配列は最初のデータのencueueがあるまで使われないからな
しかし循環バッファを使う前に、encueカウンタとdecueueカウンタの初期化は必須であるから
その例では>>733を覆したことにはならない
物事の道理が徹頭徹尾わかっていないのに突っかかってくる>>734……
2023/03/19(日) 17:05:21.48ID:5NoJOqaP0
ちと訂正orz、
循環バッファに入れるのが、STLのクラスをメンバに持つような高級なクラスだったとしよう、
すると循環バッファ作るときの配列を未初期化のままとすると、最初のencueueでいきなり代入から始まるから
(代入演算子が呼ばれる)から、未初期化オブジェクトに対する代入演算子が機能したとしてもそれはたまたまという話になる……
よって
>循環バッファ作るときの配列なんかいちいちゼロクリアせんだろ
これの主張は偽。ハイ論破、
2023/03/19(日) 17:48:11.34ID:6gmOWdI+0
>>723
メンバを持てない型にメンバっぽいものを結び付けたい場合 (たとえば char_traits や numeric_limits) だとか、
既存の型をいじらずに拡張できる余地を用意したい場合 (allocator_traits) 、
メタプログラミング用のメタ関数 (type_traits) といったものはトレイトの形にすることもそんなに珍しくはない。

ところで Godbolt でリフレクション (N4818) 実装版の clang が使えた。
列挙子の数を数えるメタ関数を簡易的に書いたらこんな感じ。
https://godbolt.org/z/G4jf65j8f

将来的にはこういう機能が C++ に入るかもしれない。
2023/03/19(日) 18:51:39.67ID:xw5DwAwo0
>>737
get_size_v<get_enumerators_t<reflexpr(Enum)>> でよい。
標準で enum_count みたいなの用意しといて欲しいよね。誰が書いても同じになるんだから。
2023/03/19(日) 20:19:21.80ID:6gmOWdI+0
>>738
おっ、そんな便利なのを見落としておったわ……。

将来的には enum_count みたいなのは入ると思う。
現時点では基礎になるスコープの広い部分を検討中だから
おそらくその上に実装されるであろう部分をどうこういうのは時期尚早ってことなんだろう。
2023/03/19(日) 20:47:43.45ID:bKnYO/UZ0
>>735
覆したかどうかジャッジは衆目に任せようや
2023/03/19(日) 23:30:56.76ID:qEtAe03H0
初期化の必要はないけど、しても負荷はないに等しいという状況もよくあるからなんとも
2023/03/19(日) 23:39:18.94ID:6gmOWdI+0
形式的には初期化をしてても最適化を通ると消えてるってこともあるし……。
2023/03/20(月) 15:45:00.03ID:ORIjxPLV0
必要ないことはしないってだけなのに何か悪いのかよ
見も知らん馬の骨のご機嫌取るのも必要ないかんな
2023/03/20(月) 15:53:20.87ID:ORIjxPLV0
まるでマスク警察だな
初期化警察
2023/03/20(月) 17:50:53.62ID:xiC6G7QOd
>>742
例えばどんな場合?
2023/03/20(月) 18:48:41.76ID:UaylDbEEM
>>734
未初期化メモリのアクセスが未定義じゃなくてエラーだったら良かったんだけどな。
エラーにするの大変なのかね。
2023/03/20(月) 20:03:19.49ID:KynYd7/p0
例えばプログラムでアドレスを計算してる場合に、そのアドレスのメモリが
初期化されてるかどうかをコンパイラが判断するのは難しいだろうね
他にもライブラリとか別のプログラムで初期化されてもわからない
2023/03/20(月) 20:14:42.31ID:GZpDpxkna
>>746
昔はそういうアーキテクチャの計算機もあったらしいよ
今はデバッグツールでそういうことも含めて大抵のことは検出できる
2023/03/20(月) 20:22:11.60ID:hNMIxENu0
vectorに対してcopyとかtransform使うとき、あらかじめコピー元とコピー先のサイズを揃えますけど
この時ほぼほぼ初期化省かれてるなっての分かるじゃないですか

それなら最初から初期化を省くメソッド用意してくれてもいいんじゃないか?と思うわけです
2023/03/20(月) 20:58:12.86ID:KynYd7/p0
まあ、要素がPODの場合にvector::resizeで初期化しないでほしいと思うことはあるけど、
それで仕方なく不要な初期化をして遅くなった試しがないからなぁ・・・
2023/03/20(月) 21:35:36.48ID:c1bWUyRU0
>>749
そのためにサイズとは別にキャパシティの概念があるんじゃないの。
書き込む順序が変な場合だったりすると上手くいかんかもしれんが
copy や transform を使う分には事前にキャパシティを調整した上で
値の書き込みは back_inserter を使えば無駄な初期化も再配置も起こらない。
2023/03/20(月) 21:40:04.28ID:hzdgbGAw0
>>749
insert_iterator は嫌なの?
2023/03/20(月) 21:40:53.83ID:hzdgbGAw0
あ、被った。ごめん。
2023/03/20(月) 22:56:55.34ID:4g6dG7Pp0
初期化が重いならコンストラクタと初期化を分ければ良いし
微妙なコピーによるパフォーマンスを気にするなら自作すれば良い

無い物ねだりは時間の無駄
2023/03/20(月) 23:03:48.48ID:W64rVTKed
アロケータ自作もアリ。
2023/03/20(月) 23:17:51.49ID:c1bWUyRU0
>>755
アロケータはメモリアロケーションに関する制御しか出来ない。
std::vector に与えるアロケータをどう実装しても
要素のコンストラクタの起動を制御することは出来ないと思う。
2023/03/21(火) 06:23:01.76ID:UyD8IPHr0
int a = 0; //こうしないとエラーな環境なんてイラネーヨ
if(cin >> a) cout << a;
2023/03/21(火) 07:38:26.62ID:gGh7BvK80
最速チューンならvectorなんか使うな
2023/03/21(火) 07:39:32.98ID:gGh7BvK80
sprintfの使用がエラーになる環境もある
2023/03/21(火) 17:14:11.67ID:uh1D01cuM
>>751
そうすると一々サイズとキャパシティ比較するif文挟むから結局オーバーヘッドあるやん

まあstd::vector使うなというのはもっともでこういうときのためにstd::make_XXX_for_overwriteがある
2023/03/22(水) 07:23:54.33ID:9C9l1JTzM
>>760
vector::reserveをご存知でない?
2023/03/22(水) 09:35:50.58ID:GXnnX9o30
>>761
back_insert_iterator での値の追加は push_back するのに等しい。
https://timsong-cpp.github.io/cppwp/n3337/back.insert.iter.op=
push_back するときはキャパシティが足りるかどうかで動作が異なる。
https://timsong-cpp.github.io/cppwp/n3337/vector.modifiers
結果的にキャパシティが足りていてもキャパシティが足りているかどうかのチェックはおこなわれる。
そのことを >>760 は言ってる。
2023/03/22(水) 16:48:53.83ID:X+UQzyz90
STLコンテナのうちvectorだけがC言語やシステムコールで使う配列との互換性を保証するのだから「vector使うな」とか噴飯ものだよ
2023/03/22(水) 16:56:07.11ID:GXnnX9o30
>>760
いわれてみれば確かにゼロコストというわけではないね。
現代的な CPU だと分岐予測が効く場合だと思うので実行時間的には小さいと思うが……。

スマートポインタに for_overwrite 版が入ったなら vector でもやろうという提案は
絶対に出るだろうと思って検索してみたら vector については見つけられなかったが
basic_string::resize_and_overwrite を足す提案はあったわ。
http://wg21.link/P1072R10
2023/03/22(水) 17:09:49.01ID:gZ+A13pt0
std::vector<bool>さん…
2023/03/22(水) 18:28:48.27ID:qjwjL2/30
>>765
の何がダメなのかちゃんと言えますか
分かってないくせにstd::vector<bool>貶してる奴見ると腹立つわ
2023/03/22(水) 19:15:35.45ID:GXnnX9o30
>>766
文脈的に >>765>>763 を受けてのものなんだから配列との互換性の話なのは自明やん。
2023/03/22(水) 20:15:46.78ID:V+0jsH670
極限チューンしたいならvectorなんか使うな
vector使うなら多少のオーバーヘッドは気にするな
2023/03/22(水) 20:22:41.22ID:w6cUkLD60
極限チューンしたいならC++なんか使うな
C++使うなら多少のオーバーヘッドは気にするな

とか言っちゃうのかねこういう人は。
2023/03/22(水) 20:30:41.10ID:V+0jsH670
C++でダメならアセンブラ
2023/03/22(水) 20:54:34.32ID:bSdzjV5Ad
>最速チューン
>極限チューン
特にしたくありせん
2023/03/22(水) 21:54:01.77ID:1hDeVWBQM
>>764
だいぶ前に記事そのものがあったわ
リンク先読んでないけど過去に提案されてるっぽい?

https://faithandbrave.hateblo.jp/entry/20131203/1386054567
2023/03/22(水) 22:26:40.76ID:V+0jsH670
>>771
じゃあ細かい事は気にするな
2023/03/23(木) 09:55:02.98ID:QwfINZIH0
極限とか感情的バイアスで話すやつはマトモに相手しとれん
775デフォルトの名無しさん (アウアウウー Sa95-lF85)
垢版 |
2023/03/23(木) 11:09:09.78ID:AQHpwrnPa
>>768-769
deque
2023/03/23(木) 15:45:01.00ID:I4BdcjQJ0
DQN?
2023/03/23(木) 20:01:05.89ID:AO0LAUkv0
昔は煽って情報引き出そうとする輩もおったけど、今はAIに聞けば全部教えてくれるんだよな
2023/03/23(木) 20:36:59.72ID:QwfINZIH0
AIねえ・・ライダハンて何って聞くとキムチ臭いことを「教えてくれる」けど
おまえはそれを何だ? 神様のお告げとか思ってるの?
アホなの? それともバカなの? 今すぐ首吊って死ねよ
2023/03/23(木) 20:44:08.19ID:QwfINZIH0
機械と人間の違いがわからねーやつは人類全ての敵だ
機械は言われたとおりにやってるだけ
そこにポリシーも夢もひとかけもない

呆れ果てたスーパー情弱のために教えておいてやるが
機械にできるのは演繹だけで帰納はできないって根本的な問題があるんだよ
教わったことが絶対でどんなにおかしい答えも平然と言ってのける

日教組に洗脳されたおまえとそっくりだなwww
2023/03/23(木) 22:27:29.21ID:Df8F7oRN0
代わりに辞書を引いてくれるだけでも大したもんだよ
引き方によってはちょっとした会話にもなるしな
2023/03/23(木) 22:43:25.00ID:AO0LAUkv0
辞書じゃなくて仕様書な?
2023/03/24(金) 08:04:10.44ID:p0qI+e9PM
根本的な話をすると脳のニューロン組織とAIプログラムのニューラルネットワークは動作原理は同じ
生体細胞の圧倒的物量による並列処理能力の高さと半導体素子の圧倒的記憶演算能力による方向性の違いだけ
いずれ学習が飛躍的に進めば機械が脳を超える時が来る
2023/03/24(金) 10:59:13.15ID:LuP95mud0
脳内でバックプロパゲーションとか起こってると思ってるならあまりにももの知らんねキミ
784デフォルトの名無しさん (ワッチョイ 1305-Dpq4)
垢版 |
2023/03/24(金) 11:29:29.53ID:iD/qyfMR0
まあ中枢神経でも逆行性の情報伝達は起きてるけどな
そんなことより改行の後スペースは何回打つのがメジャーなんか?
なおタブ派の意見は聞かない
785デフォルトの名無しさん (ワッチョイ 1305-Dpq4)
垢版 |
2023/03/24(金) 11:33:31.33ID:iD/qyfMR0
ちなみに俺は7回だ
2023/03/24(金) 15:08:24.40ID:h3NqECut0
ChatGPT研究所
@ctgptlb
今回、驚くべき実験結果が得られました。ChatGPTには敬語で接すると、出力が大幅に良くなる可能性が示唆されました!

https://chatgpt-lab.com/n/nd8dde92016ec
https://ul.h3z.jp/FMiV1SBC.png
https://ul.h3z.jp/cA2maV7H.jpeg

AIも雑なヤロウには雑に扱う
2023/03/24(金) 15:19:50.19ID:A6TekdSG0
なんか上から目線でえばってるくせに帰納の意味がわかってなさそうなのがいるなksks
2023/03/24(金) 20:18:38.86ID:ZgVZm4b/0
>>777
私?私?
今でも炎上学習法は通用するのかな?
2023/03/24(金) 22:17:35.84ID:A6TekdSG0
人が作った焼き物に手を合わせて神のご加護をってやつだろwww
2023/04/01(土) 01:18:43.60ID:TiOY9/eM0
priority_queueに渡す比較関数って、functionでインライン的に書くより
別途ラムダを書いてそれをdecltype()で渡す方がいいんですかね?
後者と同等なインライン的な書き方はあります?
2023/04/01(土) 06:57:15.82ID:Q/l4fj4H0
>>790
ラムダ式は視認性を改善する目的で使うものなので、ラムダ式のせいでかえって視認性が悪くなるようであればあきらめ時
2023/04/01(土) 07:50:02.77ID:mhQOcPkw0
↓のページの「例」みたいなことがやりたいの?
https://cpprefjp.github.io/lang/cpp20/default_constructible_and_assignable_stateless_lambdas.html
2023/04/01(土) 14:13:57.01ID:STWEvCbN0
>>790
インライン的な書き方ってどんな書き方?
2023/04/01(土) 14:26:59.20ID:TiOY9/eM0
例えばfunctionを使って比較関数をインライン的に書くとこうですよね
priority_queue<int, vector<int>, function<bool(int a, int b)>> pq([](int a, int b){return a > b;});

一方ラムダを使った場合は例えばこんなですよね
auto comp = [](int a, int b) { return a > b; };
priority_queue<int, vector<int>, decltype(comp)> pq(comp);

で疑問に思ったのが
- 上記の例で後者の場合もインライン的に書ける? まソース的には1行目と2行目を改行なしで
書けばいいのかもしれないけどw
- function を使う場合と decltype を使う場合の違いに何が違う?

ということです
2023/04/01(土) 14:29:01.96ID:TiOY9/eM0
う、二番目の質問がおかしい
- function と delctype で単に書き方が違うという以上の違いはありますか?
2023/04/01(土) 14:31:10.70ID:TiOY9/eM0
function と decltype は単にシンタックスが違うだけというなら、これからは一番最初の
function を使った書き方で行こうかなと思います
2023/04/01(土) 15:00:44.48ID:IfOudlag0
C++17以降ならdeduction guideが使える
priority_queue pq { [](int a, int b){return a > b;}, vector<int>{} };
2023/04/02(日) 08:51:08.20ID:t9D8iOvK0
メモリ確保と同時に初期化、
これをしないことによる顕著なメリットの説明がそろそろあってしかるべき……
初期化をしないことによってメモリ確保はメモリ確保1回あたり(デフォルトコンストラクタにもよるが)数千~数万クロックサイクルぐらい早くなるかもしれないが
プログラムの実行速度を追求したいならそもそもメモリ確保とかいっぱい回るループの中ですべきではないし、
そもそも領域を確保しておいて初期化を後回しにするとか、プログラミを不必要に複雑なピタゴラスイッチ化するだけ……

もっとも、毎秒1万回std::vector<T>を構築するとか、サイズ3TBのFIFOを作るとかなアフォ
構想時点で極めて特殊な設計なら話は別やが……
2023/04/02(日) 09:00:08.86ID:t9D8iOvK0
それよか一番危険なのは、
>必要があれば初期化するし
>必要なければ余計なことはしない
>
>判断できましぇ~んなアホにはなりたくない (キリ
とのたまう人が、encueカウンタやdecueueカウンタが未初期かなFIFO、みたいな
益体も無い例を持ち出してみたり、冒す必要のない危険を冒してまでリリースしてしまうことや……
2023/04/02(日) 09:31:47.33ID:t9D8iOvK0
>>784
教師信号はどこから来るというんじゃ……
2023/04/02(日) 10:42:08.81ID:B65ZsGdj0
まず、えんきゅーできゅーのスペル確認ぐらいしてくれ。
2023/04/02(日) 10:44:15.18ID:t9D8iOvK0
まともな回答を寄越してくれたら直してしんぜよう、
2023/04/02(日) 10:52:59.44ID:iUrLRRfa0
>>801
>>800はアホなんから構うなよ
>>23とか>>674とか見りゃやべーヤツって分かんだろ
2023/04/02(日) 11:02:53.69ID:WgpY8vNM0
char fifo[256] = 俺はここのことを言った
char* enq = ここの話に逸らした時点でアホの相手はやめた
2023/04/02(日) 16:04:22.42ID:MRqRSiku0
CUE!難民発見
2023/04/02(日) 16:50:57.97ID:gP4vNTAJ0
>>796
std::function は実行時に型を切り替える機能をもったクラスで、
後から切り替える可能性が無い場面では無駄になるから避けるのが普通だと思う。

#include <functional>

int foo(void) { return 1; }

int main() {
// 関数ポインタとクロージャは異なる型だが
// std::function は呼出しの形式が同じならどちらでも扱える
std::function<int(void)> bar = foo; // 関数ポインタを格納できる
bar = [](void) -> int { return 1; }; // クロージャも格納できる
}
2023/04/02(日) 17:17:55.77ID:Pu7bAi6b0
コンパイラと標準ライブラリによるんだろうけど、
std::functionはラップしてるぶんラムダに比べて遅いだろうね
でもラップしてるおかげで柔軟だから用途次第で使い分けるのがいいね
2023/04/02(日) 17:20:28.25ID:WgpY8vNM0
anyみたいにRTTIを使っているわけじゃないけどね
2023/04/08(土) 06:18:03.35ID:AxtXnxq40
bool型を整数に変換した時、false -> 0, true -> 1 は保証される?
2023/04/08(土) 06:19:18.69ID:jYlViDaH0
される
2023/04/08(土) 06:40:35.49ID:AxtXnxq40
ですか
何個条件が成り立っているかを数えるときに上記を使ってるっぽいコードがあったので
2023/04/08(土) 08:36:57.00ID:v6ilm6510
WindowsのBOOLは保障されない点だけ気を付けよう
==TRUEとかやっちゃダメだからね
2023/04/08(土) 09:17:21.57ID:CT+2+9fN0
>>809
https://timsong-cpp.github.io/cppwp/n3337/conv.integral#4
2023/04/08(土) 10:10:31.03ID:zFgkwmzh0
TRUE==1 FALSE==0 は仕様で明確に保証されていたかは知らんが事実上変えようがないから実害はないな。
注意するのは「FALSEでない値」とTRUEは違うってことで。
2023/04/08(土) 11:19:32.51ID:CT+2+9fN0
>>814
ドキュメントに書いてあるから仕様と言ってよさそう。
https://learn.microsoft.com/en-us/windows/win32/learnwin32/windows-coding-conventions#boolean-type
2023/04/08(土) 11:52:43.24ID:x/nopyOk0
#define True !Fales はもう昔の話か
2023/04/08(土) 16:50:36.81ID:jYlViDaH0
GetMessage() < 0 とかもうアボカド
2023/04/09(日) 09:19:40.13ID:Dm0aM9sgF
#define True !False
printf("%d", True);

# 1
819デフォルトの名無しさん (アウウィフ FF05-883t)
垢版 |
2023/04/09(日) 09:20:16.12ID:Dm0aM9sgF
>>817
ほんそれ++
820デフォルトの名無しさん (アウアウウー Sa05-/Yip)
垢版 |
2023/04/09(日) 23:45:39.86ID:Gr5O5zRWa
c++の入門書のサンプルでは、整数を 42で初期化するケースが多い気がします
この 42(fooやbarを使うように)には意味があるのでしょうか
2023/04/09(日) 23:49:54.13ID:mWJqmDjC0
>>820
https://ja.wikipedia.org/wiki/%E7%94%9F%E5%91%BD%E3%80%81%E5%AE%87%E5%AE%99%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6%E4%B8%87%E7%89%A9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E7%A9%B6%E6%A5%B5%E3%81%AE%E7%96%91%E5%95%8F%E3%81%AE%E7%AD%94%E3%81%88
822デフォルトの名無しさん (アウアウウー Sa05-/Yip)
垢版 |
2023/04/10(月) 00:03:58.95ID:PpQYou85a
>>821
thx!
2023/04/10(月) 10:38:06.12ID:auMz+cIB0
constevalな関数の中でchar配列中からintを読み取る場合ってポインタ使えないから下記のようにするしかない?
arr[index] | ((int)arr[index + 1] << 8) | ((int)arr[index + 2] << 16) | ((int)arr[index + 3] << 24);
2023/04/10(月) 13:13:53.16ID:j1Pkk3Kb0
>>823
constevalじゃなくても環境依存せずにその手の数値取り出しをしたければそうする他無い。
あと(int)は意味ないと思う。
2023/04/10(月) 13:14:40.33ID:Y31i0sl00
>>823
共用体は使えないの?
826デフォルトの名無しさん (スップ Sd82-qF+M)
垢版 |
2023/04/10(月) 15:33:11.04ID:3mw67OVid
32bit-little endianであることを前提になるがいいか?
あとこれarr[3]が0-127に収まってないとintの符号ビット壊しそうだし、
charが符号付きの環境だとシフト+bit orが意図通りにならなそう
2023/04/11(火) 00:04:23.89ID:Ta/4j/O20
>>823
consteval使えるならbit_castも使えるのでは
2023/04/11(火) 00:07:23.43ID:HzbpoBAH0
>>827
配列の一部だけを参照する方法がないから
bit_cast を使うなら bit_cast を使える状態にする必要があって
この場合はあまり楽にならない。
2023/04/11(火) 12:34:29.16ID:Ii6omevMd
>>826
おもいっきり環境依存なコードに対して環境依存を心配するアホ
2023/04/11(火) 12:34:35.05ID:Ii6omevMd
>>826
おもいっきり環境依存なコードに対して環境依存を心配するアホ
2023/04/11(火) 15:29:28.26ID:No77oSsN0
右シフトはおもいっきり符号にひっぱられるけど左シフトならセーフだべ?
2023/04/11(火) 15:38:30.59ID:aQanOcc40
char→intで符号拡張されちゃうべ
2023/04/11(火) 15:39:28.74ID:No77oSsN0
んだんだ 0xff で マスクするべな
2023/04/11(火) 15:43:02.02ID:No77oSsN0
(0x0ff & (int)a[i]) |
(0x0ff & (a[i+1] <<8)) |
(0x0ff & (a[i+2] <<16)) |
(0x0ff & (a[i+3] <<24))
これでよろしかですかの?
2023/04/11(火) 15:43:45.69ID:No77oSsN0
ひでぇ間違えた もういいー
2023/04/11(火) 15:47:35.33ID:ukUq4n2Z0
>>834
そんなことしなくても (int)(unsigned char) でいいのでは?
2023/04/11(火) 16:07:55.56ID:No77oSsN0
んだな
2023/04/11(火) 17:30:55.22ID:K2f5iX7Sd
(int) いらね
2023/04/11(火) 18:27:39.70ID:3b0RAKoL0
(unsigned int)arr[index] | ((unsigned int)arr[index + 1] << 8) | ((unsigned int)arr[index + 2] << 16) | ((unsigned int)arr[index + 3] << 24);
2023/04/11(火) 18:33:47.48ID:3b0RAKoL0
いや、こうか
arr[index] | int((unsigned)arr[index + 1] << 8) | int((unsigned)arr[index + 2] << 16) | int((unsigned)arr[index + 3] << 24);
841デフォルトの名無しさん (アウアウエー Sa0a-0l8A)
垢版 |
2023/04/11(火) 18:49:44.57ID:HmfbYrEaa
以下はTCP/IPのクライアントを作成する例なのですが、このコードにタイムアウト値を付けるにはどうしたら良いですか?
http://onishi-lab.jp/programming/tcp_win.html

// Windows の場合
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);

// 相手先アドレスの入力と送る文字の入力
printf("サーバーマシンのIPは?:");
scanf("%s", destination);

// sockaddr_in 構造体のセット
memset(&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_port = htons(PORT);
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr(destination);

// ソケットの生成
dstSocket = socket(AF_INET, SOCK_STREAM, 0);

//接続
if(connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr))){
printf("%s に接続できませんでした\n",destination);
return(-1);
}
2023/04/11(火) 19:25:01.15ID:BlUKqEB00
winsock2 connect タイムアウト
843デフォルトの名無しさん (アウアウエー Sa0a-0l8A)
垢版 |
2023/04/12(水) 20:53:53.05ID:slmCp11Ka
>>842
ありがとうございます。
この記事のWindows版を参考にしてタイムアウトつき接続できたのですが
https://qiita.com/hidetaka0/items/501ad17b4c23c3adee03

これってちゃんとサーバーに接続できた場合、接続できたことをコード内のどこで判別すれば良いのでしょうか?
色んな箇所にprintを仕込んでみたのですがよくわかりませんでした。
2023/04/12(水) 21:19:15.87ID:3roUAINp0
//読み書きできる状態
2023/04/12(水) 21:38:01.94ID:IOSSRt+R0
ネットワークプログラミングスレってあったと思うんだけど
何でここで質問するのか理解できない
846デフォルトの名無しさん (スプープ Sd22-pvw1)
垢版 |
2023/04/13(木) 00:15:12.61ID:ndOnjJhod
>>844
そこにprint挟んでも通過しないんですよね
繋がってるのに
2023/04/13(木) 01:15:15.35ID:DRH76Ra10
>>846
ほんとにつながってるの?
そこ通らないと他はエラー(-1)しか返さないんじゃないの?
2023/04/13(木) 01:23:34.33ID:DRH76Ra10
>>846
あと、printfはメインスレッドからコールしないと遮断されること普通にあるぞ
ファイルにfprintfで書いてみれよ
2023/04/13(木) 01:28:55.79ID:DRH76Ra10
あと考えられる問題は、スレッドのスタックが足りなくてprintfがコールできていない可能性だな
いろいろと洗ってみれ
850デフォルトの名無しさん (スプープ Sd22-0l8A)
垢版 |
2023/04/13(木) 02:30:15.77ID:/ixh6GMqd
>>847
以下のようにprintというかcoutを挟むと、接続前はずっと"1"が出力されるのに、接続後は何も出力されなくなります。
エラーも出ず、プログラムは動き続けます。

int sockNum = select(socket + 1, &readFd, &writeFd, &errFd, &timeout);
if(0 == sockNum)
{
//timeout
std::cout << "1" << std::endl;
return -1;
}
else if(FD_ISSET(socket, &readFd) || FD_ISSET(socket, &writeFd) )
{
std::cout << "2" << std::endl;
}
else
{
//error
std::cout << "3" << std::endl;
return -1;
}
std::cout << "4" << std::endl;
2023/04/13(木) 02:46:49.32ID:DRH76Ra10
そこ、コードが間違ってるな
selectのエラーは負の値返したときだよ
2023/04/13(木) 06:22:49.75ID:DRH76Ra10
だがしかし、エラーじゃなくてタイムアウト検査して0と比較しているからこのままでも問題はないか
timevalのタイムアウト値がまちがってんじゃねーの?とは思う
2023/04/13(木) 07:23:10.38ID:8nXR27xn0
socket + 1って何だっけ
おかしい原因これじゃないの?こういうもんだっけ?
854デフォルトの名無しさん (ワッチョイ a2fb-qF+M)
垢版 |
2023/04/13(木) 08:05:52.88ID:AKmB1uVA0
VisualStudio使ってるんならステップ実行したほうがはやいんじゃね

1行ずつ実行してどこでクラッシュ/待たされてるかすぐにわかるぞ
2023/04/13(木) 10:00:54.60ID:4kBfFXBL0
接続後にConnect呼んでないだけでしょ
856デフォルトの名無しさん (スプープ Sd22-pvw1)
垢版 |
2023/04/13(木) 10:36:58.20ID:GsnZRt31d
>>855
コード内のどこでconnectを呼べば良いですか?
2023/04/13(木) 15:55:39.85ID:4kBfFXBL0
>>856
ソースをうpは無理?
2023/04/13(木) 17:56:14.36ID:iNDrHE0O0
初心者なのですが、find()で結果がないときnposの場合と.hoge.end()の場合、
イテレータで hoge.begin()とする場合と begin(hoge)とする場合(end()も同様)、等
混乱しております。これは...
2023/04/13(木) 18:12:14.03ID:zEEI4t8g0
nposってstd::basic_stringのか?
#include <algorithm>のfindとは別物だぞ

メンバ関数でfindを持っているオブジェクトならhoge.begin()
持っていないオブジェクトにはbegin(hoge)
2023/04/13(木) 18:22:14.89ID:y5cvZaYN0
>>858
algorithm にある std::find と string にある std::string::find の違いのことかな?
それはまあ名前が同じだけの別物なんでそういうものと思うしか仕方がない。

begin については、
異なるものが共通のインターフェイスで扱えるとテンプレート内で扱いやすいだろうというのが基本的な事情。
でも配列とかポインタがメンバを持つことは出来ないからこれらも含めて共通の扱いをしたい場合は
メンバ関数の begin よりも非メンバ関数の std::begin を使う必要がある。
メンバに begin を持っている場合はそれを直接に呼んでも std::begin を使っても結果は同じだよ。

C++ には ADL という仕組みがあって引数に関連する名前空間も関数を探す探索対象になるというルールがある。
std::begin は ADL の仕組みと相性が悪いところがあって扱いづらいので
新しい仕様は std::ranges::begin が導入された。

ややこしいんだが全部を一貫して説明できるような統制された理屈があるわけではなくて
細々とした歴史的事情の積み重ねでグダグダになってるだけ。
2023/04/15(土) 01:20:02.46ID:dgB6RPkk0
intとsize_tって足し算したらsize_tになるんか・・・?
2023/04/15(土) 02:11:09.11ID:KQOFatDn0
bit数の大きい側に拡張してから演算するんやっけ
2023/04/15(土) 02:27:21.46ID:m2iUDqjP0
不安ならキャストせい
2023/04/15(土) 02:33:26.00ID:dgB6RPkk0
改めて書くと
std::vector<...> vec;
int neg = -15;
for(int x = neg ; x < neg + vec.size() ; x++){ ...
こんな感じのfor文の中になぜか入ってこず
for(int x = neg ; x < neg + (int)vec.size() ; x++){ ...
こう書き換えたらfor文の中にちゃんと入ってきたので
何事かと
2023/04/15(土) 02:57:32.14ID:m2iUDqjP0
そりゃビット数の多いsize_tに自動的にキャストされるからな
2023/04/15(土) 09:19:08.06ID:9E7JiVxa0
コンパイラの警告出てるでしょそれ
867デフォルトの名無しさん (ワッチョイ 5ffb-ZLJR)
垢版 |
2023/04/15(土) 12:55:47.51ID:ZHLNp/Uz0
32bit intが表現できる範囲(-21億〜+21億)と
size_tが表現できる範囲(32bit環境なら0〜42億、64bit環境なら1800京)が違うんだよね

直接キャストしたり比較演算した結果が一目で分からないし、
未規定の動作も紛れてるから
コンパイラによって結果が変わったりする
2023/04/15(土) 15:43:33.34ID:5Qe8Q1VE0
ちなみに更に厳密なことを言うと std::vector::size() の返却値の型は std::vector::size_type であって、
一般的な実装では size_t の別名として定義されることが多いけどそうでないこともありうる。
2023/04/15(土) 17:41:19.21ID:SXeCdLds0
移植性を気にする人ってtypename std::vector<hoge>::size_typeとか書いてるの?
2023/04/15(土) 18:32:47.38ID:9E7JiVxa0
こんなかなあ
不用意にsize_t決め打ちはなるべくしない(せざるをえない場合もある)

auto N = v.size();

for(decltype(N) i = 0; i < N; ++i) { /**/ }
2023/04/15(土) 20:20:15.05ID:iq3ZlEDB0
単にsize_tの型とイコールじゃなかったらエラーではねとけばいいんじゃね
想定外環境でも何でもかんでも通そううなんて思考はバグの元になるし
2023/04/15(土) 20:53:24.33ID:9nQxeRw/0
NAXDE
2023/04/15(土) 20:58:21.87ID:9nQxeRw/0
なんでsize_tをunsigned にしたんだろうな…
2023/04/15(土) 21:05:21.11ID:r+oi7xUE0
そりゃサイズに負数はあり得ないからでは?
-12バイトのファイルなんてありえないですし
2023/04/15(土) 21:41:39.88ID:fX0vt5Cu0
奥さん! そこでssize_tですよ!
2023/04/15(土) 22:41:45.51ID:21huWqOn0
数の概念が生まれた当初は負の数なんて想像つかなかったしな。
マイナス3個のリンゴとか存在しないし。
2023/04/15(土) 22:44:53.66ID:r+oi7xUE0
つまりマイナスの概念が存在しない時からsize_tは存在していた!?
2023/04/15(土) 23:18:30.96ID:mFN3uRP10
負数があるならssize_tやptrdiff_tと使い分けなよ…
2023/04/16(日) 09:49:57.27ID:KtrVYfy50
for (size_t k = 999; k >= 0; k--) {
 ...
2023/04/16(日) 12:17:04.86ID:mZTbxJpt0
for (size_t k = 999; k+1 > 0; k--) {
 ...
2023/04/16(日) 17:59:44.79ID:gghWvzSgd
k > -1
2023/04/16(日) 21:30:04.86ID:SbMfPVDO0
k < -1
2023/04/16(日) 23:08:58.58ID:EOwLLPBr0
くノ一
884デフォルトの名無しさん (アウアウウー Sacb-/q5i)
垢版 |
2023/04/17(月) 20:58:44.15ID:RKcegE7fa
size_t の変数を 0 との大小で比較しても
常に >= 0 だから変なことになる
for で -- してるときは特に注意な
2023/04/18(火) 07:58:45.20ID:EVDEK+w/M
負の数、虚の数
2023/04/18(火) 09:29:12.70ID:hwR9qYx/0
符号無しループはグーグルだとコーディング規約違反だからな
887デフォルトの名無しさん (ワッチョイ 2763-7nfa)
垢版 |
2023/04/19(水) 11:20:40.34ID:twYHK80b0
コーディング基準はあくまで特定案件での決めごとに過ぎず
井の外で何かを批判する根拠に使っても説得力はない
2023/04/19(水) 11:50:42.02ID:rE0e6VM+0
符号ありしかない言語もあるから、それなりに一般性あるかと
889デフォルトの名無しさん (ワッチョイ 2763-7nfa)
垢版 |
2023/04/19(水) 12:06:58.70ID:twYHK80b0
特定案件つーてるのに他の言語?
話通じないやつだな
2023/04/19(水) 12:12:27.61ID:rE0e6VM+0
あれ?話広げたいんじゃなかったのか こりゃ失礼
2023/04/21(金) 06:54:24.86ID:zpP4hMgV0
std::vector<T>::size()やstrlen()が符号無しで返してくるからそれらを使った汎用ライブラリ的なものを書く場合に仕方なくsize_tを使うこともあるだけでループ変数については符号有りで大して困らない希ガスだいたいOS記述言語であるところのC言語がアセンブラでは常識的に利用されるゼロフラグやキャリーフラグの概念を捨て去った設計した点をかみしめるべきや整数表現のMSBまで符号以外の意味で使わねばならないシチュエーションはマジ少ない多倍長演算であってさえ2のべき乗範囲に拘るのを捨てたらゼロフラグやキャリーフラグを駆使してビット幅全部使う記述と同等以上の効率にできうる
2023/04/21(金) 07:19:21.58ID:opTauXds0
句読点を入れろ
2023/04/21(金) 08:49:31.32ID:6fw7yQrg0
江戸時代かよ。
2023/04/21(金) 11:52:07.81ID:Er6tcVYC0
スレチだと思うけどx86intrinsicsに詳しい人がいたらNonTemporal命令について教えてもらいたい
_mm_stream_load_si128や_mm_stream_si32はCPUキャッシュに対象範囲が無い場合はキャッシュスルーして確実にメモリを読み書きするということは分かったけど、
CPUキャッシュにある場合の挙動は一般的な命令同様にCPU内だけで完結してしまう?
2023/04/26(水) 10:00:37.79ID:N7+hGpB4a
>>891
読める・・・
読めるぞ!!
2023/04/26(水) 12:19:22.01ID:eD6bPnvLd
>>894
パフォーマンスを気にしてるなら実験、測定するべきだし
同期ならメモリバリア命令など適切な措置を取るべき
2023/04/26(水) 19:26:58.67ID:4J8YauGVM
素人考えで悪いけどメモリへの書き込みがされずCPU内だけで終わると困ると思うけど

勝手なイメージ

書き込むアドレス内容がキャッシュに
ある
キャッシュのデータも書き換える → 通常の動作

ない
_mm_stream_si32の場合 キャッシュへデータを読み込まない → 速い
その他の場合 キャッシュへデータを読み込む → 遅い
2023/04/26(水) 20:14:03.72ID:4J8YauGVM
avx2でnon temporay loadの方を比較したけどほぼ変わらない
サイズが小さすぎたせいかもしれないけど
2023/04/26(水) 22:05:00.98ID:T6VCSheE0
>>896
目的はDMAとの整合性で既存の実装は勿論同期処理していたが
数日稼働させてみてTemporal命令混ぜた後にstreamストアしても今のところ不整合発生してないからもうちょい様子見てみる
2023/04/26(水) 22:12:18.77ID:T6VCSheE0
>>898
本来のnon temporal命令の利点はその命令自体の速度ではなくキャッシュ汚染防止だね
例えば離れたアドレスにあるであろうstatic変数にアクセスするとき、その付近のデータには一定期間内に一度しかアクセスしないと分かりきっているなら、CPUの親切心による近隣メモリのキャッシュへの先読みはどうせ使われないのでむしろペナルティでしかなく不要となる

あとはmemcpyにおいてキャッシュはソース側に集中させてディスト側へは_mm_streamでキャッシュ汚染を抑えてコピーをするというテクニックもあって多分メジャーどころのコンパイラ実装は大体そうなってる
IvyBridge以降であればsimdより強化版rep movsbの方が早いケースも多くて分岐によってそっちに行くこともあるだろうけど
2023/04/26(水) 22:46:41.52ID:4J8YauGVM
>>900
それなら納得

AMDでも試したけど変わらないな
2023/04/26(水) 22:54:06.40ID:4J8YauGVM
それとx86intrinsicsと書かれてるのはSystem.Runtime.Intrinsics.X86 名前空間で.netなんだ
コンパイラがキャッシュを気にしたIL吐いたりそこから最適化されたネイティブコードを吐くようにはできてないと思う
2023/04/30(日) 10:58:06.37ID:W+TV1tj50
これまでなんとなくinitializer_listを使ってきたのですが
このクラスって他のクラスと異なりコンパイラによって特別な解釈をされるのでしょうか?
以下のhoge::initializer_listはstdからコピペしてpublicメンバ以外を除外したものです
hoge::initializer_listを実体化するとコンパイルエラーとなります
コンパイラは g++ (Debian 10.2.1-6) 10.2.1 20210110 です
#include <initializer_list>
#include <cstddef>
namespace hoge {
template<class _E>
class initializer_list {
private: // 割愛
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;
constexpr initializer_list() noexcept;
constexpr size_type size() const noexcept;
constexpr const_iterator begin() const noexcept;
constexpr const_iterator end() const noexcept;
};
}
int main () {
std::initializer_list <int> il0 = {10, 100, 1000};
hoge::initializer_list <int> il1 = {10, 100, 1000}; // <- コンパイルエラー
return 0;
}
エラーメッセージは
error: could not convert ‘{10, 100, 1000}’from ‘<brace-enclosed initializer list>’ to ‘hoge::initializer_list<int>’
2023/04/30(日) 11:09:10.55ID:W+TV1tj50
エラーメッセージから考えると
1. { ..., ..., ..., }はstd::initializer_listと解釈される
2. std::initializer_listをhoge::initializer_listに変換しようとしてエラー
ということだと予想しますが
上記の1がstd::initializer_listを特殊なクラスとしている言語仕様と考えれば良い?
2023/04/30(日) 11:20:07.93ID:bMmQu4ho0
>>903
constexpr initializer_list(std::initializer_list<_E> const&) noexcept { }
これを追加すると通る

コンパイラは { } で std::initializer_list を生じる、という意味で「特別な解釈」をする
似たような話で typeid() で std::type_info を生じるのと同様
2023/04/30(日) 11:20:11.94ID:orzgKU680
継承も何もしてないのにhoge::で上手く行くワケないだろ
2023/04/30(日) 11:25:59.75ID:orzgKU680
せめて>>985みたいにstd::initializer_listを何かしらの形で受け入れ口としてコンストラクタに実装してやらないと通らないだろ
2023/04/30(日) 11:31:13.64ID:9Izkr3hY0
一般にstd名前空間のものは全部言語仕様と一体のものとしてあらゆる特別扱いが許されてるので
ヘッダからコピペして作った自作クラスが標準と同じように振る舞ってくれない可能性は常にある
2023/04/30(日) 11:36:13.87ID:W+TV1tj50
>>905-908
みなさん有難うございます

>>908
>一般にstd名前空間のものは全部言語仕様と一体のものとしてあらゆる特別扱いが許されてるので
これは最小限にして欲しいものですね

>>905
>似たような話で typeid() で std::type_info を生じるのと同様
なるほどー! 言われてみればこれも気持ち悪かったです
同種の気持ち悪さ
2023/04/30(日) 11:38:03.98ID:cNEEfLAb0
初期化リストは式ではない
2023/04/30(日) 18:30:04.58ID:KfqDu01oH
低レベルな質問ですが、よろしくお願いします

char str[10] = {0};

char str[10] = {0,};

この二つって違うんですか?
2023/04/30(日) 18:59:49.81ID:F7/GeCtB0
>>911
下は0,0と同じ意味じゃないかな
2023/04/30(日) 19:05:00.57ID:3Dh4f3TB0
どっちも10個とも0になる
2023/04/30(日) 19:21:03.63ID:orzgKU680
最後のカンマの次に項目を書かなくてもエラーにならなくなった名残だな
2023/04/30(日) 19:25:11.20ID:AIS6Ui5R0
>>911
最後のカンマに文法上の機能はなく、単に余計なカンマを許容するだけ。
どちらも 0 がひとつ与えられる初期化子であるという扱いになる。
コードジェネレータで生成するときに余計なカンマを許容したほうが便利だからそうなってる。

初期化子の数が配列の大きさに足りない場合は >>913 の解説の通り 0 が補われるので10個の要素全部がゼロになる。
なので全部をゼロにしたいときは char str[10] = {}; というように書いてもよい。
(新しい規格では改定されているが) C では波括弧の中に 1 個以上の値を必要としたので
それに合わせて必ずひとつは 0 を書くというスタイルで書く人もいる。
2023/04/30(日) 19:26:34.51ID:KfqDu01oH
丁寧な解説ありがとうございました。
どちらとも10個ともに0になるんですね
2023/05/01(月) 10:47:39.75ID:X35rXuLL0
STLにある、k番目の要素を見つけるnth_element()は計算量がO(n)だそうですが、
これの中身が何をやっているかの日本語の(できるだけむずかしくない)解説ってどこかに
ありますかね?
2023/05/01(月) 11:27:54.04ID:6GFefuEp0
選択アルゴリズムとかクイックセレクトでググれ
2023/05/01(月) 12:10:58.53ID:58qbKD3W0
GPT-4の説明が分かりやすかった
std::nth_elementの説明として正しいかは分からんが
うまく動きそうではある
GPT-4に知らないことを聞くのはかなり危険だなぁ...
920青木康善 (アウアウウー Sa1b-zK5j)
垢版 |
2023/05/03(水) 13:17:48.41ID:BsTGSOzGa
Javaより断然速いんでしょプラプラは。
921デフォルトの名無しさん (アウアウウー Sa1b-ywfW)
垢版 |
2023/05/03(水) 13:57:16.79ID:0S5RwOvCa
チンチンプラプラ
2023/05/04(木) 05:42:07.54ID:uUOiJSNY0
>>920
C++で書きさえすれば速いとかは幻想
高速化のためのアイディアを考え甲斐があるのがC++
923デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/04(木) 07:42:34.11ID:/cLVFXSd0
状況によってはJavaのほうが速いこともあるね
2023/05/05(金) 11:15:11.08ID:Y+XZO+i30
サブルーチン単位で見たらJavaやC#の方が早いこともあるけどそれはC++側のコードが糞なときだからな
マネージド言語はループ回すにしても強制的に一々長さチェック入ったりするので本気出したC++にはいずれにせよ敵わない
925デフォルトの名無しさん (スプッッ Sd3f-wQ6u)
垢版 |
2023/05/05(金) 11:37:06.46ID:ByZ/Uyt6d
昔、JavaでもC++同等性能出せます(ただしメモリ使用量は10倍)
みたいなネット記事を見たのを思い出したわ
2023/05/05(金) 11:57:14.32ID:tbrjl4OGM
そんなの実際はほぼないだろ
ありうるとしたらC++のコードは最適化がかからないでC#は最適化掛かってsimd使ってましたとかじゃないのか?
2023/05/05(金) 12:23:29.18ID:6VYfhEYJ0
メモリの管理やチェックもしてくれた上で条件によっては C++ を超えることもあるってくらいなら充分以上に速くはあるけどな。
2023/05/05(金) 12:44:08.47ID:Y+XZO+i30
>>926
C#の場合はコードジェネレーターが発達してきてるからC++はprintfで動的フォーマット、C#はprintfをジェネレーターで静的展開みたいなパターンで後者の方が早いという事があり得る
jsonのパースやシリアライズとか特に
2023/05/05(金) 13:09:57.48ID:xFd6jGVP0
そこら辺は自作すればどうとでもなる
930デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 14:28:48.55ID:Ds39Rblr0
x86ターゲットでビルドしたC/C++プログラムをARMでx86エミュレーション実行すると遅い
Java/.NETは中間コードだからランタイムさえARM版になっていれば性能が出せるね
2023/05/05(金) 15:39:52.77ID:kHrmJumu0
それはエミュレータの性能では?
932デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 15:46:51.10ID:Ds39Rblr0
C/C++はコンパイル時に命令が決まるから中間コードよりビルド済バイナリの長期運用では不利になるよね
ソースコードからリビルドできる環境があれば問題ないんだけどさ
2023/05/05(金) 15:52:51.36ID:VDYHFDsH0
ARMをリビルト出来ない環境とは?
934デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 15:55:40.50ID:Ds39Rblr0
環境なんて開発者それぞれでしょ
Macbook使ってるけどx86エミュレーションで動いてるアプリがいくつかあるんだよ
開発者さんがまだM1/M2を持ってなくてARMビルドがリリースできてないんだと思う(もしくは飽きて開発放棄してるのか)
935デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 16:00:19.83ID:Ds39Rblr0
とにかく既存バイナリを異なるCPUアーキテクチャで動かす状況が現実にあるわけ
Macに限らずWindowsでもね
そのような状況では.NETアプリは軽快にどうさするのにC/C++アプリは遅いということになる
2023/05/05(金) 16:10:23.07ID:xFd6jGVP0
めちやくちゃだな
C++の開発環境にハンデ付けたらそうなるわ
937デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 16:16:39.25ID:Ds39Rblr0
Javaや.NETの中間コードにしてCPU命令セットに依存させないアプローチはポータビリティだけでなくランタイムごとの最適化を可能にするメリットがあるの
これC/C++では無理でしょ
2023/05/05(金) 16:22:19.51ID:VDYHFDsH0
ランタイムが対応していない環境ではC++の勝ちだな
2023/05/05(金) 16:47:17.33ID:s0hcsFgN0
C++のスレで「ネイティブなバイナリはエミュレータ上で遅い」って主張して何の意味があるのか?
場違いなこと言ってないか少し考えような
2023/05/05(金) 17:09:02.02ID:alqNdYA9M
>>935
Apple文化ではCPUが変更されるが、Windows/Intel文化ではデスクトップでは
変更されたことが無い。PC/AT互換機はずっとx86系。
2023/05/05(金) 17:10:06.81ID:sSc+RF200
「C++は速い」って盲目的に信じてるキッズの目を覚ます意味がある
942デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 17:10:53.16ID:Ds39Rblr0
ターゲットを限定できる組み込み系開発ならともかく
一般消費者向けのアプリではC/C++が最速とは限らないという話だよ
2023/05/05(金) 17:15:38.26ID:sSc+RF200
仮想化やエミュレーションを何重にも重ねて実行するのが当たり前の現代的コンピューティングでは
「ネイティブで速い」なんて限定的な状況での一つの特長にすぎないんだよね
944デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 17:20:08.41ID:Ds39Rblr0
>>940
マイクロソフトは異なるCPUアーキテクチャに挑戦し続けてきたよ
そもそもNTのマイクロカーネルアプローチは様々なCPUアーキテクチャに対応するためのものだった
Alpha、PowerPC、IA-64で動作するWindowsが過去には存在した
既存のx86バイナリを動かせなかったことから失敗してしまったけどね
今はARM Windowsに挑戦中
これはMac同様にx86エミュレーションで既存バイナリを動かせるようにしてる

アプリ開発者としてターゲット環境を1つに限定すると不利になっていく思うよ
945デフォルトの名無しさん (ワッチョイ 1f4b-zzYQ)
垢版 |
2023/05/05(金) 17:27:05.17ID:CaQRnUAH0
>>942
C言語はUnixをマルチターゲットで実現するするために作られた言語である件について:

プログラム作成にいくら手間がかかっても良いという話なら
#ifdef / #else / #endifの山でマルチターゲットに配慮しつつ高級アセンブラ的に使用したときのC言語が
中間言語実行または中間言語からのJITで巻けるシチュがわからん
説明できるんならkwsk、
946デフォルトの名無しさん (ワッチョイ 1f4b-zzYQ)
垢版 |
2023/05/05(金) 17:31:37.61ID:CaQRnUAH0
そうではなくてプログラム作成の手間も込みの話なら
特定の応用においてErlangがC言語に勝った話は有名な話
https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=12&file_id=1&file_no=1

やが、C言語で書かれたオープンなErlangのVMでそのパフォーマンスをたたき出した場合、
何の言語が勝ったことになるんじゃ……
947デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 17:33:05.29ID:Ds39Rblr0
>>945
それは既に説明したよ
C/C++が想定したターゲットに対して最適なバイナリを出力できるのは事実
でも既存バイナリの長期運用では最適な速度を出せない状況に遭遇することがあるんだ
実際にM1/M2 MacやARM Windowsでそういう状況が生まれてる
948デフォルトの名無しさん (ワッチョイ 1f4b-zzYQ)
垢版 |
2023/05/05(金) 17:38:21.35ID:CaQRnUAH0
>>947
>C/C++が想定したターゲットに対して最適なバイナリを出力できるのは事実
>でも既存バイナリの長期運用では最適な速度を出せない状況に遭遇することがあるんだ
話が矛盾している
既存のVM(これも既存バイナリのうち)がなんで常に最適な速度を出せることになるんdai?
949デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 17:43:37.99ID:Ds39Rblr0
>>948
個々のアプリをリビルドせずにVMだけリビルドすれば済むからエコシステムを維持しやすいの
たしかM1 Macが出てから半年も経たずにARM版JavaVMが登場したと思う
JavaアプリはIntel MacでもM1 Macでも同等の性能が出る
ネイティブアプリは各開発者がARMビルドをリリースするのを待たなければならなかった(まだIntel版しか存在しないアプリも多い)
950デフォルトの名無しさん (ワッチョイ 1f4b-zzYQ)
垢版 |
2023/05/05(金) 17:53:15.49ID:CaQRnUAH0
>>949
>個々のアプリをリビルドせずにVMだけリビルドすれば済むからエコシステムを維持しやすいの
>たしかM1 Macが出てから半年も経たずにARM版JavaVMが登場したと思う
>JavaアプリはIntel MacでもM1 Macでも同等の性能が出る
>ネイティブアプリは各開発者がARMビルドをリリースするのを待たなければならなかった(まだIntel版しか存在しないアプリも多い)
そのネイティブアプリとは一体……
およびそんな特定のケースを言語の優劣の一般論として展開してよい根拠とは一体……
および>>946はどうなるんじゃ……

さらに言うと、VMの改修による新規プラットフォームのトータルサポートが、特定の応用で#ifdef/#else/#endifを何個か追加して
ソースからビルドするより常に早いとする根拠は一体……
951デフォルトの名無しさん (ワッチョイ b79c-+Iiy)
垢版 |
2023/05/05(金) 18:01:52.41ID:Ds39Rblr0
ごめんね
話が噛み合わないようだからこれで最後にする

一般論として言語の優劣を語ってるつもりはないです
ソースコードからのリビルドよりVMが速いとは言ってないです
開発者の事情でリビルドされない既存バイナリで性能が出ない状況が実際にあると言ってるだけです
2023/05/05(金) 18:11:56.10ID:tbrjl4OGM
さっきも書いたけど常にc++の最適化が他の仕組みに勝つとは限らないから
他の言語でsimd化されてc++でsimd化されない場合もあるだろうと
2023/05/05(金) 18:18:32.71ID:gmBJZ0Nwa
データベースでは長期運用でデータ数が変わるから、
統計情報を参考にして、使われるアルゴリズムも変わる

特に、IBM では全自動のみ。
自分で、使うアルゴリズムを指定できない
954デフォルトの名無しさん (ワッチョイ 5701-wHlW)
垢版 |
2023/05/05(金) 18:19:38.90ID:ugKRRbai0
C++はメモリーのフラグメンテーションを解消できないからJavaより遅いというエンジニアの意見は有名だと思う
2023/05/05(金) 20:13:04.57ID:VDYHFDsH0
データベースでは独自のガベージコレクションくらい実装している
2023/05/05(金) 21:20:11.75ID:WL3Heqk40
Java仮想マシンとARM向けx64仮想マシンの比較ですか
2023/05/06(土) 03:05:01.42ID:eTXbn+faM
>>954
フラグメンテーションで遅くなるのは、キャッシュの影響だけ。
ソートだけはキャッシュが乱れまくるので、特殊。
それ以外は、ほとんどの場合は、遅くならない。
2023/05/06(土) 03:08:16.87ID:eTXbn+faM
キャッシュの乱れによる速度低下を防ぎたいなら:
・ソートは本当に必要な場合だけ行なう。
・ソートする場合でも、要素数が少なければ特に問題ない。
 すべてがキャッシュに載ってしまえば、キャッシュミスが起きないから。
・そもそも物理シミュレーターではソートは必要ないことが多い。
 なぜなら自然の物理法則はソートの概念を用いていないから。
・レイトレーシングなども物理法則に基くので、基本的にソートを
 余り使わないでよいアルゴリズムを作ることが出来る。
959デフォルトの名無しさん (ワッチョイ c24b-y4C+)
垢版 |
2023/05/06(土) 03:48:50.75ID:H05Eo8AC0
>開発者の事情でリビルドされない既存バイナリで性能が出ない状況が実際にあると言ってるだけです
そういう話ならそういう話で、
>既存バイナリの長期運用では最適な速度を出せない状況に遭遇することがあるんだ(>>947
と言ったときに、何と何の比較なのか(何なら「最適な」速度なのか)というレギュレーションを先に示して……

ソースコードからリビルドするだけで元より速くなるケースが本当にあるなら、そういうケースの提示をすっとばして
Javaや.NETの中間コードにしてCPU命令セットに依存させないアプローチの話なんてしないで……

一般的な速度比較ではなくて、他の言語でsimd化されてc++でsimd化されない場合の速度比較ならその話だけして……

アスペにill-definedなビミョーなネタ振りをしないで……
960デフォルトの名無しさん (ワッチョイ df01-ouLR)
垢版 |
2023/05/06(土) 03:54:48.32ID:cJf94Ar10
いや俺3行以上は読まないから
961デフォルトの名無しさん (ワッチョイ c24b-y4C+)
垢版 |
2023/05/06(土) 03:55:54.11ID:H05Eo8AC0
補足、

>既存バイナリの長期運用では最適な速度を出せない状況に遭遇することがあるんだ(>>947
と言ったときに、最適な速度をたたき出すブツが発言者の脳内にしか無いのだとしたら
そんなの単なるお気持ちの表明やんけ……

自分は最初から正しい論理展開をしていたみたいな顔するのはやめて……
962デフォルトの名無しさん (ワッチョイ df01-ouLR)
垢版 |
2023/05/06(土) 03:57:28.42ID:cJf94Ar10
あと2行削れば読んでやるよ
2023/05/06(土) 07:33:39.33ID:ZJYG9vPbd
それも度が過ぎとるな
964デフォルトの名無しさん (ブーイモ MM0e-wpjJ)
垢版 |
2023/05/06(土) 08:23:03.54ID:1oIUqUCFM
>>961
はじめから「中間コード」と「ビルド済バイナリの長期運用」って書いてあるぞ?
965デフォルトの名無しさん (ブーイモ MM0e-wpjJ)
垢版 |
2023/05/06(土) 08:31:13.11ID:1oIUqUCFM
俺は産業用システムのフロントエンドUIをC#で組むことが多いんだが、とあるデバイスの制御APIがネイティブDLL(.NETアセンブリではない)で提供されていたんだ
そのデバイスメーカーはなぜか32ビット版のDLLしか提供してくれなかった
それでC#プログラムも32ビット版.NETランタイムで動かさなきゃならなくなった

C++が速いとかどうでもいいけどさ、せめて64ビットビルドできるようになってから言ってくれないかな?
2023/05/06(土) 09:34:57.34ID:UeJlmTL80
C++が速いとか関係なく、そのデバイスメーカーに言え
2023/05/06(土) 09:50:15.65ID:ZqhRZXgdM
64ビット版.NETランタイムから32ビットDLL使う方法あるでしょ
NeeViewがそういうことしてる
2023/05/06(土) 10:15:28.65ID:SIOBPdzxM
最近のc++プログラマってプロセス間通信も知らないの?
2023/05/06(土) 11:51:45.90ID:P9lpeDx50
NeeViewもSusieプラグイン用の32bitプロセス起動してプロセス間通信してるだけやで
2023/05/06(土) 12:09:15.03ID:avN3CO0q0
もうC++の話しじゃねーじゃん
2023/05/06(土) 14:00:34.30ID:O4KUwdol0
比較と称して対立煽りすればスレの勢いが伸びる
ただし意味のある議論はほぼ発生しない

技術板にアイデンティティを勝手に感じている技術力ゼロの雑魚だけがこういう話を振り、乗っかる
2023/05/06(土) 16:35:41.29ID:OFKQ7dHId
ない環境の仕事が長くなってさわりしか覚えてないな
2023/05/07(日) 12:16:32.15ID:ExrtxK200
>>964
>はじめから「中間コード」と「ビルド済バイナリの長期運用」って書いてあるぞ?
同じアプリの*実在する*中間コード版と
*実在する*長期運用されたビルド済バイナリとで比較しているのかっていうか、
その根拠こそ求められる
>>964はふいんきに飲まれて詐欺に遭いやすいタイプなのではないか……
974デフォルトの名無しさん (ワッチョイ 639c-wpjJ)
垢版 |
2023/05/07(日) 13:31:09.45ID:Hp3D+to80
同じアプリである必要あるか?
2023/05/07(日) 18:18:18.80ID:ExrtxK200
>同じアプリである必要あるか?
ある
「中間コード」と「ビルド済バイナリの長期運用」の速度を比較しようとしているのだから、
それらの違い以外は同じに保たねば正しい比較にならない
976デフォルトの名無しさん (ワッチョイ df01-ouLR)
垢版 |
2023/05/07(日) 18:20:17.74ID:+pQ1lZnP0
0xの頃のように混とんとしてきたが、あの頃の熱さはないな
977デフォルトの名無しさん (ワッチョイ df01-ouLR)
垢版 |
2023/05/07(日) 18:21:16.14ID:+pQ1lZnP0
C++20で飯の三杯くらいは食えると思うが
2023/05/08(月) 12:43:08.47ID:pyo/bzDB0
昔Windows上でJavaがエラー吐いたとき
VCのエラーを出力してたから
裏ではC++使ってるんだろ
つまりJavaもC++のパワー借りてんだから
C++のほうが速いって話にならない?
2023/05/08(月) 13:06:18.19ID:6qkGyJAY0
>>978
ならない。
980デフォルトの名無しさん (ワッチョイ df01-ouLR)
垢版 |
2023/05/08(月) 18:41:34.65ID:A57Tkf070
C++はエンジン、Javaはターボという関係では?
2023/05/08(月) 20:29:15.27ID:COjnYNf80
JavaってAVXとかNEONとか使えるの?
982デフォルトの名無しさん (ワッチョイ 639c-wpjJ)
垢版 |
2023/05/08(月) 21:28:12.53ID:DEBLNIPs0
JavaでもAVX等の拡張命令は使われるみたいよ
https://www.slideshare.net/nttdata-tech/java-maximize-cpu-2019-nttdata-suenaga
2023/05/09(火) 01:01:11.52ID:y3l/xMzR0
命令を記述出来るかってこと
AVXやNEONはコンパイラじゃ性能出ない
984デフォルトの名無しさん (ワッチョイ 639c-wpjJ)
垢版 |
2023/05/09(火) 01:14:10.24ID:A/U8BALn0
あー 自分で書きたいのか
Javaの場合はJEP417 Vector APIでAVX命令を扱えるよ
2023/05/09(火) 07:03:13.01ID:1INpcxJUd
つstd::valarray
2023/05/09(火) 07:36:45.97ID:y3l/xMzR0
>>894 >>895
自分で書けなきゃ性能出ないって言ってるのに
例えばvpshufbなんかコンパイラが使わんでしょ

Javaは遅いっていう流れで書いたわけで
987デフォルトの名無しさん (ワッチョイ 639c-wpjJ)
垢版 |
2023/05/09(火) 09:28:23.14ID:A/U8BALn0
???
JavaのVector APIはSIMDを扱うために新たに策定されたもの
C++の動的配列std::vectorとはまったくの別物よ?
2023/05/09(火) 12:20:03.88ID:Ac7S+28Ld
ごく一部の命令をごく一部の処理で使えたってダメだよ
1000個以上も命令あるんだし

コンパイラが使いこなせなそうな命令の具体例を上げてるのに

CやC++ならいろんな方法で使えるわけで
・ライブラリ経由
・Intrinsics
・インラインアセンブラ
・アセンブラ
2023/05/09(火) 12:24:30.62ID:oJhOeTc40
また無意味な比較合戦が始まった
990デフォルトの名無しさん (ワッチョイ df01-ouLR)
垢版 |
2023/05/10(水) 05:01:02.91ID:w0EnrJsq0
>>986
Javaはかなり速いのでは?
2023/05/10(水) 10:09:03.15ID:ZeVzc+se0
意味の無い比較じゃなくて
目的に対して適切な言語を使うのが大事だよな

ところでrustはc++より速いの?
2023/05/10(水) 10:20:22.13ID:EQN2Q+xhd
速いけど早くない
あとつらい
2023/05/10(水) 10:43:52.47ID:Fy7GG/DG0
>>991
煽りよるwww

>>992
C++ の一番のつらさはいつの間にか未定義を踏み抜いていることなので
そういうのでとけていく時間と天秤にかけたら結果的に Rust のほうが「早い」こともある。
2023/05/10(水) 16:25:34.12ID:/njob5Qxd
処理系定義や未規定を未定義と誤認するやつ
理由がコンパイラに警告されたからとか
笑っちまうよな
2023/05/12(金) 00:22:08.92ID:AXk6Vn1nM
未定義踏みぬくなんて高度なことをやってるんだなと書きながら
単純化すると
cout < i++ < i++ < i++;
みたいなコードを書いている
2023/05/12(金) 00:35:46.20ID:AXk6Vn1nM
うーん酔ってるな
<< << <<
おわかりいただけだろうか?
2023/05/12(金) 12:44:21.56ID:AudFgWb9M
C++相談室 part164
http://mevius.5ch.net/test/read.cgi/tech/1683600652/
2023/05/12(金) 18:01:57.78ID:6OZpLVgk0
>>997
2023/05/12(金) 18:02:15.57ID:6OZpLVgk0
2023/05/12(金) 18:03:13.12ID:8/ssS+jd0
質問いいですか?
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 132日 18時間 46分 42秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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